@synergenius/flow-weaver-pack-weaver 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +204 -0
- package/README.md +167 -0
- package/dist/bot/agent-provider.d.ts +34 -0
- package/dist/bot/agent-provider.d.ts.map +1 -0
- package/dist/bot/agent-provider.js +218 -0
- package/dist/bot/agent-provider.js.map +1 -0
- package/dist/bot/ai-client.d.ts +15 -0
- package/dist/bot/ai-client.d.ts.map +1 -0
- package/dist/bot/ai-client.js +128 -0
- package/dist/bot/ai-client.js.map +1 -0
- package/dist/bot/approvals.d.ts +22 -0
- package/dist/bot/approvals.d.ts.map +1 -0
- package/dist/bot/approvals.js +187 -0
- package/dist/bot/approvals.js.map +1 -0
- package/dist/bot/audit-logger.d.ts +5 -0
- package/dist/bot/audit-logger.d.ts.map +1 -0
- package/dist/bot/audit-logger.js +42 -0
- package/dist/bot/audit-logger.js.map +1 -0
- package/dist/bot/audit-store.d.ts +13 -0
- package/dist/bot/audit-store.d.ts.map +1 -0
- package/dist/bot/audit-store.js +59 -0
- package/dist/bot/audit-store.js.map +1 -0
- package/dist/bot/bot-agent-channel.d.ts +46 -0
- package/dist/bot/bot-agent-channel.d.ts.map +1 -0
- package/dist/bot/bot-agent-channel.js +58 -0
- package/dist/bot/bot-agent-channel.js.map +1 -0
- package/dist/bot/cli-provider.d.ts +29 -0
- package/dist/bot/cli-provider.d.ts.map +1 -0
- package/dist/bot/cli-provider.js +132 -0
- package/dist/bot/cli-provider.js.map +1 -0
- package/dist/bot/cli-stream-parser.d.ts +11 -0
- package/dist/bot/cli-stream-parser.d.ts.map +1 -0
- package/dist/bot/cli-stream-parser.js +53 -0
- package/dist/bot/cli-stream-parser.js.map +1 -0
- package/dist/bot/cost-store.d.ts +18 -0
- package/dist/bot/cost-store.d.ts.map +1 -0
- package/dist/bot/cost-store.js +81 -0
- package/dist/bot/cost-store.js.map +1 -0
- package/dist/bot/cost-tracker.d.ts +18 -0
- package/dist/bot/cost-tracker.d.ts.map +1 -0
- package/dist/bot/cost-tracker.js +60 -0
- package/dist/bot/cost-tracker.js.map +1 -0
- package/dist/bot/cron-parser.d.ts +5 -0
- package/dist/bot/cron-parser.d.ts.map +1 -0
- package/dist/bot/cron-parser.js +141 -0
- package/dist/bot/cron-parser.js.map +1 -0
- package/dist/bot/cron-scheduler.d.ts +12 -0
- package/dist/bot/cron-scheduler.d.ts.map +1 -0
- package/dist/bot/cron-scheduler.js +43 -0
- package/dist/bot/cron-scheduler.js.map +1 -0
- package/dist/bot/dashboard.d.ts +34 -0
- package/dist/bot/dashboard.d.ts.map +1 -0
- package/dist/bot/dashboard.js +602 -0
- package/dist/bot/dashboard.js.map +1 -0
- package/dist/bot/design-checker.d.ts +24 -0
- package/dist/bot/design-checker.d.ts.map +1 -0
- package/dist/bot/design-checker.js +269 -0
- package/dist/bot/design-checker.js.map +1 -0
- package/dist/bot/file-lock.d.ts +7 -0
- package/dist/bot/file-lock.d.ts.map +1 -0
- package/dist/bot/file-lock.js +64 -0
- package/dist/bot/file-lock.js.map +1 -0
- package/dist/bot/file-validator.d.ts +10 -0
- package/dist/bot/file-validator.d.ts.map +1 -0
- package/dist/bot/file-validator.js +27 -0
- package/dist/bot/file-validator.js.map +1 -0
- package/dist/bot/file-watcher.d.ts +24 -0
- package/dist/bot/file-watcher.d.ts.map +1 -0
- package/dist/bot/file-watcher.js +98 -0
- package/dist/bot/file-watcher.js.map +1 -0
- package/dist/bot/fw-api.d.ts +8 -0
- package/dist/bot/fw-api.d.ts.map +1 -0
- package/dist/bot/fw-api.js +12 -0
- package/dist/bot/fw-api.js.map +1 -0
- package/dist/bot/genesis-prompt-context.d.ts +31 -0
- package/dist/bot/genesis-prompt-context.d.ts.map +1 -0
- package/dist/bot/genesis-prompt-context.js +121 -0
- package/dist/bot/genesis-prompt-context.js.map +1 -0
- package/dist/bot/genesis-store.d.ts +28 -0
- package/dist/bot/genesis-store.d.ts.map +1 -0
- package/dist/bot/genesis-store.js +154 -0
- package/dist/bot/genesis-store.js.map +1 -0
- package/dist/bot/index.d.ts +38 -0
- package/dist/bot/index.d.ts.map +1 -0
- package/dist/bot/index.js +37 -0
- package/dist/bot/index.js.map +1 -0
- package/dist/bot/notifications.d.ts +20 -0
- package/dist/bot/notifications.d.ts.map +1 -0
- package/dist/bot/notifications.js +215 -0
- package/dist/bot/notifications.js.map +1 -0
- package/dist/bot/pipeline-runner.d.ts +22 -0
- package/dist/bot/pipeline-runner.d.ts.map +1 -0
- package/dist/bot/pipeline-runner.js +263 -0
- package/dist/bot/pipeline-runner.js.map +1 -0
- package/dist/bot/provider-registry.d.ts +26 -0
- package/dist/bot/provider-registry.d.ts.map +1 -0
- package/dist/bot/provider-registry.js +175 -0
- package/dist/bot/provider-registry.js.map +1 -0
- package/dist/bot/run-store.d.ts +25 -0
- package/dist/bot/run-store.d.ts.map +1 -0
- package/dist/bot/run-store.js +156 -0
- package/dist/bot/run-store.js.map +1 -0
- package/dist/bot/runner.d.ts +13 -0
- package/dist/bot/runner.d.ts.map +1 -0
- package/dist/bot/runner.js +244 -0
- package/dist/bot/runner.js.map +1 -0
- package/dist/bot/session-state.d.ts +19 -0
- package/dist/bot/session-state.d.ts.map +1 -0
- package/dist/bot/session-state.js +65 -0
- package/dist/bot/session-state.js.map +1 -0
- package/dist/bot/steering.d.ts +13 -0
- package/dist/bot/steering.d.ts.map +1 -0
- package/dist/bot/steering.js +40 -0
- package/dist/bot/steering.js.map +1 -0
- package/dist/bot/step-executor.d.ts +10 -0
- package/dist/bot/step-executor.d.ts.map +1 -0
- package/dist/bot/step-executor.js +30 -0
- package/dist/bot/step-executor.js.map +1 -0
- package/dist/bot/system-prompt.d.ts +19 -0
- package/dist/bot/system-prompt.d.ts.map +1 -0
- package/dist/bot/system-prompt.js +222 -0
- package/dist/bot/system-prompt.js.map +1 -0
- package/dist/bot/task-queue.d.ts +26 -0
- package/dist/bot/task-queue.d.ts.map +1 -0
- package/dist/bot/task-queue.js +98 -0
- package/dist/bot/task-queue.js.map +1 -0
- package/dist/bot/types.d.ts +478 -0
- package/dist/bot/types.d.ts.map +1 -0
- package/dist/bot/types.js +2 -0
- package/dist/bot/types.js.map +1 -0
- package/dist/bot/utils.d.ts +2 -0
- package/dist/bot/utils.d.ts.map +1 -0
- package/dist/bot/utils.js +20 -0
- package/dist/bot/utils.js.map +1 -0
- package/dist/bot/watch-daemon.d.ts +19 -0
- package/dist/bot/watch-daemon.d.ts.map +1 -0
- package/dist/bot/watch-daemon.js +178 -0
- package/dist/bot/watch-daemon.js.map +1 -0
- package/dist/bot/web-approval.d.ts +19 -0
- package/dist/bot/web-approval.d.ts.map +1 -0
- package/dist/bot/web-approval.js +207 -0
- package/dist/bot/web-approval.js.map +1 -0
- package/dist/cli-bridge.d.ts +2 -0
- package/dist/cli-bridge.d.ts.map +1 -0
- package/dist/cli-bridge.js +30 -0
- package/dist/cli-bridge.js.map +1 -0
- package/dist/cli-handlers.d.ts +79 -0
- package/dist/cli-handlers.d.ts.map +1 -0
- package/dist/cli-handlers.js +1335 -0
- package/dist/cli-handlers.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +749 -0
- package/dist/cli.js.map +1 -0
- package/dist/docs/docs/weaver-config.md +135 -0
- package/dist/docs/weaver-config.md +141 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-tools.d.ts +13 -0
- package/dist/mcp-tools.d.ts.map +1 -0
- package/dist/mcp-tools.js +197 -0
- package/dist/mcp-tools.js.map +1 -0
- package/dist/node-types/abort-task.d.ts +15 -0
- package/dist/node-types/abort-task.d.ts.map +1 -0
- package/dist/node-types/abort-task.js +28 -0
- package/dist/node-types/abort-task.js.map +1 -0
- package/dist/node-types/approval-gate.d.ts +18 -0
- package/dist/node-types/approval-gate.d.ts.map +1 -0
- package/dist/node-types/approval-gate.js +80 -0
- package/dist/node-types/approval-gate.js.map +1 -0
- package/dist/node-types/bot-report.d.ts +20 -0
- package/dist/node-types/bot-report.d.ts.map +1 -0
- package/dist/node-types/bot-report.js +67 -0
- package/dist/node-types/bot-report.js.map +1 -0
- package/dist/node-types/build-context.d.ts +16 -0
- package/dist/node-types/build-context.d.ts.map +1 -0
- package/dist/node-types/build-context.js +64 -0
- package/dist/node-types/build-context.js.map +1 -0
- package/dist/node-types/detect-provider.d.ts +17 -0
- package/dist/node-types/detect-provider.d.ts.map +1 -0
- package/dist/node-types/detect-provider.js +71 -0
- package/dist/node-types/detect-provider.js.map +1 -0
- package/dist/node-types/exec-validate-retry.d.ts +17 -0
- package/dist/node-types/exec-validate-retry.d.ts.map +1 -0
- package/dist/node-types/exec-validate-retry.js +147 -0
- package/dist/node-types/exec-validate-retry.js.map +1 -0
- package/dist/node-types/execute-plan.d.ts +26 -0
- package/dist/node-types/execute-plan.d.ts.map +1 -0
- package/dist/node-types/execute-plan.js +120 -0
- package/dist/node-types/execute-plan.js.map +1 -0
- package/dist/node-types/execute-target.d.ts +16 -0
- package/dist/node-types/execute-target.d.ts.map +1 -0
- package/dist/node-types/execute-target.js +238 -0
- package/dist/node-types/execute-target.js.map +1 -0
- package/dist/node-types/fix-errors.d.ts +24 -0
- package/dist/node-types/fix-errors.d.ts.map +1 -0
- package/dist/node-types/fix-errors.js +49 -0
- package/dist/node-types/fix-errors.js.map +1 -0
- package/dist/node-types/genesis-apply-retry.d.ts +27 -0
- package/dist/node-types/genesis-apply-retry.d.ts.map +1 -0
- package/dist/node-types/genesis-apply-retry.js +97 -0
- package/dist/node-types/genesis-apply-retry.js.map +1 -0
- package/dist/node-types/genesis-apply.d.ts +29 -0
- package/dist/node-types/genesis-apply.d.ts.map +1 -0
- package/dist/node-types/genesis-apply.js +76 -0
- package/dist/node-types/genesis-apply.js.map +1 -0
- package/dist/node-types/genesis-approve.d.ts +19 -0
- package/dist/node-types/genesis-approve.d.ts.map +1 -0
- package/dist/node-types/genesis-approve.js +59 -0
- package/dist/node-types/genesis-approve.js.map +1 -0
- package/dist/node-types/genesis-check-stabilize.d.ts +16 -0
- package/dist/node-types/genesis-check-stabilize.d.ts.map +1 -0
- package/dist/node-types/genesis-check-stabilize.js +32 -0
- package/dist/node-types/genesis-check-stabilize.js.map +1 -0
- package/dist/node-types/genesis-check-threshold.d.ts +15 -0
- package/dist/node-types/genesis-check-threshold.d.ts.map +1 -0
- package/dist/node-types/genesis-check-threshold.js +29 -0
- package/dist/node-types/genesis-check-threshold.js.map +1 -0
- package/dist/node-types/genesis-commit.d.ts +17 -0
- package/dist/node-types/genesis-commit.d.ts.map +1 -0
- package/dist/node-types/genesis-commit.js +59 -0
- package/dist/node-types/genesis-commit.js.map +1 -0
- package/dist/node-types/genesis-compile-validate.d.ts +26 -0
- package/dist/node-types/genesis-compile-validate.d.ts.map +1 -0
- package/dist/node-types/genesis-compile-validate.js +60 -0
- package/dist/node-types/genesis-compile-validate.js.map +1 -0
- package/dist/node-types/genesis-diff-fingerprint.d.ts +15 -0
- package/dist/node-types/genesis-diff-fingerprint.d.ts.map +1 -0
- package/dist/node-types/genesis-diff-fingerprint.js +59 -0
- package/dist/node-types/genesis-diff-fingerprint.js.map +1 -0
- package/dist/node-types/genesis-diff-workflow.d.ts +15 -0
- package/dist/node-types/genesis-diff-workflow.d.ts.map +1 -0
- package/dist/node-types/genesis-diff-workflow.js +67 -0
- package/dist/node-types/genesis-diff-workflow.js.map +1 -0
- package/dist/node-types/genesis-escrow-grace.d.ts +15 -0
- package/dist/node-types/genesis-escrow-grace.d.ts.map +1 -0
- package/dist/node-types/genesis-escrow-grace.js +52 -0
- package/dist/node-types/genesis-escrow-grace.js.map +1 -0
- package/dist/node-types/genesis-escrow-migrate.d.ts +21 -0
- package/dist/node-types/genesis-escrow-migrate.d.ts.map +1 -0
- package/dist/node-types/genesis-escrow-migrate.js +116 -0
- package/dist/node-types/genesis-escrow-migrate.js.map +1 -0
- package/dist/node-types/genesis-escrow-recover.d.ts +15 -0
- package/dist/node-types/genesis-escrow-recover.d.ts.map +1 -0
- package/dist/node-types/genesis-escrow-recover.js +90 -0
- package/dist/node-types/genesis-escrow-recover.js.map +1 -0
- package/dist/node-types/genesis-escrow-stage.d.ts +17 -0
- package/dist/node-types/genesis-escrow-stage.d.ts.map +1 -0
- package/dist/node-types/genesis-escrow-stage.js +86 -0
- package/dist/node-types/genesis-escrow-stage.js.map +1 -0
- package/dist/node-types/genesis-escrow-validate.d.ts +17 -0
- package/dist/node-types/genesis-escrow-validate.d.ts.map +1 -0
- package/dist/node-types/genesis-escrow-validate.js +110 -0
- package/dist/node-types/genesis-escrow-validate.js.map +1 -0
- package/dist/node-types/genesis-load-config.d.ts +17 -0
- package/dist/node-types/genesis-load-config.d.ts.map +1 -0
- package/dist/node-types/genesis-load-config.js +36 -0
- package/dist/node-types/genesis-load-config.js.map +1 -0
- package/dist/node-types/genesis-observe.d.ts +18 -0
- package/dist/node-types/genesis-observe.d.ts.map +1 -0
- package/dist/node-types/genesis-observe.js +103 -0
- package/dist/node-types/genesis-observe.js.map +1 -0
- package/dist/node-types/genesis-propose.d.ts +17 -0
- package/dist/node-types/genesis-propose.d.ts.map +1 -0
- package/dist/node-types/genesis-propose.js +69 -0
- package/dist/node-types/genesis-propose.js.map +1 -0
- package/dist/node-types/genesis-report.d.ts +20 -0
- package/dist/node-types/genesis-report.d.ts.map +1 -0
- package/dist/node-types/genesis-report.js +87 -0
- package/dist/node-types/genesis-report.js.map +1 -0
- package/dist/node-types/genesis-snapshot.d.ts +15 -0
- package/dist/node-types/genesis-snapshot.d.ts.map +1 -0
- package/dist/node-types/genesis-snapshot.js +26 -0
- package/dist/node-types/genesis-snapshot.js.map +1 -0
- package/dist/node-types/genesis-try-apply.d.ts +18 -0
- package/dist/node-types/genesis-try-apply.d.ts.map +1 -0
- package/dist/node-types/genesis-try-apply.js +142 -0
- package/dist/node-types/genesis-try-apply.js.map +1 -0
- package/dist/node-types/genesis-update-history.d.ts +15 -0
- package/dist/node-types/genesis-update-history.d.ts.map +1 -0
- package/dist/node-types/genesis-update-history.js +70 -0
- package/dist/node-types/genesis-update-history.js.map +1 -0
- package/dist/node-types/genesis-validate-proposal.d.ts +16 -0
- package/dist/node-types/genesis-validate-proposal.d.ts.map +1 -0
- package/dist/node-types/genesis-validate-proposal.js +109 -0
- package/dist/node-types/genesis-validate-proposal.js.map +1 -0
- package/dist/node-types/git-ops.d.ts +15 -0
- package/dist/node-types/git-ops.d.ts.map +1 -0
- package/dist/node-types/git-ops.js +69 -0
- package/dist/node-types/git-ops.js.map +1 -0
- package/dist/node-types/index.d.ts +37 -0
- package/dist/node-types/index.d.ts.map +1 -0
- package/dist/node-types/index.js +37 -0
- package/dist/node-types/index.js.map +1 -0
- package/dist/node-types/load-config.d.ts +17 -0
- package/dist/node-types/load-config.d.ts.map +1 -0
- package/dist/node-types/load-config.js +27 -0
- package/dist/node-types/load-config.js.map +1 -0
- package/dist/node-types/plan-task.d.ts +17 -0
- package/dist/node-types/plan-task.d.ts.map +1 -0
- package/dist/node-types/plan-task.js +55 -0
- package/dist/node-types/plan-task.js.map +1 -0
- package/dist/node-types/read-workflow.d.ts +15 -0
- package/dist/node-types/read-workflow.d.ts.map +1 -0
- package/dist/node-types/read-workflow.js +60 -0
- package/dist/node-types/read-workflow.js.map +1 -0
- package/dist/node-types/receive-task.d.ts +20 -0
- package/dist/node-types/receive-task.d.ts.map +1 -0
- package/dist/node-types/receive-task.js +69 -0
- package/dist/node-types/receive-task.js.map +1 -0
- package/dist/node-types/report.d.ts +14 -0
- package/dist/node-types/report.d.ts.map +1 -0
- package/dist/node-types/report.js +25 -0
- package/dist/node-types/report.js.map +1 -0
- package/dist/node-types/resolve-target.d.ts +16 -0
- package/dist/node-types/resolve-target.d.ts.map +1 -0
- package/dist/node-types/resolve-target.js +67 -0
- package/dist/node-types/resolve-target.js.map +1 -0
- package/dist/node-types/route-task.d.ts +14 -0
- package/dist/node-types/route-task.d.ts.map +1 -0
- package/dist/node-types/route-task.js +22 -0
- package/dist/node-types/route-task.js.map +1 -0
- package/dist/node-types/send-notify.d.ts +14 -0
- package/dist/node-types/send-notify.d.ts.map +1 -0
- package/dist/node-types/send-notify.js +71 -0
- package/dist/node-types/send-notify.js.map +1 -0
- package/dist/node-types/validate-result.d.ts +24 -0
- package/dist/node-types/validate-result.d.ts.map +1 -0
- package/dist/node-types/validate-result.js +38 -0
- package/dist/node-types/validate-result.js.map +1 -0
- package/dist/templates/index.d.ts +5 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js +4 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/templates/weaver-bot-template.d.ts +11 -0
- package/dist/templates/weaver-bot-template.d.ts.map +1 -0
- package/dist/templates/weaver-bot-template.js +99 -0
- package/dist/templates/weaver-bot-template.js.map +1 -0
- package/dist/templates/weaver-template.d.ts +11 -0
- package/dist/templates/weaver-template.d.ts.map +1 -0
- package/dist/templates/weaver-template.js +53 -0
- package/dist/templates/weaver-template.js.map +1 -0
- package/dist/workflows/genesis-task.d.ts +62 -0
- package/dist/workflows/genesis-task.d.ts.map +1 -0
- package/dist/workflows/genesis-task.js +64 -0
- package/dist/workflows/genesis-task.js.map +1 -0
- package/dist/workflows/index.d.ts +4 -0
- package/dist/workflows/index.d.ts.map +1 -0
- package/dist/workflows/index.js +4 -0
- package/dist/workflows/index.js.map +1 -0
- package/dist/workflows/weaver-bot-batch.d.ts +49 -0
- package/dist/workflows/weaver-bot-batch.d.ts.map +1 -0
- package/dist/workflows/weaver-bot-batch.js +49 -0
- package/dist/workflows/weaver-bot-batch.js.map +1 -0
- package/dist/workflows/weaver-bot-session.d.ts +65 -0
- package/dist/workflows/weaver-bot-session.d.ts.map +1 -0
- package/dist/workflows/weaver-bot-session.js +68 -0
- package/dist/workflows/weaver-bot-session.js.map +1 -0
- package/dist/workflows/weaver-bot.d.ts +61 -0
- package/dist/workflows/weaver-bot.d.ts.map +1 -0
- package/dist/workflows/weaver-bot.js +61 -0
- package/dist/workflows/weaver-bot.js.map +1 -0
- package/dist/workflows/weaver.d.ts +24 -0
- package/dist/workflows/weaver.d.ts.map +1 -0
- package/dist/workflows/weaver.js +28 -0
- package/dist/workflows/weaver.js.map +1 -0
- package/flowweaver.manifest.json +1001 -0
- package/package.json +78 -0
- package/src/bot/agent-provider.ts +273 -0
- package/src/bot/ai-client.ts +153 -0
- package/src/bot/approvals.ts +273 -0
- package/src/bot/audit-logger.ts +45 -0
- package/src/bot/audit-store.ts +69 -0
- package/src/bot/bot-agent-channel.ts +99 -0
- package/src/bot/cli-provider.ts +169 -0
- package/src/bot/cli-stream-parser.ts +59 -0
- package/src/bot/cost-store.ts +92 -0
- package/src/bot/cost-tracker.ts +72 -0
- package/src/bot/cron-parser.ts +153 -0
- package/src/bot/cron-scheduler.ts +48 -0
- package/src/bot/dashboard.ts +658 -0
- package/src/bot/design-checker.ts +327 -0
- package/src/bot/file-lock.ts +73 -0
- package/src/bot/file-validator.ts +41 -0
- package/src/bot/file-watcher.ts +103 -0
- package/src/bot/fw-api.ts +18 -0
- package/src/bot/genesis-prompt-context.ts +135 -0
- package/src/bot/genesis-store.ts +180 -0
- package/src/bot/index.ts +127 -0
- package/src/bot/notifications.ts +263 -0
- package/src/bot/pipeline-runner.ts +324 -0
- package/src/bot/provider-registry.ts +236 -0
- package/src/bot/run-store.ts +169 -0
- package/src/bot/runner.ts +311 -0
- package/src/bot/session-state.ts +73 -0
- package/src/bot/steering.ts +44 -0
- package/src/bot/step-executor.ts +34 -0
- package/src/bot/system-prompt.ts +280 -0
- package/src/bot/task-queue.ts +111 -0
- package/src/bot/types.ts +571 -0
- package/src/bot/utils.ts +17 -0
- package/src/bot/watch-daemon.ts +203 -0
- package/src/bot/web-approval.ts +240 -0
- package/src/cli-bridge.ts +41 -0
- package/src/cli-handlers.ts +1445 -0
- package/src/docs/weaver-config.md +135 -0
- package/src/index.ts +177 -0
- package/src/mcp-tools.ts +274 -0
- package/src/node-types/abort-task.ts +31 -0
- package/src/node-types/approval-gate.ts +95 -0
- package/src/node-types/bot-report.ts +82 -0
- package/src/node-types/build-context.ts +65 -0
- package/src/node-types/detect-provider.ts +77 -0
- package/src/node-types/exec-validate-retry.ts +170 -0
- package/src/node-types/execute-plan.ts +130 -0
- package/src/node-types/execute-target.ts +256 -0
- package/src/node-types/fix-errors.ts +63 -0
- package/src/node-types/genesis-apply-retry.ts +133 -0
- package/src/node-types/genesis-apply.ts +96 -0
- package/src/node-types/genesis-approve.ts +73 -0
- package/src/node-types/genesis-check-stabilize.ts +37 -0
- package/src/node-types/genesis-check-threshold.ts +34 -0
- package/src/node-types/genesis-commit.ts +71 -0
- package/src/node-types/genesis-compile-validate.ts +77 -0
- package/src/node-types/genesis-diff-fingerprint.ts +67 -0
- package/src/node-types/genesis-diff-workflow.ts +71 -0
- package/src/node-types/genesis-escrow-grace.ts +62 -0
- package/src/node-types/genesis-escrow-migrate.ts +138 -0
- package/src/node-types/genesis-escrow-recover.ts +99 -0
- package/src/node-types/genesis-escrow-stage.ts +104 -0
- package/src/node-types/genesis-escrow-validate.ts +120 -0
- package/src/node-types/genesis-load-config.ts +44 -0
- package/src/node-types/genesis-observe.ts +119 -0
- package/src/node-types/genesis-propose.ts +86 -0
- package/src/node-types/genesis-report.ts +95 -0
- package/src/node-types/genesis-snapshot.ts +30 -0
- package/src/node-types/genesis-try-apply.ts +165 -0
- package/src/node-types/genesis-update-history.ts +72 -0
- package/src/node-types/genesis-validate-proposal.ts +124 -0
- package/src/node-types/git-ops.ts +72 -0
- package/src/node-types/index.ts +36 -0
- package/src/node-types/load-config.ts +27 -0
- package/src/node-types/plan-task.ts +66 -0
- package/src/node-types/read-workflow.ts +68 -0
- package/src/node-types/receive-task.ts +92 -0
- package/src/node-types/report.ts +25 -0
- package/src/node-types/resolve-target.ts +64 -0
- package/src/node-types/route-task.ts +25 -0
- package/src/node-types/send-notify.ts +75 -0
- package/src/node-types/validate-result.ts +49 -0
- package/src/templates/index.ts +5 -0
- package/src/templates/weaver-bot-template.ts +106 -0
- package/src/workflows/genesis-task.ts +91 -0
- package/src/workflows/index.ts +3 -0
- package/src/workflows/weaver-bot-batch.ts +65 -0
- package/src/workflows/weaver-bot.ts +79 -0
- package/templates.js +1 -0
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builds the Weaver expert system prompt from flow-weaver's doc-metadata.
|
|
3
|
+
* This ensures Weaver's knowledge stays in sync with the installed flow-weaver version.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
interface AnnotationDoc {
|
|
7
|
+
name: string;
|
|
8
|
+
syntax: string;
|
|
9
|
+
description: string;
|
|
10
|
+
category: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
interface ModifierDoc {
|
|
14
|
+
name: string;
|
|
15
|
+
syntax: string;
|
|
16
|
+
description: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
interface ValidationCodeDoc {
|
|
20
|
+
code: string;
|
|
21
|
+
severity: string;
|
|
22
|
+
title: string;
|
|
23
|
+
description: string;
|
|
24
|
+
category: string;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
interface CliCommandDoc {
|
|
28
|
+
name: string;
|
|
29
|
+
description: string;
|
|
30
|
+
group?: string;
|
|
31
|
+
botCompatible?: boolean;
|
|
32
|
+
options?: { flags: string; arg?: string; description: string }[];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
let cachedPrompt: string | null = null;
|
|
36
|
+
|
|
37
|
+
function formatAnnotations(annotations: AnnotationDoc[]): string {
|
|
38
|
+
// Group by category, show syntax + description
|
|
39
|
+
const groups = new Map<string, AnnotationDoc[]>();
|
|
40
|
+
for (const a of annotations) {
|
|
41
|
+
const list = groups.get(a.category) ?? [];
|
|
42
|
+
list.push(a);
|
|
43
|
+
groups.set(a.category, list);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const lines: string[] = [];
|
|
47
|
+
for (const [category, items] of groups) {
|
|
48
|
+
lines.push(`[${category}]`);
|
|
49
|
+
for (const item of items) {
|
|
50
|
+
lines.push(` ${item.syntax} -- ${item.description}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return lines.join('\n');
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function formatModifiers(portMods: ModifierDoc[], nodeMods: ModifierDoc[]): string {
|
|
57
|
+
const lines: string[] = [];
|
|
58
|
+
if (portMods.length > 0) {
|
|
59
|
+
lines.push('Port modifiers (after port name):');
|
|
60
|
+
for (const m of portMods) {
|
|
61
|
+
lines.push(` ${m.syntax} -- ${m.description}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (nodeMods.length > 0) {
|
|
65
|
+
lines.push('Node instance modifiers (in @node declaration):');
|
|
66
|
+
for (const m of nodeMods) {
|
|
67
|
+
lines.push(` ${m.syntax} -- ${m.description}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return lines.join('\n');
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function formatErrors(codes: ValidationCodeDoc[]): string {
|
|
74
|
+
const errors = codes.filter((c) => c.severity === 'error').slice(0, 15);
|
|
75
|
+
return errors
|
|
76
|
+
.map((c) => ` ${c.code}: ${c.title} -- ${c.description}`)
|
|
77
|
+
.join('\n');
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function formatCliCommands(commands: CliCommandDoc[]): string {
|
|
81
|
+
const top = commands.filter((c) => !c.group);
|
|
82
|
+
return top
|
|
83
|
+
.map((c) => ` flow-weaver ${c.name} -- ${c.description}`)
|
|
84
|
+
.join('\n');
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function buildPromptFromMetadata(
|
|
88
|
+
annotations: AnnotationDoc[],
|
|
89
|
+
portModifiers: ModifierDoc[],
|
|
90
|
+
nodeModifiers: ModifierDoc[],
|
|
91
|
+
validationCodes: ValidationCodeDoc[],
|
|
92
|
+
cliCommands: CliCommandDoc[],
|
|
93
|
+
): string {
|
|
94
|
+
return `You are Weaver, an expert AI companion for Flow Weaver workflows. You have deep knowledge of the entire Flow Weaver ecosystem: annotation grammar, compilation, CLI tools, node patterns, error diagnosis, and the Genesis self-evolution protocol.
|
|
95
|
+
|
|
96
|
+
## Core Mental Model
|
|
97
|
+
|
|
98
|
+
The code IS the workflow. Flow Weaver workflows are plain TypeScript files with JSDoc annotations above functions. The compiler reads annotations and generates deterministic execution code between @flow-weaver-body-start/end markers. Compiled code is standalone with no runtime dependency on flow-weaver.
|
|
99
|
+
|
|
100
|
+
Three block types:
|
|
101
|
+
- @flowWeaver nodeType: A reusable function (node) with typed inputs/outputs
|
|
102
|
+
- @flowWeaver workflow: A DAG orchestration that wires node instances together
|
|
103
|
+
- @flowWeaver pattern: A reusable fragment with boundary ports (IN/OUT instead of Start/Exit)
|
|
104
|
+
|
|
105
|
+
## Annotation Grammar
|
|
106
|
+
|
|
107
|
+
${formatAnnotations(annotations)}
|
|
108
|
+
|
|
109
|
+
${formatModifiers(portModifiers, nodeModifiers)}
|
|
110
|
+
|
|
111
|
+
## Node Execution Model
|
|
112
|
+
|
|
113
|
+
Expression nodes (@expression):
|
|
114
|
+
- No execute/onSuccess/onFailure params. Just inputs and return value.
|
|
115
|
+
- throw = failure path, return = success path
|
|
116
|
+
- Synchronous. Use execSync for shell commands.
|
|
117
|
+
- Preferred for deterministic operations.
|
|
118
|
+
|
|
119
|
+
Standard nodes:
|
|
120
|
+
- execute: boolean param gates execution
|
|
121
|
+
- Return { onSuccess: boolean, onFailure: boolean, ...outputs }
|
|
122
|
+
- Can be async for I/O operations
|
|
123
|
+
|
|
124
|
+
Async agent nodes:
|
|
125
|
+
- Use (globalThis as any).__fw_agent_channel__ to pause workflow
|
|
126
|
+
- Call channel.request({ agentId, context, prompt }) which returns a Promise
|
|
127
|
+
- Workflow suspends until agent responds
|
|
128
|
+
- NOT @expression (must be async)
|
|
129
|
+
|
|
130
|
+
Pass-through pattern:
|
|
131
|
+
- FW auto-connects ports by matching names on adjacent nodes
|
|
132
|
+
- To forward data through intermediate nodes, declare it as both @input and @output with the same name
|
|
133
|
+
- For non-adjacent wiring, use @connect sourceNode.port -> targetNode.port
|
|
134
|
+
|
|
135
|
+
Data flow:
|
|
136
|
+
- @path A -> B -> C: Linear execution path (sugar for multiple @connect)
|
|
137
|
+
- @autoConnect: Auto-wire all nodes in declaration order
|
|
138
|
+
- @connect: Explicit port-to-port wiring
|
|
139
|
+
- Merge strategies for fan-in: FIRST, LAST, COLLECT, MERGE, CONCAT
|
|
140
|
+
|
|
141
|
+
## CLI Commands
|
|
142
|
+
|
|
143
|
+
${formatCliCommands(cliCommands)}
|
|
144
|
+
|
|
145
|
+
Note: compile, validate, modify, diff, diagram, and describe operations are available as direct plan steps (no CLI needed). The run-cli operation is an escape hatch for other CLI commands.
|
|
146
|
+
|
|
147
|
+
## Validation Errors
|
|
148
|
+
|
|
149
|
+
${formatErrors(validationCodes)}
|
|
150
|
+
|
|
151
|
+
When you encounter validation errors, suggest the specific fix. Common resolutions:
|
|
152
|
+
- UNKNOWN_NODE_TYPE: Ensure the referenced function has @flowWeaver nodeType annotation
|
|
153
|
+
- MISSING_REQUIRED_INPUT: Add a @connect from a source port or make the input optional with [brackets]
|
|
154
|
+
- UNKNOWN_SOURCE_PORT / UNKNOWN_TARGET_PORT: Check port name spelling in @connect
|
|
155
|
+
- CYCLE_DETECTED: Break the cycle; use scoped iteration (@scope, @map) instead of circular dependencies
|
|
156
|
+
|
|
157
|
+
## Genesis Protocol
|
|
158
|
+
|
|
159
|
+
Genesis is a 17-step self-evolving workflow engine:
|
|
160
|
+
1. Load config (.genesis/config.json with intent, focus, constraints, approval thresholds)
|
|
161
|
+
2. Observe project (fingerprint: files, package.json, git, CI, tests, existing FW workflows)
|
|
162
|
+
3. Load task workflow (genesis-task.ts)
|
|
163
|
+
4. Diff fingerprint against last cycle
|
|
164
|
+
5. Check stabilize mode (3+ rollbacks/rejections = read-only, or explicit flag)
|
|
165
|
+
6. Wait for agent (YOU decide what evolutions to propose)
|
|
166
|
+
7. Propose evolution (map your decisions to FwModifyOperation[])
|
|
167
|
+
8. Validate proposal (budget: max 3 cost units per cycle. addNode=1, removeNode=1, addConnection=1, removeConnection=1, implementNode=2)
|
|
168
|
+
9. Snapshot current task workflow for rollback
|
|
169
|
+
10. Apply changes via flow-weaver CLI
|
|
170
|
+
11. Compile and validate (auto-rollback on failure)
|
|
171
|
+
12. Diff workflow (semantic diff)
|
|
172
|
+
13. Check approval threshold (CRITICAL > BREAKING > MINOR > COSMETIC)
|
|
173
|
+
14. Wait for approval (if impact >= threshold)
|
|
174
|
+
15. Commit or rollback based on approval
|
|
175
|
+
16. Update history (.genesis/history.json)
|
|
176
|
+
17. Report summary
|
|
177
|
+
|
|
178
|
+
When stabilize mode is active, only fix-up operations are allowed: removeNode, removeConnection, implementNode. No new nodes or connections.
|
|
179
|
+
|
|
180
|
+
## Response Format
|
|
181
|
+
|
|
182
|
+
Return ONLY valid JSON. No markdown, no code fences, no explanation outside the JSON structure. Your response must parse with JSON.parse() directly.`;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
export async function buildSystemPrompt(): Promise<string> {
|
|
186
|
+
if (cachedPrompt) return cachedPrompt;
|
|
187
|
+
|
|
188
|
+
try {
|
|
189
|
+
const docMeta = await import('@synergenius/flow-weaver/doc-metadata');
|
|
190
|
+
|
|
191
|
+
cachedPrompt = buildPromptFromMetadata(
|
|
192
|
+
docMeta.ALL_ANNOTATIONS ?? [],
|
|
193
|
+
docMeta.PORT_MODIFIERS ?? [],
|
|
194
|
+
docMeta.NODE_MODIFIERS ?? [],
|
|
195
|
+
docMeta.VALIDATION_CODES ?? [],
|
|
196
|
+
docMeta.CLI_COMMANDS ?? [],
|
|
197
|
+
);
|
|
198
|
+
} catch {
|
|
199
|
+
// Fallback if doc-metadata not available (e.g., older flow-weaver version)
|
|
200
|
+
cachedPrompt = buildPromptFromMetadata([], [], [], [], []);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
return cachedPrompt;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
function formatBotOperations(cliCommands: CliCommandDoc[]): string {
|
|
207
|
+
const packOps = [
|
|
208
|
+
'- create-workflow: Create a new workflow file. args: { file, content }',
|
|
209
|
+
'- implement-node: Write a node type implementation. args: { file, content }',
|
|
210
|
+
'- modify-source: Direct source file modification. args: { file, content }',
|
|
211
|
+
'- read-file: Read a file for context. args: { file }',
|
|
212
|
+
'- write-file: Write a file. args: { file, content }',
|
|
213
|
+
];
|
|
214
|
+
|
|
215
|
+
const fwOps = cliCommands
|
|
216
|
+
.filter(cmd => cmd.botCompatible)
|
|
217
|
+
.map(cmd => {
|
|
218
|
+
const argNames = (cmd.options ?? [])
|
|
219
|
+
.filter(o => !o.flags.includes('--verbose') && !o.flags.includes('--quiet') && !o.flags.includes('--json') && o.arg)
|
|
220
|
+
.map(o => {
|
|
221
|
+
const match = o.flags.match(/--(\S+)/);
|
|
222
|
+
return match ? match[1] : null;
|
|
223
|
+
})
|
|
224
|
+
.filter(Boolean);
|
|
225
|
+
const argsStr = argNames.length ? `file, ${argNames.join(', ')}` : 'file';
|
|
226
|
+
return `- ${cmd.name}: ${cmd.description}. args: { ${argsStr} }`;
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
return [...packOps, ...fwOps].join('\n');
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
export function buildBotSystemPrompt(contextBundle?: string, cliCommands?: CliCommandDoc[]): string {
|
|
233
|
+
const operationsList = formatBotOperations(cliCommands ?? []);
|
|
234
|
+
|
|
235
|
+
const planSchema = `## Bot Plan Schema
|
|
236
|
+
|
|
237
|
+
When asked to plan a task, return a JSON object with this structure:
|
|
238
|
+
{
|
|
239
|
+
"steps": [
|
|
240
|
+
{
|
|
241
|
+
"id": "step-1",
|
|
242
|
+
"operation": "<operation>",
|
|
243
|
+
"description": "What this step does",
|
|
244
|
+
"args": { ... operation-specific arguments ... }
|
|
245
|
+
}
|
|
246
|
+
],
|
|
247
|
+
"summary": "Brief description of the overall plan"
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
Available operations:
|
|
251
|
+
${operationsList}`;
|
|
252
|
+
|
|
253
|
+
const botInstructions = `## Bot Mode Instructions
|
|
254
|
+
|
|
255
|
+
You are operating in autonomous bot mode. Your job is to plan and execute workflow creation or modification tasks.
|
|
256
|
+
|
|
257
|
+
When planning:
|
|
258
|
+
1. Break the task into concrete, ordered steps using the plan schema above
|
|
259
|
+
2. For new workflows, plan: scaffold/create -> implement nodes -> compile -> validate
|
|
260
|
+
3. For modifications, plan: read current state -> modify -> compile -> validate
|
|
261
|
+
4. Each step is executed via the flow-weaver programmatic API
|
|
262
|
+
5. Use templates when they match the task
|
|
263
|
+
6. Prefer @expression nodes for deterministic operations
|
|
264
|
+
7. Use proper JSDoc annotations on all node types and workflows
|
|
265
|
+
8. Include visualization metadata (colors, icons, positions) on workflow nodes
|
|
266
|
+
|
|
267
|
+
When fixing validation errors:
|
|
268
|
+
1. Read the error messages carefully
|
|
269
|
+
2. Map each error to a specific fix operation
|
|
270
|
+
3. Common fixes: add missing connections, fix port names, resolve type mismatches
|
|
271
|
+
4. Return a new plan with only the fix steps`;
|
|
272
|
+
|
|
273
|
+
let prompt = planSchema + '\n\n' + botInstructions;
|
|
274
|
+
|
|
275
|
+
if (contextBundle) {
|
|
276
|
+
prompt += '\n\n## Project Context\n\n' + contextBundle;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
return prompt;
|
|
280
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import * as os from 'node:os';
|
|
4
|
+
import * as crypto from 'node:crypto';
|
|
5
|
+
import { withFileLock } from './file-lock.js';
|
|
6
|
+
|
|
7
|
+
export interface QueuedTask {
|
|
8
|
+
id: string;
|
|
9
|
+
instruction: string;
|
|
10
|
+
mode?: 'create' | 'modify' | 'read' | 'batch';
|
|
11
|
+
targets?: string[];
|
|
12
|
+
options?: Record<string, unknown>;
|
|
13
|
+
priority: number;
|
|
14
|
+
addedAt: number;
|
|
15
|
+
status: 'pending' | 'running' | 'completed' | 'failed' | 'cancelled';
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export class TaskQueue {
|
|
19
|
+
private filePath: string;
|
|
20
|
+
|
|
21
|
+
constructor(dir?: string) {
|
|
22
|
+
const base = dir ?? path.join(os.homedir(), '.weaver');
|
|
23
|
+
this.filePath = path.join(base, 'task-queue.ndjson');
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
async add(task: Omit<QueuedTask, 'id' | 'addedAt' | 'status'>): Promise<string> {
|
|
27
|
+
return withFileLock(this.filePath, () => {
|
|
28
|
+
const entry: QueuedTask = {
|
|
29
|
+
...task,
|
|
30
|
+
id: crypto.randomUUID().slice(0, 8),
|
|
31
|
+
addedAt: Date.now(),
|
|
32
|
+
status: 'pending',
|
|
33
|
+
};
|
|
34
|
+
const dir = path.dirname(this.filePath);
|
|
35
|
+
if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
|
|
36
|
+
fs.appendFileSync(this.filePath, JSON.stringify(entry) + '\n', 'utf-8');
|
|
37
|
+
return entry.id;
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
async next(): Promise<QueuedTask | null> {
|
|
42
|
+
return withFileLock(this.filePath, () => {
|
|
43
|
+
const tasks = this.readAll().filter(t => t.status === 'pending');
|
|
44
|
+
tasks.sort((a, b) => b.priority - a.priority || a.addedAt - b.addedAt);
|
|
45
|
+
return tasks[0] ?? null;
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async list(): Promise<QueuedTask[]> {
|
|
50
|
+
return withFileLock(this.filePath, () => this.readAll());
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
async remove(id: string): Promise<boolean> {
|
|
54
|
+
return withFileLock(this.filePath, () => {
|
|
55
|
+
const tasks = this.readAll();
|
|
56
|
+
const filtered = tasks.filter(t => t.id !== id);
|
|
57
|
+
if (filtered.length === tasks.length) return false;
|
|
58
|
+
this.writeAll(filtered);
|
|
59
|
+
return true;
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
async clear(): Promise<number> {
|
|
64
|
+
return withFileLock(this.filePath, () => {
|
|
65
|
+
const tasks = this.readAll();
|
|
66
|
+
if (tasks.length === 0) return 0;
|
|
67
|
+
try { fs.unlinkSync(this.filePath); } catch { /* ignore */ }
|
|
68
|
+
return tasks.length;
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
async markRunning(id: string): Promise<void> {
|
|
73
|
+
await this.updateStatus(id, 'running');
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
async markComplete(id: string): Promise<void> {
|
|
77
|
+
await this.updateStatus(id, 'completed');
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
async markFailed(id: string): Promise<void> {
|
|
81
|
+
await this.updateStatus(id, 'failed');
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
private async updateStatus(id: string, status: QueuedTask['status']): Promise<void> {
|
|
85
|
+
return withFileLock(this.filePath, () => {
|
|
86
|
+
const tasks = this.readAll();
|
|
87
|
+
const task = tasks.find(t => t.id === id);
|
|
88
|
+
if (task) {
|
|
89
|
+
task.status = status;
|
|
90
|
+
this.writeAll(tasks);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
private readAll(): QueuedTask[] {
|
|
96
|
+
try {
|
|
97
|
+
if (!fs.existsSync(this.filePath)) return [];
|
|
98
|
+
const content = fs.readFileSync(this.filePath, 'utf-8').trim();
|
|
99
|
+
if (!content) return [];
|
|
100
|
+
return content.split('\n').map(line => JSON.parse(line) as QueuedTask);
|
|
101
|
+
} catch {
|
|
102
|
+
return [];
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
private writeAll(tasks: QueuedTask[]): void {
|
|
107
|
+
const dir = path.dirname(this.filePath);
|
|
108
|
+
if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
|
|
109
|
+
fs.writeFileSync(this.filePath, tasks.map(t => JSON.stringify(t)).join('\n') + (tasks.length > 0 ? '\n' : ''), 'utf-8');
|
|
110
|
+
}
|
|
111
|
+
}
|