instar 0.28.83 → 0.28.85

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.
Files changed (114) hide show
  1. package/dashboard/index.html +239 -0
  2. package/dist/cli.js +10 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/intent.d.ts.map +1 -1
  5. package/dist/commands/intent.js +29 -2
  6. package/dist/commands/intent.js.map +1 -1
  7. package/dist/commands/memoryBackfillEvidence.d.ts +69 -0
  8. package/dist/commands/memoryBackfillEvidence.d.ts.map +1 -0
  9. package/dist/commands/memoryBackfillEvidence.js +220 -0
  10. package/dist/commands/memoryBackfillEvidence.js.map +1 -0
  11. package/dist/commands/server.d.ts.map +1 -1
  12. package/dist/commands/server.js +86 -1
  13. package/dist/commands/server.js.map +1 -1
  14. package/dist/core/DecisionJournal.d.ts +66 -3
  15. package/dist/core/DecisionJournal.d.ts.map +1 -1
  16. package/dist/core/DecisionJournal.js +116 -3
  17. package/dist/core/DecisionJournal.js.map +1 -1
  18. package/dist/core/DispatchExecutor.d.ts +74 -1
  19. package/dist/core/DispatchExecutor.d.ts.map +1 -1
  20. package/dist/core/DispatchExecutor.js +120 -1
  21. package/dist/core/DispatchExecutor.js.map +1 -1
  22. package/dist/core/EvolutionManager.d.ts +133 -0
  23. package/dist/core/EvolutionManager.d.ts.map +1 -1
  24. package/dist/core/EvolutionManager.js +494 -0
  25. package/dist/core/EvolutionManager.js.map +1 -1
  26. package/dist/core/InitiativeTracker.d.ts +82 -15
  27. package/dist/core/InitiativeTracker.d.ts.map +1 -1
  28. package/dist/core/InitiativeTracker.js +502 -31
  29. package/dist/core/InitiativeTracker.js.map +1 -1
  30. package/dist/core/LearnSkillBridge.d.ts +119 -0
  31. package/dist/core/LearnSkillBridge.d.ts.map +1 -0
  32. package/dist/core/LearnSkillBridge.js +160 -0
  33. package/dist/core/LearnSkillBridge.js.map +1 -0
  34. package/dist/core/SharedStateLedger.d.ts.map +1 -1
  35. package/dist/core/SharedStateLedger.js +4 -0
  36. package/dist/core/SharedStateLedger.js.map +1 -1
  37. package/dist/core/types.d.ts +124 -1
  38. package/dist/core/types.d.ts.map +1 -1
  39. package/dist/core/types.js +8 -0
  40. package/dist/core/types.js.map +1 -1
  41. package/dist/memory/EvidenceRenderer.d.ts +64 -0
  42. package/dist/memory/EvidenceRenderer.d.ts.map +1 -0
  43. package/dist/memory/EvidenceRenderer.js +119 -0
  44. package/dist/memory/EvidenceRenderer.js.map +1 -0
  45. package/dist/memory/SemanticMemory.d.ts +61 -1
  46. package/dist/memory/SemanticMemory.d.ts.map +1 -1
  47. package/dist/memory/SemanticMemory.js +381 -11
  48. package/dist/memory/SemanticMemory.js.map +1 -1
  49. package/dist/server/AgentServer.d.ts +4 -0
  50. package/dist/server/AgentServer.d.ts.map +1 -1
  51. package/dist/server/AgentServer.js +2 -0
  52. package/dist/server/AgentServer.js.map +1 -1
  53. package/dist/server/routes.d.ts +8 -0
  54. package/dist/server/routes.d.ts.map +1 -1
  55. package/dist/server/routes.js +500 -14
  56. package/dist/server/routes.js.map +1 -1
  57. package/dist/tasks/DivergenceChecker.d.ts +89 -0
  58. package/dist/tasks/DivergenceChecker.d.ts.map +1 -0
  59. package/dist/tasks/DivergenceChecker.js +255 -0
  60. package/dist/tasks/DivergenceChecker.js.map +1 -0
  61. package/dist/tasks/LruCache.d.ts +33 -0
  62. package/dist/tasks/LruCache.d.ts.map +1 -0
  63. package/dist/tasks/LruCache.js +88 -0
  64. package/dist/tasks/LruCache.js.map +1 -0
  65. package/dist/tasks/RateLimiter.d.ts +61 -0
  66. package/dist/tasks/RateLimiter.d.ts.map +1 -0
  67. package/dist/tasks/RateLimiter.js +108 -0
  68. package/dist/tasks/RateLimiter.js.map +1 -0
  69. package/dist/tasks/TaskFlowDueWaker.d.ts +29 -0
  70. package/dist/tasks/TaskFlowDueWaker.d.ts.map +1 -0
  71. package/dist/tasks/TaskFlowDueWaker.js +73 -0
  72. package/dist/tasks/TaskFlowDueWaker.js.map +1 -0
  73. package/dist/tasks/TaskFlowMaintenanceSweeper.d.ts +40 -0
  74. package/dist/tasks/TaskFlowMaintenanceSweeper.d.ts.map +1 -0
  75. package/dist/tasks/TaskFlowMaintenanceSweeper.js +131 -0
  76. package/dist/tasks/TaskFlowMaintenanceSweeper.js.map +1 -0
  77. package/dist/tasks/TaskFlowRegistry.d.ts +180 -0
  78. package/dist/tasks/TaskFlowRegistry.d.ts.map +1 -0
  79. package/dist/tasks/TaskFlowRegistry.js +791 -0
  80. package/dist/tasks/TaskFlowRegistry.js.map +1 -0
  81. package/dist/tasks/ThreadlineFlowBridge.d.ts +54 -0
  82. package/dist/tasks/ThreadlineFlowBridge.d.ts.map +1 -0
  83. package/dist/tasks/ThreadlineFlowBridge.js +129 -0
  84. package/dist/tasks/ThreadlineFlowBridge.js.map +1 -0
  85. package/dist/tasks/task-flow-registry.store.sqlite.d.ts +77 -0
  86. package/dist/tasks/task-flow-registry.store.sqlite.d.ts.map +1 -0
  87. package/dist/tasks/task-flow-registry.store.sqlite.js +350 -0
  88. package/dist/tasks/task-flow-registry.store.sqlite.js.map +1 -0
  89. package/dist/tasks/task-flow-types.d.ts +229 -0
  90. package/dist/tasks/task-flow-types.d.ts.map +1 -0
  91. package/dist/tasks/task-flow-types.js +128 -0
  92. package/dist/tasks/task-flow-types.js.map +1 -0
  93. package/dist/threadline/ThreadlineMCPServer.d.ts +32 -0
  94. package/dist/threadline/ThreadlineMCPServer.d.ts.map +1 -1
  95. package/dist/threadline/ThreadlineMCPServer.js +82 -5
  96. package/dist/threadline/ThreadlineMCPServer.js.map +1 -1
  97. package/dist/threadline/mcp-stdio-entry.js +56 -0
  98. package/dist/threadline/mcp-stdio-entry.js.map +1 -1
  99. package/package.json +1 -1
  100. package/src/data/builtin-manifest.json +78 -78
  101. package/upgrades/0.28.84.md +89 -0
  102. package/upgrades/0.28.85.md +64 -0
  103. package/upgrades/side-effects/0.28.83.md +27 -0
  104. package/upgrades/side-effects/taskflow-phase1.md +130 -0
  105. package/upgrades/side-effects/taskflow-phase2.md +110 -0
  106. package/upgrades/side-effects/taskflow-phase3a.md +138 -0
  107. package/upgrades/side-effects/taskflow-phase4.md +377 -0
  108. package/upgrades/side-effects/taskflow-phase5.md +234 -0
  109. package/upgrades/side-effects/threadline-discover-relay-and-trust.md +122 -0
  110. package/upgrades/side-effects/wikiclaim-evidence-phase1.md +138 -0
  111. package/upgrades/side-effects/wikiclaim-evidence-phase2.md +148 -0
  112. package/upgrades/side-effects/wikiclaim-evidence-phase3.md +125 -0
  113. package/upgrades/side-effects/wikiclaim-evidence-phase4.md +129 -0
  114. package/upgrades/side-effects/wikiclaim-evidence-phase5.md +285 -0
@@ -0,0 +1,220 @@
1
+ /**
2
+ * `instar memory backfill-evidence` — one-shot migration that walks every
3
+ * existing MemoryEntity, pattern-matches the legacy `source: string` field,
4
+ * and synthesizes a `MemoryEvidence` row when (and only when) the source
5
+ * matches a known shape that the `manual` producer is allowed to write.
6
+ *
7
+ * Per WikiClaim spec § Migration of Existing MemoryEntity Records (line 202)
8
+ * and § Risks line 357 ("Backfill is idempotent and uses only the patterns
9
+ * enumerated above. Anything that doesn't match a known pattern stays
10
+ * `evidence: []`. No LLM in the migration path.") and line 360 ("Backfill
11
+ * defaults `privacyTier: undefined` (inherit from entity). No automatic
12
+ * upgrade to private or sensitive.").
13
+ *
14
+ * **Phase 1 narrowed `manual` producer to `external-url` only** (see
15
+ * `PRODUCER_KIND_ALLOWLIST` in SemanticMemory.ts and the Phase 1 side-effects
16
+ * artifact). Because of that, the only legacy `source` shape backfill can
17
+ * cover is an `https?://` URL. Other patterns the spec lists (`session:ABC`,
18
+ * `user:Justin`, `observation`) would need their own dedicated producer
19
+ * bridges (e.g., `DecisionJournal` for `session`); attempting them here is
20
+ * out-of-scope for Phase 5 — we DELIBERATELY do not widen the allowlist to
21
+ * make migration easier.
22
+ *
23
+ * Idempotency: before writing, the command queries the entity's existing
24
+ * evidence rows; if an `external-url` row with the same path already exists,
25
+ * the entity is skipped. Two consecutive `--apply` runs produce identical
26
+ * end state.
27
+ */
28
+ import path from 'node:path';
29
+ import pc from 'picocolors';
30
+ import { loadConfig } from '../core/Config.js';
31
+ import { SemanticMemory } from '../memory/SemanticMemory.js';
32
+ /**
33
+ * URL pattern: a complete `http://` or `https://` URL as the ENTIRE source
34
+ * string (anchored). We deliberately do NOT extract URLs embedded inside
35
+ * other text — extracting partial URLs creates ambiguity about what the
36
+ * "real" source was and re-runs could backfill different URLs from the same
37
+ * source string as the matcher evolves. Anchoring keeps the migration
38
+ * deterministic.
39
+ *
40
+ * Allowed: `https://example.com/path`, `http://localhost:8080/x?y=z`
41
+ * Rejected: `session:ABC`, `user:Justin`, `observation`, `see https://...`
42
+ */
43
+ const URL_SOURCE_PATTERN = /^https?:\/\/\S+$/;
44
+ /**
45
+ * Public entry: runs the backfill against the SemanticMemory in the given
46
+ * state directory. Returns a structured summary for tests / callers that
47
+ * want to assert on outcomes; the CLI wrapper prints the same data.
48
+ */
49
+ export async function runBackfillEvidence(opts) {
50
+ const config = loadConfig(opts.dir);
51
+ const memory = new SemanticMemory({
52
+ dbPath: path.join(config.stateDir, 'semantic.db'),
53
+ decayHalfLifeDays: 30,
54
+ lessonDecayHalfLifeDays: 90,
55
+ staleThreshold: 0.2,
56
+ });
57
+ await memory.open();
58
+ try {
59
+ return backfillAgainstMemory(memory, opts);
60
+ }
61
+ finally {
62
+ memory.close();
63
+ }
64
+ }
65
+ /**
66
+ * Test-friendly seam: takes an open SemanticMemory instance directly. The
67
+ * CLI wrapper threads loadConfig + open + close around it; tests skip the
68
+ * config dance and pass a memory created against a tmp dir.
69
+ */
70
+ export function backfillAgainstMemory(memory, opts) {
71
+ const viewerScope = opts.viewerScope ?? 'private';
72
+ const dryRun = !!opts.dryRun;
73
+ const { entities } = memory.export();
74
+ const summary = {
75
+ scanned: 0,
76
+ backfilled: 0,
77
+ skipped: 0,
78
+ errors: 0,
79
+ details: [],
80
+ };
81
+ for (const entity of entities) {
82
+ summary.scanned++;
83
+ const source = entity.source ?? '';
84
+ // Pattern-match URL only. Everything else is a deliberate skip per
85
+ // spec § Risks line 357 (no LLM, only known patterns).
86
+ if (!URL_SOURCE_PATTERN.test(source)) {
87
+ summary.skipped++;
88
+ summary.details.push({
89
+ entityId: entity.id,
90
+ source,
91
+ outcome: 'no-pattern-match',
92
+ });
93
+ continue;
94
+ }
95
+ // Idempotency: if an existing external-url evidence row already cites
96
+ // this URL, skip. We read at the WIDEST viewer scope (default 'private',
97
+ // configurable for tests) so the dup-check sees every existing row —
98
+ // a narrow read could miss a row tagged `private` on a `shared-project`
99
+ // entity and cause a duplicate write.
100
+ let existing;
101
+ try {
102
+ existing = memory.getEvidence(entity.id, viewerScope);
103
+ }
104
+ catch (err) {
105
+ summary.errors++;
106
+ summary.details.push({
107
+ entityId: entity.id,
108
+ source,
109
+ outcome: 'error',
110
+ note: err instanceof Error ? err.message : String(err),
111
+ });
112
+ continue;
113
+ }
114
+ const alreadyHas = existing.some((ev) => ev.kind === 'external-url' &&
115
+ (ev.path === source || ev.sourceId === source));
116
+ if (alreadyHas) {
117
+ summary.skipped++;
118
+ summary.details.push({
119
+ entityId: entity.id,
120
+ source,
121
+ outcome: 'already-has-url-evidence',
122
+ });
123
+ continue;
124
+ }
125
+ // Synthesize the evidence row. Per spec § Risks line 360, leave
126
+ // `privacyTier` undefined so it inherits from the entity's scope —
127
+ // never auto-upgrade to `private` / `sensitive`.
128
+ const synthesized = {
129
+ kind: 'external-url',
130
+ // For URLs, sourceId == path == the URL itself. Spec § Producers
131
+ // line 229 keys 'manual external-url' on the URL value as both
132
+ // dedupe identity and display path.
133
+ sourceId: source,
134
+ path: source,
135
+ // updatedAt uses entity's createdAt — preserves temporal ordering
136
+ // and means a second run on the same row produces identical content.
137
+ updatedAt: entity.createdAt,
138
+ // Caller-set confidence/weight per spec § Open Questions; coarse
139
+ // legacy provenance gets a low-confidence float matching the spec's
140
+ // suggested 0.5 for migrated rows.
141
+ confidence: 0.5,
142
+ note: 'Backfilled from legacy MemoryEntity.source (Phase 5 migration)',
143
+ };
144
+ if (dryRun) {
145
+ summary.backfilled++;
146
+ summary.details.push({
147
+ entityId: entity.id,
148
+ source,
149
+ outcome: 'backfilled',
150
+ note: 'dry-run (not written)',
151
+ });
152
+ continue;
153
+ }
154
+ try {
155
+ memory.addEvidence(entity.id, synthesized, 'manual');
156
+ summary.backfilled++;
157
+ summary.details.push({
158
+ entityId: entity.id,
159
+ source,
160
+ outcome: 'backfilled',
161
+ });
162
+ }
163
+ catch (err) {
164
+ summary.errors++;
165
+ summary.details.push({
166
+ entityId: entity.id,
167
+ source,
168
+ outcome: 'error',
169
+ note: err instanceof Error ? err.message : String(err),
170
+ });
171
+ }
172
+ }
173
+ return summary;
174
+ }
175
+ /**
176
+ * Commander entry-point. Prints a human-readable report; structured callers
177
+ * use `runBackfillEvidence` directly.
178
+ */
179
+ export async function memoryBackfillEvidence(opts) {
180
+ try {
181
+ const summary = await runBackfillEvidence(opts);
182
+ console.log(pc.bold('\n Memory backfill-evidence\n'));
183
+ if (opts.dryRun) {
184
+ console.log(pc.yellow(' Dry-run: no writes performed.\n'));
185
+ }
186
+ console.log(` Scanned: ${summary.scanned}`);
187
+ console.log(` Backfilled: ${pc.green(String(summary.backfilled))}`);
188
+ console.log(` Skipped: ${summary.skipped}`);
189
+ if (summary.errors > 0) {
190
+ console.log(` Errors: ${pc.red(String(summary.errors))}`);
191
+ }
192
+ else {
193
+ console.log(` Errors: ${summary.errors}`);
194
+ }
195
+ // Show details only when there's something interesting to look at.
196
+ const interesting = summary.details.filter((d) => d.outcome === 'backfilled' || d.outcome === 'error');
197
+ if (interesting.length > 0) {
198
+ console.log();
199
+ for (const d of interesting) {
200
+ const tag = d.outcome === 'backfilled'
201
+ ? pc.green(' +')
202
+ : pc.red(' !');
203
+ const noteStr = d.note ? pc.dim(` — ${d.note}`) : '';
204
+ console.log(`${tag} ${d.entityId} ${pc.dim(d.source)}${noteStr}`);
205
+ }
206
+ }
207
+ console.log();
208
+ }
209
+ catch (err) {
210
+ if (err instanceof Error && err.message.includes('better-sqlite3')) {
211
+ console.log(pc.yellow('Backfill requires better-sqlite3.'));
212
+ console.log(pc.dim('Install it with: npm install better-sqlite3'));
213
+ }
214
+ else {
215
+ console.log(pc.red(`Backfill failed: ${err instanceof Error ? err.message : err}`));
216
+ }
217
+ process.exit(1);
218
+ }
219
+ }
220
+ //# sourceMappingURL=memoryBackfillEvidence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoryBackfillEvidence.js","sourceRoot":"","sources":["../../src/commands/memoryBackfillEvidence.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAiQH,UAAU,YAAY;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;2DACuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAg4CD,wBAAsB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA4yJtE;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsDzE;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuD5E"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAiQH,UAAU,YAAY;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;2DACuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAg4CD,wBAAsB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAu4JtE;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsDzE;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuD5E"}
@@ -5718,8 +5718,93 @@ export async function startServer(options) {
5718
5718
  }
5719
5719
  const { InitiativeTracker } = await import('../core/InitiativeTracker.js');
5720
5720
  const initiativeTracker = new InitiativeTracker(config.stateDir);
5721
- const server = new AgentServer({ config, sessionManager, state, scheduler, telegram, relationships, feedback, feedbackAnomalyDetector, dispatches, updateChecker, autoUpdater, autoDispatcher, quotaTracker, quotaManager, publisher, viewer, tunnel, evolution, watchdog, topicMemory, triageNurse, projectMapper, coherenceGate: scopeVerifier, contextHierarchy, canonicalState, operationGate, sentinel, adaptiveTrust, memoryMonitor, orphanReaper, coherenceMonitor, commitmentTracker, semanticMemory, activitySentinel, messageRouter, summarySentinel, spawnManager, systemReviewer, capabilityMapper, selfKnowledgeTree, coverageAuditor, topicResumeMap: _topicResumeMap ?? undefined, autonomyManager, trustElevationTracker, autonomousEvolution, coordinator: coordinator.enabled ? coordinator : undefined, localSigningKeyPem, whatsapp: whatsappAdapter, slack: slackAdapter, imessage: imessageAdapter, whatsappBusinessBackend, messageBridge, hookEventReceiver, worktreeMonitor, subagentTracker, instructionsVerifier, handshakeManager: threadlineHandshake, threadlineRouter, threadlineRelayClient, threadlineReplyWaiters, listenerManager: listenerManager ?? undefined, responseReviewGate, messagingToneGate, outboundDedupGate, telemetryHeartbeat, pasteManager, featureRegistry, discoveryEvaluator, unifiedTrust, liveConfig, sharedStateLedger, ledgerSessionRegistry, worktreeManager, oidcEnrolledRepos: parallelDevConfig?.oidcEnrolledRepos, initiativeTracker, proxyCoordinator, telegramBridgeConfig, telegramBridge: telegramBridge ?? undefined, threadlineObservability, workingMemory });
5721
+ // TaskFlow registry — opt-in via config.taskFlow.enabled (default: off in v1).
5722
+ // Owns its own SQLite file under .instar/task-flows.db. The maintenance
5723
+ // sweeper and due-waker start with the registry; both .unref() their timers
5724
+ // so they never keep the process alive on shutdown.
5725
+ let taskFlowRegistry;
5726
+ let taskFlowSweeper;
5727
+ let taskFlowDueWaker;
5728
+ let threadlineFlowBridge;
5729
+ let divergenceChecker;
5730
+ if (config.taskFlow?.enabled) {
5731
+ try {
5732
+ const { TaskFlowStore } = await import('../tasks/task-flow-registry.store.sqlite.js');
5733
+ const { TaskFlowRegistry } = await import('../tasks/TaskFlowRegistry.js');
5734
+ const { TaskFlowMaintenanceSweeper } = await import('../tasks/TaskFlowMaintenanceSweeper.js');
5735
+ const { TaskFlowDueWaker } = await import('../tasks/TaskFlowDueWaker.js');
5736
+ const path = await import('node:path');
5737
+ const dbPath = path.default.join(config.stateDir, 'task-flows.db');
5738
+ const store = new TaskFlowStore({ dbPath });
5739
+ await store.open();
5740
+ taskFlowRegistry = new TaskFlowRegistry({
5741
+ store,
5742
+ ledger: sharedStateLedger ?? undefined,
5743
+ thresholds: config.taskFlow?.thresholds,
5744
+ // Phase 5: rate limits + cache cap. Each field has a documented
5745
+ // default in DEFAULT_RATE_LIMITS / DEFAULT_CACHE_CONFIG.
5746
+ rateLimits: config.taskFlow?.rateLimits,
5747
+ cache: config.taskFlow?.cache,
5748
+ });
5749
+ taskFlowSweeper = new TaskFlowMaintenanceSweeper({
5750
+ registry: taskFlowRegistry,
5751
+ store,
5752
+ ledger: sharedStateLedger ?? undefined,
5753
+ });
5754
+ taskFlowDueWaker = new TaskFlowDueWaker({ registry: taskFlowRegistry });
5755
+ taskFlowSweeper.start();
5756
+ taskFlowDueWaker.start();
5757
+ const { ThreadlineFlowBridge } = await import('../tasks/ThreadlineFlowBridge.js');
5758
+ threadlineFlowBridge = new ThreadlineFlowBridge({ registry: taskFlowRegistry });
5759
+ // Phase 3a — wire EvolutionManager dual-write + divergence checker.
5760
+ const crypto = await import('node:crypto');
5761
+ const controllerInstanceId = crypto.randomUUID();
5762
+ evolution.setTaskFlowRegistry(taskFlowRegistry, controllerInstanceId);
5763
+ // Backfill in-flight clusters into TaskFlow. Idempotent via
5764
+ // `evolution-cluster-create-<id>` idempotency key.
5765
+ try {
5766
+ const migrationReport = await evolution.migrateExistingToTaskFlow();
5767
+ console.log(pc.green(` TaskFlow: backfilled evolution clusters created=${migrationReport.created} ` +
5768
+ `existed=${migrationReport.alreadyExisted} advanced=${migrationReport.advanced} ` +
5769
+ `skipped=${migrationReport.skipped}`));
5770
+ }
5771
+ catch (err) {
5772
+ console.warn('[instar] taskflow evolution backfill failed (non-fatal):', err);
5773
+ }
5774
+ const { DivergenceChecker } = await import('../tasks/DivergenceChecker.js');
5775
+ divergenceChecker = new DivergenceChecker({
5776
+ registry: taskFlowRegistry,
5777
+ evolutionManager: evolution,
5778
+ ledger: sharedStateLedger ?? undefined,
5779
+ });
5780
+ divergenceChecker.start();
5781
+ // Phase 4 — wire InitiativeTracker to TaskFlow as the single source of
5782
+ // truth. Backfill any initiatives present in the legacy
5783
+ // `initiatives.json` file. Idempotent via `findIdempotent` on
5784
+ // `(controllerId="InitiativeTracker", ownerKey, idempotencyKey)`.
5785
+ initiativeTracker.setTaskFlowRegistry(taskFlowRegistry, controllerInstanceId);
5786
+ try {
5787
+ const initiativeReport = await initiativeTracker.migrateExistingToTaskFlow();
5788
+ console.log(pc.green(` TaskFlow: backfilled initiatives created=${initiativeReport.created} ` +
5789
+ `existed=${initiativeReport.alreadyExisted} advanced=${initiativeReport.advanced} ` +
5790
+ `skipped=${initiativeReport.skipped}`));
5791
+ }
5792
+ catch (err) {
5793
+ console.warn('[instar] taskflow initiative backfill failed (non-fatal):', err);
5794
+ }
5795
+ }
5796
+ catch (err) {
5797
+ console.warn('[instar] task-flow init failed (non-fatal):', err);
5798
+ taskFlowRegistry = undefined;
5799
+ threadlineFlowBridge = undefined;
5800
+ divergenceChecker = undefined;
5801
+ }
5802
+ }
5803
+ const server = new AgentServer({ config, sessionManager, state, scheduler, telegram, relationships, feedback, feedbackAnomalyDetector, dispatches, updateChecker, autoUpdater, autoDispatcher, quotaTracker, quotaManager, publisher, viewer, tunnel, evolution, watchdog, topicMemory, triageNurse, projectMapper, coherenceGate: scopeVerifier, contextHierarchy, canonicalState, operationGate, sentinel, adaptiveTrust, memoryMonitor, orphanReaper, coherenceMonitor, commitmentTracker, semanticMemory, activitySentinel, messageRouter, summarySentinel, spawnManager, systemReviewer, capabilityMapper, selfKnowledgeTree, coverageAuditor, topicResumeMap: _topicResumeMap ?? undefined, autonomyManager, trustElevationTracker, autonomousEvolution, coordinator: coordinator.enabled ? coordinator : undefined, localSigningKeyPem, whatsapp: whatsappAdapter, slack: slackAdapter, imessage: imessageAdapter, whatsappBusinessBackend, messageBridge, hookEventReceiver, worktreeMonitor, subagentTracker, instructionsVerifier, handshakeManager: threadlineHandshake, threadlineRouter, threadlineRelayClient, threadlineReplyWaiters, listenerManager: listenerManager ?? undefined, responseReviewGate, messagingToneGate, outboundDedupGate, telemetryHeartbeat, pasteManager, featureRegistry, discoveryEvaluator, unifiedTrust, liveConfig, sharedStateLedger, ledgerSessionRegistry, worktreeManager, oidcEnrolledRepos: parallelDevConfig?.oidcEnrolledRepos, initiativeTracker, proxyCoordinator, telegramBridgeConfig, telegramBridge: telegramBridge ?? undefined, threadlineObservability, workingMemory, taskFlowRegistry, threadlineFlowBridge });
5722
5804
  await server.start();
5805
+ void taskFlowSweeper;
5806
+ void taskFlowDueWaker;
5807
+ void divergenceChecker;
5723
5808
  // Connect DegradationReporter downstream systems now that everything is initialized.
5724
5809
  // Any degradation events queued during startup will drain to feedback + telegram.
5725
5810
  {