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.
- package/dashboard/index.html +239 -0
- package/dist/cli.js +10 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/intent.d.ts.map +1 -1
- package/dist/commands/intent.js +29 -2
- package/dist/commands/intent.js.map +1 -1
- package/dist/commands/memoryBackfillEvidence.d.ts +69 -0
- package/dist/commands/memoryBackfillEvidence.d.ts.map +1 -0
- package/dist/commands/memoryBackfillEvidence.js +220 -0
- package/dist/commands/memoryBackfillEvidence.js.map +1 -0
- package/dist/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +86 -1
- package/dist/commands/server.js.map +1 -1
- package/dist/core/DecisionJournal.d.ts +66 -3
- package/dist/core/DecisionJournal.d.ts.map +1 -1
- package/dist/core/DecisionJournal.js +116 -3
- package/dist/core/DecisionJournal.js.map +1 -1
- package/dist/core/DispatchExecutor.d.ts +74 -1
- package/dist/core/DispatchExecutor.d.ts.map +1 -1
- package/dist/core/DispatchExecutor.js +120 -1
- package/dist/core/DispatchExecutor.js.map +1 -1
- package/dist/core/EvolutionManager.d.ts +133 -0
- package/dist/core/EvolutionManager.d.ts.map +1 -1
- package/dist/core/EvolutionManager.js +494 -0
- package/dist/core/EvolutionManager.js.map +1 -1
- package/dist/core/InitiativeTracker.d.ts +82 -15
- package/dist/core/InitiativeTracker.d.ts.map +1 -1
- package/dist/core/InitiativeTracker.js +502 -31
- package/dist/core/InitiativeTracker.js.map +1 -1
- package/dist/core/LearnSkillBridge.d.ts +119 -0
- package/dist/core/LearnSkillBridge.d.ts.map +1 -0
- package/dist/core/LearnSkillBridge.js +160 -0
- package/dist/core/LearnSkillBridge.js.map +1 -0
- package/dist/core/SharedStateLedger.d.ts.map +1 -1
- package/dist/core/SharedStateLedger.js +4 -0
- package/dist/core/SharedStateLedger.js.map +1 -1
- package/dist/core/types.d.ts +124 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +8 -0
- package/dist/core/types.js.map +1 -1
- package/dist/memory/EvidenceRenderer.d.ts +64 -0
- package/dist/memory/EvidenceRenderer.d.ts.map +1 -0
- package/dist/memory/EvidenceRenderer.js +119 -0
- package/dist/memory/EvidenceRenderer.js.map +1 -0
- package/dist/memory/SemanticMemory.d.ts +61 -1
- package/dist/memory/SemanticMemory.d.ts.map +1 -1
- package/dist/memory/SemanticMemory.js +381 -11
- package/dist/memory/SemanticMemory.js.map +1 -1
- package/dist/server/AgentServer.d.ts +4 -0
- package/dist/server/AgentServer.d.ts.map +1 -1
- package/dist/server/AgentServer.js +2 -0
- package/dist/server/AgentServer.js.map +1 -1
- package/dist/server/routes.d.ts +8 -0
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +500 -14
- package/dist/server/routes.js.map +1 -1
- package/dist/tasks/DivergenceChecker.d.ts +89 -0
- package/dist/tasks/DivergenceChecker.d.ts.map +1 -0
- package/dist/tasks/DivergenceChecker.js +255 -0
- package/dist/tasks/DivergenceChecker.js.map +1 -0
- package/dist/tasks/LruCache.d.ts +33 -0
- package/dist/tasks/LruCache.d.ts.map +1 -0
- package/dist/tasks/LruCache.js +88 -0
- package/dist/tasks/LruCache.js.map +1 -0
- package/dist/tasks/RateLimiter.d.ts +61 -0
- package/dist/tasks/RateLimiter.d.ts.map +1 -0
- package/dist/tasks/RateLimiter.js +108 -0
- package/dist/tasks/RateLimiter.js.map +1 -0
- package/dist/tasks/TaskFlowDueWaker.d.ts +29 -0
- package/dist/tasks/TaskFlowDueWaker.d.ts.map +1 -0
- package/dist/tasks/TaskFlowDueWaker.js +73 -0
- package/dist/tasks/TaskFlowDueWaker.js.map +1 -0
- package/dist/tasks/TaskFlowMaintenanceSweeper.d.ts +40 -0
- package/dist/tasks/TaskFlowMaintenanceSweeper.d.ts.map +1 -0
- package/dist/tasks/TaskFlowMaintenanceSweeper.js +131 -0
- package/dist/tasks/TaskFlowMaintenanceSweeper.js.map +1 -0
- package/dist/tasks/TaskFlowRegistry.d.ts +180 -0
- package/dist/tasks/TaskFlowRegistry.d.ts.map +1 -0
- package/dist/tasks/TaskFlowRegistry.js +791 -0
- package/dist/tasks/TaskFlowRegistry.js.map +1 -0
- package/dist/tasks/ThreadlineFlowBridge.d.ts +54 -0
- package/dist/tasks/ThreadlineFlowBridge.d.ts.map +1 -0
- package/dist/tasks/ThreadlineFlowBridge.js +129 -0
- package/dist/tasks/ThreadlineFlowBridge.js.map +1 -0
- package/dist/tasks/task-flow-registry.store.sqlite.d.ts +77 -0
- package/dist/tasks/task-flow-registry.store.sqlite.d.ts.map +1 -0
- package/dist/tasks/task-flow-registry.store.sqlite.js +350 -0
- package/dist/tasks/task-flow-registry.store.sqlite.js.map +1 -0
- package/dist/tasks/task-flow-types.d.ts +229 -0
- package/dist/tasks/task-flow-types.d.ts.map +1 -0
- package/dist/tasks/task-flow-types.js +128 -0
- package/dist/tasks/task-flow-types.js.map +1 -0
- package/dist/threadline/ThreadlineMCPServer.d.ts +32 -0
- package/dist/threadline/ThreadlineMCPServer.d.ts.map +1 -1
- package/dist/threadline/ThreadlineMCPServer.js +82 -5
- package/dist/threadline/ThreadlineMCPServer.js.map +1 -1
- package/dist/threadline/mcp-stdio-entry.js +56 -0
- package/dist/threadline/mcp-stdio-entry.js.map +1 -1
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +78 -78
- package/upgrades/0.28.84.md +89 -0
- package/upgrades/0.28.85.md +64 -0
- package/upgrades/side-effects/0.28.83.md +27 -0
- package/upgrades/side-effects/taskflow-phase1.md +130 -0
- package/upgrades/side-effects/taskflow-phase2.md +110 -0
- package/upgrades/side-effects/taskflow-phase3a.md +138 -0
- package/upgrades/side-effects/taskflow-phase4.md +377 -0
- package/upgrades/side-effects/taskflow-phase5.md +234 -0
- package/upgrades/side-effects/threadline-discover-relay-and-trust.md +122 -0
- package/upgrades/side-effects/wikiclaim-evidence-phase1.md +138 -0
- package/upgrades/side-effects/wikiclaim-evidence-phase2.md +148 -0
- package/upgrades/side-effects/wikiclaim-evidence-phase3.md +125 -0
- package/upgrades/side-effects/wikiclaim-evidence-phase4.md +129 -0
- 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,
|
|
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"}
|
package/dist/commands/server.js
CHANGED
|
@@ -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
|
-
|
|
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
|
{
|