@animalabs/connectome-host 0.7.4 → 0.8.0

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 (60) hide show
  1. package/.env.example +12 -5
  2. package/.github/PULL_REQUEST_TEMPLATE.md +3 -2
  3. package/.github/workflows/changelog.yml +9 -4
  4. package/.github/workflows/ci.yml +5 -3
  5. package/.github/workflows/publish.yml +12 -6
  6. package/CHANGELOG.md +245 -0
  7. package/CONTRIBUTING.md +47 -19
  8. package/README.md +27 -0
  9. package/bun.lock +27 -31
  10. package/changelog.d/README.md +28 -0
  11. package/package.json +5 -5
  12. package/recipes/SETUP.md +11 -5
  13. package/recipes/TRIUMVIRATE-SETUP.md +68 -14
  14. package/recipes/knowledge-miner.json +0 -30
  15. package/recipes/mock-test.json +19 -0
  16. package/recipes/triumvirate.json +6 -1
  17. package/scripts/release-changelog.ts +210 -21
  18. package/src/cache-keepalive-log.ts +41 -0
  19. package/src/commands.ts +96 -0
  20. package/src/framework-strategy.ts +37 -0
  21. package/src/gate-telemetry.ts +106 -0
  22. package/src/headless.ts +10 -0
  23. package/src/index.ts +167 -55
  24. package/src/mcpl-config.ts +99 -1
  25. package/src/modules/identity-module.ts +310 -2
  26. package/src/modules/instructions-module.ts +265 -0
  27. package/src/modules/mcpl-admin-module.ts +58 -11
  28. package/src/modules/subagent-module.ts +18 -0
  29. package/src/recipe.ts +732 -25
  30. package/src/web/panel-data.ts +19 -0
  31. package/src/workspace-mounts.ts +73 -0
  32. package/test/audit-module-optins.test.ts +10 -3
  33. package/test/cache-keepalive-log.test.ts +83 -0
  34. package/test/conversations-recipe.test.ts +142 -0
  35. package/test/framework-fkm-composition.test.ts +35 -3
  36. package/test/framework-strategy-defaults.test.ts +19 -0
  37. package/test/gate-telemetry-adapter.test.ts +84 -0
  38. package/test/gate-telemetry.test.ts +91 -0
  39. package/test/identity-and-surfaces.test.ts +212 -1
  40. package/test/instructions-module.test.ts +258 -0
  41. package/test/mcpl-admin-module.test.ts +41 -0
  42. package/test/mcpl-agent-overlay.test.ts +51 -3
  43. package/test/mcpl-child-env.test.ts +64 -0
  44. package/test/nudge-command.test.ts +47 -0
  45. package/test/recipe-cache-keepalive.test.ts +59 -0
  46. package/test/recipe-compression-fallback.test.ts +19 -0
  47. package/test/recipe-hybrid-prose-routing.test.ts +12 -0
  48. package/test/recipe-instructions.test.ts +176 -0
  49. package/test/recipe-kv-unified.test.ts +87 -0
  50. package/test/recipe-mcp-source.test.ts +54 -0
  51. package/test/recipe-openai-compatible.test.ts +54 -0
  52. package/test/recipe-path-resolution.test.ts +19 -8
  53. package/test/recipe-provider.test.ts +14 -0
  54. package/test/recipe-save-unresolved.test.ts +244 -0
  55. package/test/recipe-source-only.test.ts +38 -0
  56. package/test/release-changelog.test.ts +202 -0
  57. package/test/subagent-prose-routing.test.ts +109 -0
  58. package/test/workspace-mounts.test.ts +68 -0
  59. package/web/src/App.tsx +1 -0
  60. package/web/src/Health.tsx +61 -1
@@ -72,6 +72,36 @@ export interface HealthSnapshot {
72
72
  } | null;
73
73
  }>;
74
74
  compressionQuarantine?: Record<string, { count?: number; keys?: string[] }>;
75
+
76
+ /** cm's single-authority debt reduction (getCompressionDebt) — the QUEUE
77
+
78
+ * of closed-but-uncompressed chunks. Distinct from contextComposition:
79
+
80
+ * composition says what the last compile RENDERED (summaries L1 = 0 there
81
+
82
+ * means "no L1 tokens in the window", often healthy consolidation);
83
+
84
+ * this block says what the memory organ still OWES. Absent per-agent
85
+
86
+ * entry = the stack predates the reduction — render that as
87
+
88
+ * "not reported", never as zero (misread twice on 2026-08-29). */
89
+
90
+ compressionDebt?: Record<string, {
91
+
92
+ state?: 'healthy' | 'degraded' | 'critical';
93
+
94
+ pendingChunks?: number;
95
+
96
+ oldestPendingAgeMs?: number | null;
97
+
98
+ mergeQueueDepth?: number;
99
+
100
+ mergeQuarantineCount?: number;
101
+
102
+ compressionQuarantineCount?: number;
103
+
104
+ }>;
75
105
  runtimeSettings?: Record<string, {
76
106
  contextBudgetTokens?: number;
77
107
  tailTokens?: number;
@@ -301,6 +331,7 @@ export function HealthPanel(props: {
301
331
  }) {
302
332
  const agents = () => props.health?.agents ?? [];
303
333
  const quarantine = (name: string) => props.health?.compressionQuarantine?.[name];
334
+ const debt = (name: string) => props.health?.compressionDebt?.[name];
304
335
  const settings = (name: string) => props.health?.runtimeSettings?.[name];
305
336
  const composition = (name: string) => props.health?.contextComposition?.[name];
306
337
 
@@ -343,7 +374,10 @@ export function HealthPanel(props: {
343
374
  <span>up {fmtUptime(props.health!.uptimeSec!)}</span>
344
375
  </Show>
345
376
  <Show when={props.health!.pendingRequests !== undefined}>
346
- <span>{props.health!.pendingRequests} queued</span>
377
+ {/* the INFERENCE queue (requests waiting to run) — not compression
378
+ debt; that lives per-agent below. A bare "queued" invited the
379
+ misread, hence the explicit label. */}
380
+ <span>{props.health!.pendingRequests} inference queued</span>
347
381
  </Show>
348
382
  <Show when={props.health!.activeStreams !== undefined}>
349
383
  <span>{props.health!.activeStreams!.length} streaming</span>
@@ -388,6 +422,32 @@ export function HealthPanel(props: {
388
422
  </div>
389
423
  </Show>
390
424
 
425
+ {/* Compression debt: the organ's QUEUE, not the render composition.
426
+ An old stack that reports nothing must say so — absence
427
+ rendered as zero invites misreads. */}
428
+ <Show when={debt(a.name)} fallback={
429
+ <div class="text-neutral-600">compression debt: not reported by this stack</div>
430
+ }>
431
+ <div class={
432
+ debt(a.name)!.state === 'critical' ? 'text-rose-300'
433
+ : debt(a.name)!.state === 'degraded' ? 'text-amber-300/90'
434
+ : 'text-neutral-500'
435
+ }>
436
+ compression debt: {debt(a.name)!.state ?? '?'}
437
+ {' · '}{debt(a.name)!.pendingChunks ?? 0} chunk(s) pending
438
+ <Show when={(debt(a.name)!.pendingChunks ?? 0) > 0}>
439
+ <span>
440
+ {debt(a.name)!.oldestPendingAgeMs != null
441
+ ? ` · oldest ${Math.round(debt(a.name)!.oldestPendingAgeMs! / 60000)}m`
442
+ : ' · age unknown'}
443
+ </span>
444
+ </Show>
445
+ <Show when={(debt(a.name)!.mergeQueueDepth ?? 0) > 0}>
446
+ <span> · merge queue {debt(a.name)!.mergeQueueDepth}</span>
447
+ </Show>
448
+ </div>
449
+ </Show>
450
+
391
451
  <Show when={a.refusalStats && (a.refusalStats.total ?? 0) > 0}>
392
452
  <div class="text-amber-300/90">
393
453
  refusals: {a.refusalStats!.total}