gsxdsm
c6be0b158b
FN-8129: centralize database backup settings
...
Move database backup policy and scheduling to shared global configuration.
- Split project memory backups from cluster-wide database backup settings.
- Migrate legacy backup values and routines safely into central global storage.
- Schedule and dispatch one shared PostgreSQL backup routine across project engines.
Files changed:
.changeset/fn-8129-backup-settings-scope-split.md | 7 +
docs/dashboard-guide.md | 2 +
docs/settings-reference.md | 10 +-
packages/cli/src/commands/backup.ts | 3 +-
.../__tests__/backup-settings-migration.test.ts | 50 ++++++
.../src/__tests__/backup-settings-scope.test.ts | 27 +++
packages/core/src/backup-settings-migration.ts | 188 +++++++++++++++++++++
packages/core/src/backup.ts | 77 +++++----
packages/core/src/global-routine-store.ts | 104 ++++++++++++
packages/core/src/index.gate.ts | 6 +-
packages/core/src/index.ts | 6 +-
.../core/src/postgres/migrations/0000_initial.sql | 19 +++
.../postgres/migrations/0015_global_routines.sql | 19 +++
packages/core/src/postgres/schema-applier.ts | 19 ++-
packages/core/src/postgres/schema/central.ts | 21 ++-
packages/core/src/postgres/startup-factory.ts | 11 ++
packages/core/src/settings-schema.ts | 14 +-
packages/core/src/types.ts | 31 +++-
.../dashboard/app/components/SettingsModal.tsx | 10 +-
.../settings/__tests__/section-keys.test.ts | 1 +
.../app/components/settings/save-split.ts | 2 +
.../search/__tests__/settings-search-index.test.ts | 1 +
.../settings/search/entries.ts | 2 +
.../app/components/settings/section-keys.ts | 4 -
.../settings/sections/BackupsSection.search.ts | 40 -----
.../settings/sections/BackupsSection.tsx | 112 +-----------
.../sections/DatabaseBackupsSection.search.ts | 51 ++++++
.../settings/sections/DatabaseBackupsSection.tsx | 142 ++++++++++++++++
.../settings-default-descriptions.test.tsx | 1 +
packages/dashboard/src/routes.ts | 12 +-
.../src/routes/register-settings-memory-routes.ts | 41 ++---
.../engine/src/__tests__/routine-scheduler.test.ts | 55 +++++-
packages/engine/src/cron-runner.ts | 4 +-
packages/engine/src/routine-runner.ts | 67 +++++---
packages/engine/src/routine-scheduler.ts | 35 +++-
35 files changed, 929 insertions(+), 265 deletions(-)
Fusion-Task-Id: FN-8129
Fusion-Task-Lineage: af17f39a-7f1c-40ff-8a4a-cd63895cd532
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-07-16 16:34:09 -07:00
gsxdsm
ba1e82381e
fix(FN-7952): cut runtime services over to PostgreSQL ( #2109 )
...
## Summary
Engine and dashboard traffic now stays on the authoritative PostgreSQL
layer across execution, recovery, project discovery, planning sessions,
analytics, and shutdown. The dashboard no longer presents a migration
notice for a cutover that is already mandatory.
## Design decisions
- Runtime composition requires an async data layer instead of
constructing a hidden SQLite fallback.
- Engine workflow, mission, claim, and self-healing reads await their
PostgreSQL-backed store contracts.
- Project-scoped dashboard stores retain and close their backend owner
exactly once.
- The dashboard test quarantine entry remains paired with its Vitest
exclusion, preserving the repository’s deletion-ratchet policy.
## Validation
- Core, Engine, Dashboard, CLI, and Desktop typechecks pass on the
stacked branch.
- `pnpm test:gate` passes all 478 gate tests.
- This PR changes 62 files.
## Stack
- Depends on #2108 .
- CLI/desktop/ops, plugins, and docs/release follow in later PRs.
Related: #2105
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **New Features**
* Project discovery now recognizes projects using the
`.fusion/project.json` marker.
* Knowledge indexing and search are more reliable across project-scoped
storage.
* **Bug Fixes**
* Improved session, audit timeline, approval, monitoring, and analytics
data consistency.
* Prevented stale planning-session updates and project-store shutdown
races.
* Ensured chat usage and CLI session status are saved before continuing.
* **UI Changes**
* Removed the storage migration notice banner now that the PostgreSQL
transition is complete.
* **Reliability**
* Improved shutdown handling, workflow execution, and worktree behavior.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-14 22:16:16 -07:00
gsxdsm
9f8db7d1b5
FN-7903: wire thinkingLevel into AI session creation for automation steps
...
Threads the persisted per-step Thinking Level (from FN-7900) into runtime AI session creation and task spawning, so scheduled, routine, and manual automation runs actually apply the chosen reasoning effort instead of only storing it.
- CronRunner passes step.thinkingLevel through AiPromptExecutor to createFnAgent's defaultThinkingLevel for scheduled AI-prompt steps
- RoutineRunner forwards step.thinkingLevel to the shared AiPromptExecutor seam for routine AI-prompt steps
- Cron/routine create-task steps map step.thinkingLevel onto TaskCreateInput.thinkingLevel so spawned tasks inherit the configured reasoning effort
- Dashboard's inline/manual AI-prompt and create-task automation routes apply the same defaultThinkingLevel / TaskCreateInput.thinkingLevel behavior
- Updated docs (dashboard-guide.md, settings-reference.md) to describe the now-active runtime behavior
- Added a changeset for @runfusion/fusion (minor) and expanded cron-runner/routine-runner/routes-automation test coverage
Files changed:
.changeset/fn-7903-automation-thinking-level.md | 7 ++
docs/dashboard-guide.md | 5 +-
docs/settings-reference.md | 2 +-
.../src/__tests__/routes-automation.test.ts | 67 +++++++++++++++++++
packages/dashboard/src/routes.ts | 10 +++
packages/engine/src/__tests__/cron-runner.test.ts | 75 +++++++++++++++++++++-
.../engine/src/__tests__/routine-runner.test.ts | 68 +++++++++++++++++++-
packages/engine/src/cron-runner.ts | 21 +++++-
packages/engine/src/routine-runner.ts | 11 +++-
9 files changed, 255 insertions(+), 11 deletions(-)
Fusion-Task-Id: FN-7903
Fusion-Task-Lineage: c7eb4660-975d-4c5d-820e-0f1a3ac8b6a6
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-07-12 20:09:57 -07:00
gsxdsm
ee3a06ecfd
FN-7095: add actionable backup failure details
...
Database Backup automation failures now expose the affected database, paths, and root cause.
- Add DB-qualified error formatting for project and central backup creation, verification, schedule validation, and command failures.
- Normalize routine and cron in-process backup failures so empty or opaque errors become actionable AutomationRunResult errors.
- Cover missing database files, backup directory failures, central copy failures, corrupt backup quarantine, and runner normalization with regression tests.
- Document backup failure detail behavior and add a patch changeset.
Files changed:
.changeset/fn-7095-backup-detail.md | 7 ++
docs/storage.md | 2 +
packages/core/src/__tests__/backup.test.ts | 114 ++++++++++++++++++++-
packages/core/src/backup.ts | 112 +++++++++++++++-----
packages/engine/src/__tests__/cron-runner.test.ts | 35 +++++++
.../engine/src/__tests__/routine-runner.test.ts | 45 ++++++++-
packages/engine/src/cron-runner.ts | 20 +++-
packages/engine/src/routine-runner.ts | 20 +++-
8 files changed, 324 insertions(+), 31 deletions(-)
Fusion-Task-Id: FN-7095
Fusion-Task-Lineage: 368e3edf-20d3-4756-97be-75734dbff703
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-06-27 09:28:29 -07:00
gsxdsm
8131d541ca
FN-7038: add live automation run output
...
Add configurable automation tool access with live manual-run streaming for schedules and routines.
- Add an automation tool allowlist model and dashboard selectors for AI prompt steps.
- Stream manual automation and routine run progress, output, step updates, and tool events over SSE.
- Surface live run transcripts in automation/routine cards and document the operator workflow.
- Cover validation, runner callbacks, API streaming, and UI behavior with targeted tests.
Files changed:
.changeset/fn-7038-automation-tools-live-output.md | 7 +
docs/dashboard-guide.md | 9 +
packages/core/src/__tests__/automation.test.ts | 27 +-
packages/core/src/automation.ts | 18 +
packages/core/src/index.ts | 4 +-
packages/core/src/types.ts | 6 +
packages/dashboard/app/api/legacy.ts | 48 +++
packages/dashboard/app/components/RoutineCard.tsx | 16 +-
packages/dashboard/app/components/ScheduleForm.tsx | 53 ++-
.../app/components/ScheduleStepsEditor.tsx | 49 ++-
.../app/components/ScheduledTasksModal.tsx | 72 +++-
packages/dashboard/app/components/ScriptsModal.css | 79 ++++
.../app/components/__tests__/RoutineCard.test.tsx | 45 +++
.../app/components/__tests__/ScheduleForm.test.tsx | 100 +++++-
.../__tests__/ScheduleStepsEditor.test.tsx | 67 +++-
.../__tests__/ScheduledTasksModal.test.tsx | 36 +-
.../src/__tests__/routes-automation.test.ts | 151 +++++++-
packages/dashboard/src/routes.ts | 400 ++++++++++++++++++++-
packages/dashboard/src/server.ts | 7 +-
packages/engine/src/__tests__/cron-runner.test.ts | 56 ++-
.../src/__tests__/pi-create-fn-agent.test.ts | 44 +++
.../engine/src/__tests__/routine-runner.test.ts | 28 ++
packages/engine/src/cron-runner.ts | 20 +-
packages/engine/src/pi.ts | 32 +-
packages/engine/src/routine-runner.ts | 39 +-
packages/i18n/locales/en/app.json | 9 +
packages/i18n/src/resources.d.ts | 21 ++
27 files changed, 1374 insertions(+), 69 deletions(-)
Fusion-Task-Id: FN-7038
Fusion-Task-Lineage: 7f5871d0-1de0-4d22-a9c9-ee9418658677
2026-06-26 02:45:29 -07:00
Fusion (runfusion.ai)
423041a14a
test(FN-4689): complete Step 2 — add routine sandbox audit tests
...
Fusion-Task-Id: FN-4689
Fusion-Task-Lineage: 3b856c6f-27b2-4a1c-bd6e-41e716bffd4d
2026-05-15 16:38:45 -07:00
Fusion (runfusion.ai)
2fc8d6d3fa
feat(FN-4689): complete Step 1 — thread routine auditor
...
Fusion-Task-Id: FN-4689
Fusion-Task-Lineage: 3b856c6f-27b2-4a1c-bd6e-41e716bffd4d
2026-05-15 16:38:44 -07:00
Fusion (runfusion.ai)
e4769ea889
feat(FN-4640): wire sandbox auditor through executor and merger
...
Fusion-Task-Id: FN-4640
Fusion-Task-Lineage: 4a91265f-1714-4854-b08d-7ddb06074253
2026-05-15 16:19:42 -07:00
Fusion
5d3409a9da
test(FN-4636): complete Step 5 — add sandbox wiring integration coverage
...
Fusion-Task-Id: FN-4636
Fusion-Task-Lineage: 38ff2f48-4cb1-42c2-8f64-eb3b8d3d7f2c
2026-05-15 10:24:01 -07:00
Fusion
3c595ce223
feat(FN-4636): complete Step 4 — wire command runners through sandbox backend
...
Fusion-Task-Id: FN-4636
Fusion-Task-Lineage: 38ff2f48-4cb1-42c2-8f64-eb3b8d3d7f2c
2026-05-15 10:24:01 -07:00
Fusion
ff20e9f337
feat(FN-3891): document memory backup settings in settings reference
...
Documents the memory backup feature in the settings reference and adds a changeset to prepare for publishing.
Fusion-Task-Id: FN-3891
2026-05-09 14:41:58 -07:00
gsxdsm
511d11ce72
fix(FN-XXXX): run auto-backup in-process to stop nested .fusion creation
...
The backup automation was scheduled with `npx runfusion.ai backup --create`, which spawns whatever fusion binary is on PATH. On developer machines that's usually an older globally-installed runfusion.ai (v0.13.0 at time of writing) which still carries the pluginStore-rootDir bug — every backup tick recreated `<project>/.fusion/.fusion/` with a fresh empty TaskStore.
Cron-runner and routine-runner now intercept any command matching `fn backup`, `fusion backup`, or `npx runfusion.ai backup` and call `runBackupCommand` directly via the engine's open TaskStore. The interception also handles existing schedules persisted with the old npx command, so users do not need to manually update their automation rows.
The default command for newly created backup schedules is also simplified to `fn backup --create` — both forms route through the same in-process executor.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-01 22:38:37 -07:00
Fusion
b0cda2398b
feat(FN-2923): merge fusion/fn-2923
...
- Add task `source` provenance field tracking how tasks enter the system (e.g. `"manual"`, `"heartbeat"`, `"executor"`, `"triage"`, `"cron"`, `"routine"`)
- Wire `source` into shared create-task tools, executor agent, triage agent, cron runner, and routine runner
- Add `source` to heartbeat task creation in `agent-heartbeat.ts` and mission execution loop in `mission-execution-loop.ts`
- Wire `source` field into dashboard routes (`register-planning-subtask-routes.ts`, `register-task-workflow-routes.ts`) and GitHub integration (`register-git-github.ts`)
- Add `source` to the API layer and task store handlers in the dashboard
- Expose `source` in the `fn` CLI task command and `task-plan` extension tool
- Add integration tests for provenance across engine (agent-tools, agent-heartbeat, cron-runner, triage, pr-comment-handler) and dashboard routes
- Update existing tests to assert the correct source values
- Bulk-revert stale changeset files that were superseded by the v0.9.1 release commit
Commits merged:
- test(FN-2923): complete Step 14 — align tests with task source provenance
- test(FN-2923): complete Steps 12-13 — update and add provenance tests
- feat(FN-2923): complete Step 10 — wire CLI task provenance
- feat(FN-2923): complete Step 9 — wire dashboard UI and API source fields
- feat(FN-2923): complete Step 8 — wire dashboard route provenance
- feat(FN-2923): complete Step 7 — wire remaining engine provenance
- feat(FN-2923): complete Step 6 — add routine create-task provenance
- feat(FN-2923): complete Step 5 — add cron create-task provenance
- feat(FN-2923): complete Step 4 — add triage subtask source
- feat(FN-2923): complete Step 3 — add executor create-task source
- feat(FN-2923): complete Step 2 — add heartbeat task provenance
- feat(FN-2923): complete Step 1 — add provenance to shared create-task tools
- feat(FN-2945): merge fusion/fn-2945
- chore(release): v0.9.1
Files changed:
.changeset/active-agents-no-stuck-connecting.md | 13 ---
.changeset/active-agents-panel-hoist-heartbeat.md | 13 ---
.changeset/fix-agent-heartbeat-terminal-links.md | 5 --
.changeset/fix-experimental-defaults.md | 5 --
.changeset/improve-git-manager-diff-pane.md | 5 --
.changeset/insights-two-pane-layout.md | 5 --
.changeset/show-planning-tasks-immediately.md | 5 --
CHANGELOG.md | 92 ++++++++++++++++++++++
package.json | 2 +-
packages/cli-alias/CHANGELOG.md | 15 ++++
packages/cli-alias/package.json | 2 +-
packages/cli/CHANGELOG.md | 12 +++
packages/cli/package.json | 2 +-
packages/cli/src/__tests__/task-plan.test.ts | 1 +
packages/cli/src/commands/__tests__/task.test.ts | 15 +++-
packages/cli/src/commands/task.ts | 15 +++-
packages/cli/src/extension.ts | 9 +++
packages/core/CHANGELOG.md | 7 ++
packages/core/package.json | 2 +-
packages/dashboard/CHANGELOG.md | 14 ++++
.../app/__tests__/agent-css-classes.test.ts | 3 +-
packages/dashboard/app/__tests__/api.test.ts | 13 +++
packages/dashboard/app/api/legacy.ts | 2 +
packages/dashboard/app/components/AgentsView.css | 22 +++---
.../app/components/ModelOnboardingModal.tsx | 5 +-
packages/dashboard/app/components/TodoView.tsx | 2 +
.../__tests__/ModelOnboardingModal.test.tsx | 4 +-
.../app/components/__tests__/QuickChatFAB.test.tsx | 14 +---
.../app/components/__tests__/TodoView.test.tsx | 4 +-
.../__tests__/agents-view-mobile.test.tsx | 5 +-
.../components/__tests__/onboarding-flow.test.tsx | 2 +-
.../app/hooks/__tests__/useTaskHandlers.test.ts | 4 +-
packages/dashboard/app/hooks/useTaskHandlers.ts | 4 +-
packages/dashboard/package.json | 2 +-
packages/dashboard/src/__tests__/routes.test.ts | 14 ++++
packages/dashboard/src/routes.ts | 4 +
.../dashboard/src/routes/register-git-github.ts | 12 +++
.../src/routes/register-planning-subtask-routes.ts | 3 +
.../src/routes/register-task-workflow-routes.ts | 7 ++
packages/desktop/CHANGELOG.md | 7 ++
packages/desktop/package.json | 2 +-
packages/engine/CHANGELOG.md | 11 +++
packages/engine/package.json | 2 +-
.../engine/src/__tests__/agent-heartbeat.test.ts | 10 +++
.../src/__tests__/agent-tools-delegation.test.ts | 2 +
packages/engine/src/__tests__/agent-tools.test.ts | 37 +++++++++
packages/engine/src/__tests__/cron-runner.test.ts | 4 +
.../src/__tests__/pr-comment-handler.test.ts | 8 ++
packages/engine/src/__tests__/triage.test.ts | 2 +
packages/engine/src/agent-heartbeat.ts | 13 ++-
packages/engine/src/agent-tools.ts | 13 ++-
packages/engine/src/cron-runner.ts | 7 +-
packages/engine/src/executor.ts | 2 +-
packages/engine/src/mission-execution-loop.ts | 8 ++
packages/engine/src/pr-comment-handler.ts | 5 ++
packages/engine/src/project-engine.ts | 8 ++
packages/engine/src/routine-runner.ts | 4 +
packages/engine/src/triage.ts | 4 +
packages/mobile/CHANGELOG.md | 7 ++
packages/mobile/package.json | 2 +-
packages/pi-claude-cli/CHANGELOG.md | 7 ++
packages/pi-claude-cli/package.json | 2 +-
packages/plugin-sdk/CHANGELOG.md | 10 +++
packages/plugin-sdk/package.json | 2 +-
.../examples/fusion-plugin-auto-label/CHANGELOG.md | 8 ++
.../examples/fusion-plugin-auto-label/package.json | 2 +-
.../examples/fusion-plugin-ci-status/CHANGELOG.md | 8 ++
.../examples/fusion-plugin-ci-status/package.json | 2 +-
.../fusion-plugin-notification/CHANGELOG.md | 8 ++
.../fusion-plugin-notification/package.json | 2 +-
.../fusion-plugin-settings-demo/CHANGELOG.md | 8 ++
.../fusion-plugin-settings-demo/package.json | 2 +-
plugins/fusion-plugin-hermes-runtime/CHANGELOG.md | 8 ++
plugins/fusion-plugin-hermes-runtime/package.json | 2 +-
.../fusion-plugin-openclaw-runtime/CHANGELOG.md | 8 ++
.../fusion-plugin-openclaw-runtime/package.json | 2 +-
.../fusion-plugin-paperclip-runtime/CHANGELOG.md | 8 ++
.../fusion-plugin-paperclip-runtime/package.json | 2 +-
78 files changed, 499 insertions(+), 115 deletions(-)
Fusion-Task-Id: FN-2923
2026-04-29 17:23:22 -07:00
Fusion
db95f77d7b
feat(FN-2689): standardize cross-platform shell selection
...
- Add engine shell utility to resolve the correct shell per platform
- Update routine runner to execute commands through shared shell selection
- Update cron runner to use the same cross-platform shell behavior
- Apply shared shell handling in dashboard routes for command execution
- Add shell utility tests covering platform-specific selection behavior
2026-04-27 08:33:03 -07:00
gsxdsm
3fbb7c47cf
refactor: eliminate ~400 no-explicit-any warnings across the workspace
...
Parallel subagent pass: four typescript-pro agents on non-overlapping scopes.
Patterns applied:
- catch (err: any) { ... err.message ... } → catch (err) { ... getErrorMessage(err) ... }
using the new @fusion/core helper. Bare catch {} where the error was unused.
- SQLite row types: defined typed XxxRow interfaces per table and cast
.all()/.get() results via `as unknown as XxxRow[]` (the double cast is
required because better-sqlite3 returns Record<string, SQLOutputValue>).
- rowToX(row: any) converters: typed argument with the matching row interface.
- Dynamic settings key writes: (settings as Record<string, unknown>)[key].
- React event handlers and setState callbacks: inferred types or concrete
React.{Mouse,Change,Form}Event<...> where needed.
- pi-claude-cli: local PiMessage / PiContext duck types to avoid re-typing
pi-ai concrete shapes; typed Claude stream event message fields.
72 files changed, ~400 anys eliminated. Typecheck passes across the workspace.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-23 23:02:36 -07:00
gsxdsm
bab9761591
fix(FN-1952): recover routines schedules merge
2026-04-16 23:07:40 -07:00
gsxdsm
15b27253b4
feat(FN-1269): complete routine engine integration with RoutineRunner and RoutineScheduler
...
- Add RoutineRunner class for routine execution via heartbeat system
- Add RoutineScheduler class for cron-based routine polling
- Add triggerManual and triggerWebhook methods for API and webhook triggers
- Wire RoutineScheduler into InProcessRuntime lifecycle
- Add routine trigger and webhook API endpoints
- Fix type mismatches between PROMPT and actual FN-1519 types
2026-04-10 12:11:55 -07:00
gsxdsm
d8d961c800
fix: align routine system with actual RoutineStore/Routine APIs to prevent CLI crash
...
The RoutineRunner and RoutineScheduler were written against a different
interface than what RoutineStore actually implements, causing TypeError
crashes as soon as any routine became due. This adds the missing
agentId/catchUpLimit fields to the Routine type and DB schema, adds
startRoutineExecution/completeRoutineExecution/cancelRoutineExecution
methods to RoutineStore, and fixes all property name mismatches
(lastExecutedAt→lastRunAt, trigger.cron→trigger.cronExpression,
policy value alignment) in the runner, scheduler, and tests.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-04-10 11:26:19 -07:00