@jungjaehoon/mama-os 0.21.0 → 0.22.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 (129) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/README.md +12 -4
  3. package/dist/agent/agent-loop.d.ts.map +1 -1
  4. package/dist/agent/agent-loop.js +76 -11
  5. package/dist/agent/agent-loop.js.map +1 -1
  6. package/dist/agent/code-act/host-bridge.d.ts.map +1 -1
  7. package/dist/agent/code-act/host-bridge.js +74 -0
  8. package/dist/agent/code-act/host-bridge.js.map +1 -1
  9. package/dist/agent/codex-mcp-process.d.ts +1 -0
  10. package/dist/agent/codex-mcp-process.d.ts.map +1 -1
  11. package/dist/agent/codex-mcp-process.js +3 -2
  12. package/dist/agent/codex-mcp-process.js.map +1 -1
  13. package/dist/agent/gateway-tool-executor.d.ts +16 -1
  14. package/dist/agent/gateway-tool-executor.d.ts.map +1 -1
  15. package/dist/agent/gateway-tool-executor.js +148 -2
  16. package/dist/agent/gateway-tool-executor.js.map +1 -1
  17. package/dist/agent/gateway-tools.md +6 -1
  18. package/dist/agent/model-runner.d.ts +8 -0
  19. package/dist/agent/model-runner.d.ts.map +1 -1
  20. package/dist/agent/model-runner.js.map +1 -1
  21. package/dist/agent/persistent-cli-adapter.d.ts +6 -0
  22. package/dist/agent/persistent-cli-adapter.d.ts.map +1 -1
  23. package/dist/agent/persistent-cli-adapter.js +21 -10
  24. package/dist/agent/persistent-cli-adapter.js.map +1 -1
  25. package/dist/agent/tool-registry.d.ts.map +1 -1
  26. package/dist/agent/tool-registry.js +32 -1
  27. package/dist/agent/tool-registry.js.map +1 -1
  28. package/dist/agent/types.d.ts +26 -2
  29. package/dist/agent/types.d.ts.map +1 -1
  30. package/dist/agent/types.js.map +1 -1
  31. package/dist/api/index.d.ts +1 -1
  32. package/dist/api/index.d.ts.map +1 -1
  33. package/dist/api/index.js +15 -13
  34. package/dist/api/index.js.map +1 -1
  35. package/dist/api/operator-handler.d.ts +2 -0
  36. package/dist/api/operator-handler.d.ts.map +1 -1
  37. package/dist/api/operator-handler.js +23 -5
  38. package/dist/api/operator-handler.js.map +1 -1
  39. package/dist/api/operator-summary.d.ts +3 -0
  40. package/dist/api/operator-summary.d.ts.map +1 -0
  41. package/dist/api/operator-summary.js +72 -0
  42. package/dist/api/operator-summary.js.map +1 -0
  43. package/dist/api/operator-tasks-handler.d.ts +7 -0
  44. package/dist/api/operator-tasks-handler.d.ts.map +1 -0
  45. package/dist/api/operator-tasks-handler.js +165 -0
  46. package/dist/api/operator-tasks-handler.js.map +1 -0
  47. package/dist/cli/commands/start.d.ts.map +1 -1
  48. package/dist/cli/commands/start.js +62 -12
  49. package/dist/cli/commands/start.js.map +1 -1
  50. package/dist/cli/runtime/agent-loop-init.d.ts +2 -1
  51. package/dist/cli/runtime/agent-loop-init.d.ts.map +1 -1
  52. package/dist/cli/runtime/agent-loop-init.js +16 -8
  53. package/dist/cli/runtime/agent-loop-init.js.map +1 -1
  54. package/dist/cli/runtime/api-routes-init.d.ts.map +1 -1
  55. package/dist/cli/runtime/api-routes-init.js +129 -13
  56. package/dist/cli/runtime/api-routes-init.js.map +1 -1
  57. package/dist/cli/runtime/gateway-init.d.ts.map +1 -1
  58. package/dist/cli/runtime/gateway-init.js +3 -1
  59. package/dist/cli/runtime/gateway-init.js.map +1 -1
  60. package/dist/cli/runtime/memory-agent-init.d.ts +2 -1
  61. package/dist/cli/runtime/memory-agent-init.d.ts.map +1 -1
  62. package/dist/cli/runtime/memory-agent-init.js +15 -3
  63. package/dist/cli/runtime/memory-agent-init.js.map +1 -1
  64. package/dist/connectors/framework/types.d.ts +8 -0
  65. package/dist/connectors/framework/types.d.ts.map +1 -1
  66. package/dist/connectors/slack/index.d.ts.map +1 -1
  67. package/dist/connectors/slack/index.js +3 -1
  68. package/dist/connectors/slack/index.js.map +1 -1
  69. package/dist/connectors/trello/index.d.ts.map +1 -1
  70. package/dist/connectors/trello/index.js +6 -2
  71. package/dist/connectors/trello/index.js.map +1 -1
  72. package/dist/db/agent-store.d.ts +5 -0
  73. package/dist/db/agent-store.d.ts.map +1 -1
  74. package/dist/db/agent-store.js +6 -3
  75. package/dist/db/agent-store.js.map +1 -1
  76. package/dist/db/migrations/agent-activity-tool-name.d.ts +8 -0
  77. package/dist/db/migrations/agent-activity-tool-name.d.ts.map +1 -0
  78. package/dist/db/migrations/agent-activity-tool-name.js +24 -0
  79. package/dist/db/migrations/agent-activity-tool-name.js.map +1 -0
  80. package/dist/envelope/run-guard.d.ts +10 -0
  81. package/dist/envelope/run-guard.d.ts.map +1 -0
  82. package/dist/envelope/run-guard.js +19 -0
  83. package/dist/envelope/run-guard.js.map +1 -0
  84. package/dist/multi-agent/agent-event-bus.d.ts +4 -0
  85. package/dist/multi-agent/agent-event-bus.d.ts.map +1 -1
  86. package/dist/multi-agent/agent-event-bus.js.map +1 -1
  87. package/dist/multi-agent/dashboard-agent-persona.d.ts.map +1 -1
  88. package/dist/multi-agent/dashboard-agent-persona.js +18 -5
  89. package/dist/multi-agent/dashboard-agent-persona.js.map +1 -1
  90. package/dist/multi-agent/runtime-process.d.ts +4 -2
  91. package/dist/multi-agent/runtime-process.d.ts.map +1 -1
  92. package/dist/multi-agent/runtime-process.js +7 -4
  93. package/dist/multi-agent/runtime-process.js.map +1 -1
  94. package/dist/operator/action-verifier.d.ts +50 -0
  95. package/dist/operator/action-verifier.d.ts.map +1 -0
  96. package/dist/operator/action-verifier.js +68 -0
  97. package/dist/operator/action-verifier.js.map +1 -0
  98. package/dist/operator/board-reconcile.d.ts +62 -0
  99. package/dist/operator/board-reconcile.d.ts.map +1 -0
  100. package/dist/operator/board-reconcile.js +160 -0
  101. package/dist/operator/board-reconcile.js.map +1 -0
  102. package/dist/operator/board-slot-instructions.d.ts +8 -0
  103. package/dist/operator/board-slot-instructions.d.ts.map +1 -1
  104. package/dist/operator/board-slot-instructions.js +25 -1
  105. package/dist/operator/board-slot-instructions.js.map +1 -1
  106. package/dist/operator/operator-trigger-loop.d.ts +15 -2
  107. package/dist/operator/operator-trigger-loop.d.ts.map +1 -1
  108. package/dist/operator/operator-trigger-loop.js +40 -1
  109. package/dist/operator/operator-trigger-loop.js.map +1 -1
  110. package/dist/operator/report-scheduler.d.ts +23 -0
  111. package/dist/operator/report-scheduler.d.ts.map +1 -1
  112. package/dist/operator/report-scheduler.js +56 -8
  113. package/dist/operator/report-scheduler.js.map +1 -1
  114. package/dist/operator/situation-report.d.ts +5 -1
  115. package/dist/operator/situation-report.d.ts.map +1 -1
  116. package/dist/operator/situation-report.js +12 -2
  117. package/dist/operator/situation-report.js.map +1 -1
  118. package/dist/operator/task-ledger.d.ts +96 -0
  119. package/dist/operator/task-ledger.d.ts.map +1 -0
  120. package/dist/operator/task-ledger.js +277 -0
  121. package/dist/operator/task-ledger.js.map +1 -0
  122. package/package.json +1 -1
  123. package/public/ui/assets/index-CKOJQYXA.css +1 -0
  124. package/public/ui/assets/index-OSgiwL24.js +62 -0
  125. package/public/ui/index.html +3 -2
  126. package/public/ui/theme-init.js +20 -0
  127. package/public/viewer/viewer.html +12 -28
  128. package/public/ui/assets/index-BDsaQNGd.js +0 -62
  129. package/public/ui/assets/index-C4URnm_X.css +0 -1
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ /**
3
+ * board-reconcile - the delta -> taskboard reconcile contract (M8 Phase 1).
4
+ *
5
+ * Ports Kagemusha's taskboard reconcile mechanism (agent-awareness.ts
6
+ * buildTaskboardReconcilePrompt / runTaskboardReconcile): when a channel delta
7
+ * arrives, the AGENT judges which board slots are affected and MUST either act
8
+ * (partial report_publish / task_create / task_update) or record a
9
+ * contract_no_update note. The system only debounces, budgets, and serializes;
10
+ * every judgment is the agent's (agent-first).
11
+ *
12
+ * Freshness-layer semantics: the 30-minute dashboard cron remains the
13
+ * repair/catch-up pass. Over-budget work is DEFERRED (channel stays dirty with
14
+ * its pending lines), never silently dropped; a crash loses at most one
15
+ * debounce window, which the next cron repairs.
16
+ */
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.ReconcileScheduler = exports.RECONCILE_RUN_TOKEN = void 0;
19
+ exports.buildReconcilePrompt = buildReconcilePrompt;
20
+ /** The prompt MUST begin with this token so the persona's RECONCILE RUN mode engages. */
21
+ exports.RECONCILE_RUN_TOKEN = 'RECONCILE RUN';
22
+ function buildReconcilePrompt(input) {
23
+ const label = input.channelLabel ?? input.channelKey;
24
+ const scope = `reconcile:${input.channelKey}`;
25
+ return [
26
+ `${exports.RECONCILE_RUN_TOKEN} for channel ${label} (${input.channelKey}). Today is ${input.todayIso}.`,
27
+ 'New messages arrived in this channel. Reconcile the operator board and the task ledger',
28
+ 'against them. Plan (execute in order):',
29
+ '1. Read the delta lines below.',
30
+ `2. task_list() for existing work items${input.kagemushaContext ? ' and kagemusha_tasks() as extra CONTEXT (the native ledger stays the projection source)' : ''}.`,
31
+ '3. Judge which slots are affected (briefing / action_required / decisions / pipeline).',
32
+ '4. You MUST call at least ONE of: report_publish with ONLY the affected slots,',
33
+ ' task_create, or task_update -- when the delta concerns work that ALREADY has a',
34
+ ' task row (match by title or source in step 2), task_update that row instead of',
35
+ ' creating a near-duplicate, and pass source_channel plus source_event_id from the',
36
+ ' delta header so retries upsert. If NOTHING on the board or ledger is affected,',
37
+ ` you MUST call contract_no_update({reason, scope: "${scope}"}) instead.`,
38
+ '5. Finish with exactly one line: RECONCILED <comma-separated slots or none>.',
39
+ '',
40
+ 'Constraints: do not rewrite unaffected slots; no mama_save; no follow-up questions.',
41
+ '',
42
+ `<latest-delta channel="${input.channelKey}">`,
43
+ ...input.deltaLines,
44
+ '</latest-delta>',
45
+ ].join('\n');
46
+ }
47
+ class ReconcileScheduler {
48
+ debounceMs;
49
+ maxWaitMs;
50
+ globalMaxPerHour;
51
+ maxPendingLines;
52
+ run;
53
+ log;
54
+ now;
55
+ channels = new Map();
56
+ runTimestamps = [];
57
+ retryTimer = null;
58
+ stopped = false;
59
+ constructor(opts) {
60
+ this.debounceMs = opts.debounceMs ?? 180_000;
61
+ this.maxWaitMs = opts.maxWaitMs ?? 600_000;
62
+ this.globalMaxPerHour = opts.globalMaxPerHour ?? 12;
63
+ this.maxPendingLines = opts.maxPendingLines ?? 30;
64
+ this.run = opts.run;
65
+ this.log = opts.log;
66
+ this.now = opts.now ?? Date.now;
67
+ }
68
+ enqueue(channelKey, lines) {
69
+ if (this.stopped)
70
+ return;
71
+ const state = this.channels.get(channelKey) ?? {
72
+ pendingLines: [],
73
+ debounceTimer: null,
74
+ firstEnqueuedAt: null,
75
+ };
76
+ state.pendingLines = [...state.pendingLines, ...lines].slice(-this.maxPendingLines);
77
+ if (state.firstEnqueuedAt === null)
78
+ state.firstEnqueuedAt = this.now();
79
+ this.channels.set(channelKey, state);
80
+ if (state.debounceTimer)
81
+ clearTimeout(state.debounceTimer);
82
+ // Trailing debounce with a max-wait bound: continuous traffic cannot
83
+ // starve the channel past maxWaitMs since its first pending event.
84
+ const sinceFirst = this.now() - state.firstEnqueuedAt;
85
+ const delay = Math.max(0, Math.min(this.debounceMs, this.maxWaitMs - sinceFirst));
86
+ const timer = setTimeout(() => {
87
+ state.debounceTimer = null;
88
+ void this.fire(channelKey);
89
+ }, delay);
90
+ timer.unref?.();
91
+ state.debounceTimer = timer;
92
+ }
93
+ /** Channels currently holding deferred/pending work (for observability). */
94
+ dirtyChannels() {
95
+ return [...this.channels.entries()]
96
+ .filter(([, s]) => s.pendingLines.length > 0)
97
+ .map(([k]) => k);
98
+ }
99
+ stop() {
100
+ this.stopped = true;
101
+ for (const state of this.channels.values()) {
102
+ if (state.debounceTimer)
103
+ clearTimeout(state.debounceTimer);
104
+ state.debounceTimer = null;
105
+ }
106
+ if (this.retryTimer)
107
+ clearTimeout(this.retryTimer);
108
+ this.retryTimer = null;
109
+ }
110
+ budgetAvailable() {
111
+ const cutoff = this.now() - 3_600_000;
112
+ this.runTimestamps = this.runTimestamps.filter((t) => t > cutoff);
113
+ return this.runTimestamps.length < this.globalMaxPerHour;
114
+ }
115
+ scheduleRetry() {
116
+ if (this.retryTimer || this.stopped)
117
+ return;
118
+ const timer = setTimeout(() => {
119
+ this.retryTimer = null;
120
+ const dirty = this.dirtyChannels();
121
+ for (const key of dirty) {
122
+ const state = this.channels.get(key);
123
+ if (state && !state.debounceTimer)
124
+ void this.fire(key);
125
+ }
126
+ }, 60_000);
127
+ timer.unref?.();
128
+ this.retryTimer = timer;
129
+ }
130
+ async fire(channelKey) {
131
+ if (this.stopped)
132
+ return;
133
+ const state = this.channels.get(channelKey);
134
+ if (!state || state.pendingLines.length === 0)
135
+ return;
136
+ if (!this.budgetAvailable()) {
137
+ // DEFER, never drop: the channel stays dirty and retries when budget frees.
138
+ this.log(`[reconcile] global budget exhausted (${this.globalMaxPerHour}/h); deferring ${channelKey} (${state.pendingLines.length} lines kept)`);
139
+ this.scheduleRetry();
140
+ return;
141
+ }
142
+ const lines = state.pendingLines;
143
+ state.pendingLines = [];
144
+ state.firstEnqueuedAt = null;
145
+ this.runTimestamps.push(this.now());
146
+ try {
147
+ await this.run(channelKey, lines);
148
+ }
149
+ catch (err) {
150
+ // Run failure keeps the channel dirty for retry; the scheduler survives.
151
+ state.pendingLines = [...lines, ...state.pendingLines].slice(-this.maxPendingLines);
152
+ if (state.firstEnqueuedAt === null)
153
+ state.firstEnqueuedAt = this.now();
154
+ this.log(`[reconcile] run failed for ${channelKey}: ${err instanceof Error ? err.message : String(err)}; kept dirty for retry`);
155
+ this.scheduleRetry();
156
+ }
157
+ }
158
+ }
159
+ exports.ReconcileScheduler = ReconcileScheduler;
160
+ //# sourceMappingURL=board-reconcile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"board-reconcile.js","sourceRoot":"","sources":["../../src/operator/board-reconcile.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AAeH,oDAwBC;AA3BD,yFAAyF;AAC5E,QAAA,mBAAmB,GAAG,eAAe,CAAC;AAEnD,SAAgB,oBAAoB,CAAC,KAA2B;IAC9D,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,UAAU,CAAC;IACrD,MAAM,KAAK,GAAG,aAAa,KAAK,CAAC,UAAU,EAAE,CAAC;IAC9C,OAAO;QACL,GAAG,2BAAmB,gBAAgB,KAAK,KAAK,KAAK,CAAC,UAAU,eAAe,KAAK,CAAC,QAAQ,GAAG;QAChG,wFAAwF;QACxF,wCAAwC;QACxC,gCAAgC;QAChC,yCAAyC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,yFAAyF,CAAC,CAAC,CAAC,EAAE,GAAG;QACnK,wFAAwF;QACxF,gFAAgF;QAChF,mFAAmF;QACnF,mFAAmF;QACnF,qFAAqF;QACrF,mFAAmF;QACnF,wDAAwD,KAAK,cAAc;QAC3E,8EAA8E;QAC9E,EAAE;QACF,qFAAqF;QACrF,EAAE;QACF,0BAA0B,KAAK,CAAC,UAAU,IAAI;QAC9C,GAAG,KAAK,CAAC,UAAU;QACnB,iBAAiB;KAClB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAsBD,MAAa,kBAAkB;IACZ,UAAU,CAAS;IACnB,SAAS,CAAS;IAClB,gBAAgB,CAAS;IACzB,eAAe,CAAS;IACxB,GAAG,CAAmC;IACtC,GAAG,CAAmC;IACtC,GAAG,CAAe;IAE3B,QAAQ,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC3C,aAAa,GAAa,EAAE,CAAC;IAC7B,UAAU,GAAyC,IAAI,CAAC;IACxD,OAAO,GAAG,KAAK,CAAC;IAExB,YAAY,IAA+B;QACzC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC;QAC7C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC;QAC3C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC;QACpD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,IAAI,EAAE,CAAC;QAClD,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACpB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACpB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IAClC,CAAC;IAED,OAAO,CAAC,UAAkB,EAAE,KAAe;QACzC,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI;YAC7C,YAAY,EAAE,EAAE;YAChB,aAAa,EAAE,IAAI;YACnB,eAAe,EAAE,IAAI;SACtB,CAAC;QACF,KAAK,CAAC,YAAY,GAAG,CAAC,GAAG,KAAK,CAAC,YAAY,EAAE,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACpF,IAAI,KAAK,CAAC,eAAe,KAAK,IAAI;YAAE,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAErC,IAAI,KAAK,CAAC,aAAa;YAAE,YAAY,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC3D,qEAAqE;QACrE,mEAAmE;QACnE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,eAAe,CAAC;QACtD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC;QAClF,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC;YAC3B,KAAK,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7B,CAAC,EAAE,KAAK,CAAC,CAAC;QACV,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;QAChB,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC;IAC9B,CAAC;IAED,4EAA4E;IAC5E,aAAa;QACX,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;aAChC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;aAC5C,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IAED,IAAI;QACF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3C,IAAI,KAAK,CAAC,aAAa;gBAAE,YAAY,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAC3D,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC;QAC7B,CAAC;QACD,IAAI,IAAI,CAAC,UAAU;YAAE,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACzB,CAAC;IAEO,eAAe;QACrB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QACtC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;QAClE,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC;IAC3D,CAAC;IAEO,aAAa;QACnB,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QAC5C,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACnC,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;gBACxB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACrC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,aAAa;oBAAE,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACzD,CAAC;QACH,CAAC,EAAE,MAAM,CAAC,CAAC;QACX,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;QAChB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IAEO,KAAK,CAAC,IAAI,CAAC,UAAkB;QACnC,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC5C,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEtD,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;YAC5B,4EAA4E;YAC5E,IAAI,CAAC,GAAG,CACN,wCAAwC,IAAI,CAAC,gBAAgB,kBAAkB,UAAU,KAAK,KAAK,CAAC,YAAY,CAAC,MAAM,cAAc,CACtI,CAAC;YACF,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC;QACjC,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC;QACxB,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAEpC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,yEAAyE;YACzE,KAAK,CAAC,YAAY,GAAG,CAAC,GAAG,KAAK,EAAE,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACpF,IAAI,KAAK,CAAC,eAAe,KAAK,IAAI;gBAAE,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvE,IAAI,CAAC,GAAG,CACN,8BAA8B,UAAU,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,wBAAwB,CACtH,CAAC;YACF,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;CACF;AApHD,gDAoHC"}
@@ -13,6 +13,14 @@
13
13
  export declare const BOARD_SLOT_ORDER: readonly ["briefing", "action_required", "decisions", "pipeline"];
14
14
  /** The exact HTML shapes the board stylesheet understands. */
15
15
  export declare function buildBoardHtmlVocabulary(): string[];
16
+ /**
17
+ * Pipeline slot = item tracker projection (M8 Phase 3). Injected into EVERY
18
+ * board writer (dashboard persona, cron prompt, the trigger loop's full
19
+ * report) so both writers project the same tracker. D-day arithmetic uses the
20
+ * "Today is <date>" line each RUN PROMPT carries -- personas are static files
21
+ * and must never bake in a date.
22
+ */
23
+ export declare function buildPipelineTrackerInstructions(): string[];
16
24
  /** Instruction block that makes a report run also publish the board slots. */
17
25
  export declare function buildBoardPublishLines(): string[];
18
26
  //# sourceMappingURL=board-slot-instructions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"board-slot-instructions.d.ts","sourceRoot":"","sources":["../../src/operator/board-slot-instructions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,eAAO,MAAM,gBAAgB,mEAAoE,CAAC;AAElG,8DAA8D;AAC9D,wBAAgB,wBAAwB,IAAI,MAAM,EAAE,CAenD;AAED,8EAA8E;AAC9E,wBAAgB,sBAAsB,IAAI,MAAM,EAAE,CAcjD"}
1
+ {"version":3,"file":"board-slot-instructions.d.ts","sourceRoot":"","sources":["../../src/operator/board-slot-instructions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,eAAO,MAAM,gBAAgB,mEAAoE,CAAC;AAElG,8DAA8D;AAC9D,wBAAgB,wBAAwB,IAAI,MAAM,EAAE,CAenD;AAED;;;;;;GAMG;AACH,wBAAgB,gCAAgC,IAAI,MAAM,EAAE,CAe3D;AAED,8EAA8E;AAC9E,wBAAgB,sBAAsB,IAAI,MAAM,EAAE,CAcjD"}
@@ -14,6 +14,7 @@
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.BOARD_SLOT_ORDER = void 0;
16
16
  exports.buildBoardHtmlVocabulary = buildBoardHtmlVocabulary;
17
+ exports.buildPipelineTrackerInstructions = buildPipelineTrackerInstructions;
17
18
  exports.buildBoardPublishLines = buildBoardPublishLines;
18
19
  exports.BOARD_SLOT_ORDER = ['briefing', 'action_required', 'decisions', 'pipeline'];
19
20
  /** The exact HTML shapes the board stylesheet understands. */
@@ -33,6 +34,29 @@ function buildBoardHtmlVocabulary() {
33
34
  'No <script>, <iframe>, or event handlers: the board sanitizes them out and the CSP blocks them.',
34
35
  ];
35
36
  }
37
+ /**
38
+ * Pipeline slot = item tracker projection (M8 Phase 3). Injected into EVERY
39
+ * board writer (dashboard persona, cron prompt, the trigger loop's full
40
+ * report) so both writers project the same tracker. D-day arithmetic uses the
41
+ * "Today is <date>" line each RUN PROMPT carries -- personas are static files
42
+ * and must never bake in a date.
43
+ */
44
+ function buildPipelineTrackerInstructions() {
45
+ return [
46
+ 'The pipeline slot is an ITEM TRACKER, not a summary. Build it from',
47
+ 'task_list({order: "deadline_priority", limit: 12}) -- the native task ledger is the',
48
+ 'projection source. Render one report-table with a row per open item:',
49
+ ' #id | title | status badge | assignee (or "unassigned") | D-day | source | latest event',
50
+ '- D-day: compute from the item\'s deadline against the run prompt\'s "Today is" date',
51
+ ' (D-3 = due in 3 days, D+2 = 2 days overdue). No deadline -> "-".',
52
+ '- Overdue -> badge-danger. Unassigned AND due within 7 days -> badge-warning with the',
53
+ ' literal word "unassigned" visible.',
54
+ '- Items with auto_created true and confirmed false render "(unconfirmed)" after the title',
55
+ ' so model-created items are visually distinct from owner-confirmed ones.',
56
+ '- done/cancelled items never appear.',
57
+ 'When a briefing/action_required/decisions card refers to a tracked item, cite its #id.',
58
+ ];
59
+ }
36
60
  /** Instruction block that makes a report run also publish the board slots. */
37
61
  function buildBoardPublishLines() {
38
62
  return [
@@ -43,7 +67,7 @@ function buildBoardPublishLines() {
43
67
  '- action_required: a report-section-title, then up to 5 cards; every card-action states the concrete next step.',
44
68
  '- decisions: cards for items waiting on an owner decision or confirmation; omit filler when none exist,',
45
69
  ' but still publish the slot with a one-line quiet note.',
46
- '- pipeline: one report-table of workstreams with their current state.',
70
+ ...buildPipelineTrackerInstructions(),
47
71
  ...buildBoardHtmlVocabulary(),
48
72
  "Write all slot CONTENT in the owner's language (match the channels); keep each slot under 6KB.",
49
73
  'The plain-text report you write afterwards is a separate output: no HTML in it.',
@@ -1 +1 @@
1
- {"version":3,"file":"board-slot-instructions.js","sourceRoot":"","sources":["../../src/operator/board-slot-instructions.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;AAKH,4DAeC;AAGD,wDAcC;AAnCY,QAAA,gBAAgB,GAAG,CAAC,UAAU,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,CAAU,CAAC;AAElG,8DAA8D;AAC9D,SAAgB,wBAAwB;IACtC,OAAO;QACL,qGAAqG;QACrG,sFAAsF;QACtF,oIAAoI;QACpI,oEAAoE;QACpE,oGAAoG;QACpG,6DAA6D;QAC7D,6EAA6E;QAC7E,6DAA6D;QAC7D,uGAAuG;QACvG,yDAAyD;QACzD,+GAA+G;QAC/G,iGAAiG;KAClG,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,SAAgB,sBAAsB;IACpC,OAAO;QACL,qFAAqF;QACrF,gDAAgD;QAChD,yHAAyH;QACzH,iHAAiH;QACjH,iHAAiH;QACjH,yGAAyG;QACzG,0DAA0D;QAC1D,uEAAuE;QACvE,GAAG,wBAAwB,EAAE;QAC7B,gGAAgG;QAChG,iFAAiF;KAClF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"board-slot-instructions.js","sourceRoot":"","sources":["../../src/operator/board-slot-instructions.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;AAKH,4DAeC;AASD,4EAeC;AAGD,wDAcC;AA3DY,QAAA,gBAAgB,GAAG,CAAC,UAAU,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,CAAU,CAAC;AAElG,8DAA8D;AAC9D,SAAgB,wBAAwB;IACtC,OAAO;QACL,qGAAqG;QACrG,sFAAsF;QACtF,oIAAoI;QACpI,oEAAoE;QACpE,oGAAoG;QACpG,6DAA6D;QAC7D,6EAA6E;QAC7E,6DAA6D;QAC7D,uGAAuG;QACvG,yDAAyD;QACzD,+GAA+G;QAC/G,iGAAiG;KAClG,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,gCAAgC;IAC9C,OAAO;QACL,oEAAoE;QACpE,qFAAqF;QACrF,sEAAsE;QACtE,2FAA2F;QAC3F,sFAAsF;QACtF,oEAAoE;QACpE,uFAAuF;QACvF,sCAAsC;QACtC,2FAA2F;QAC3F,2EAA2E;QAC3E,sCAAsC;QACtC,wFAAwF;KACzF,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,SAAgB,sBAAsB;IACpC,OAAO;QACL,qFAAqF;QACrF,gDAAgD;QAChD,yHAAyH;QACzH,iHAAiH;QACjH,iHAAiH;QACjH,yGAAyG;QACzG,0DAA0D;QAC1D,GAAG,gCAAgC,EAAE;QACrC,GAAG,wBAAwB,EAAE;QAC7B,gGAAgG;QAChG,iFAAiF;KAClF,CAAC;AACJ,CAAC"}
@@ -57,8 +57,21 @@ export interface TriggerLoopDeps {
57
57
  output?: Pick<OutputSink, 'send'>;
58
58
  /** Scheduled full-report cadence (real: ReportScheduler). Absent -> full leg off (M2). */
59
59
  reportScheduler?: ReportSchedule;
60
- /** M2.3: tool-call instructions for the FULL report so the agent self-gathers context. */
61
- fullReportSelfGather?: string[];
60
+ /**
61
+ * M2.3: tool-call instructions for the FULL report so the agent self-gathers context.
62
+ * A provider form receives the last successful report's anchor so the heavy gather
63
+ * can scope its delta (`since=<lastSuccessIso>`); it is resolved AT FIRE TIME.
64
+ */
65
+ fullReportSelfGather?: string[] | ((ctx: {
66
+ lastSuccessIso: string | null;
67
+ }) => string[]);
68
+ /**
69
+ * M8: board-reconcile feed. Invoked after commit with connector-qualified
70
+ * channelKey ("<connector>:<channelId>") and bounded delta excerpt lines
71
+ * (each carrying the event id so reconcile task writes can pass
72
+ * source_event_id). Absent -> no reconcile leg.
73
+ */
74
+ onChannelDelta?: (channelKey: string, lines: string[]) => void;
62
75
  /** Kagemusha dual output: FULL report also publishes the operator board slots. */
63
76
  fullReportBoardLines?: string[];
64
77
  config: TriggerLoopConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"operator-trigger-loop.d.ts","sourceRoot":"","sources":["../../src/operator/operator-trigger-loop.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACV,oBAAoB,EACpB,kBAAkB,EAClB,UAAU,EACX,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAG7D,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAe,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAEvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,iEAAiE;AACjE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,oBAAoB,EAAE,CAAC;IAChD,MAAM,CAAC,MAAM,EAAE,oBAAoB,EAAE,GAAG,IAAI,CAAC;CAC9C;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,4FAA4F;IAC5F,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,QAAQ,EAAE,eAAe,CAAC;IAC1B,sGAAsG;IACtG,QAAQ,EAAE,QAAQ,CAAC;IACnB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,QAAQ,CAAC;IACrB,4DAA4D;IAC5D,MAAM,EAAE,CAAC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IACrF,uFAAuF;IACvF,MAAM,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAClC,0FAA0F;IAC1F,eAAe,CAAC,EAAE,cAAc,CAAC;IACjC,0FAA0F;IAC1F,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,kFAAkF;IAClF,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,IAAI,CAAkB;IAC9B,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAA8C;IAChE,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,YAAY,CAAoB;gBAE5B,IAAI,EAAE,eAAe;IA0B3B,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC;IAmHjC;;;;;;;;;;;OAWG;IACH,KAAK,IAAI,IAAI;IA6Bb;;;;OAIG;IACH,KAAK,IAAI,MAAM,IAAI;CA6BpB"}
1
+ {"version":3,"file":"operator-trigger-loop.d.ts","sourceRoot":"","sources":["../../src/operator/operator-trigger-loop.ts"],"names":[],"mappings":"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"}
@@ -48,7 +48,14 @@ class OperatorTriggerLoop {
48
48
  };
49
49
  this.digest = new situation_report_js_1.SituationReporter({ recordTriggerUse });
50
50
  this.fullReporter = new situation_report_js_1.SituationReporter({
51
- selfGatherLines: deps.fullReportSelfGather,
51
+ // Wrap a provider into a zero-arg closure resolved AT FIRE TIME (buildPrompt
52
+ // calls it): the delta anchor is the last SUCCESSFUL full report, so a run
53
+ // that failed never widens the next window (defer, never drop).
54
+ selfGatherLines: typeof deps.fullReportSelfGather === 'function'
55
+ ? () => deps.fullReportSelfGather({
56
+ lastSuccessIso: deps.reportScheduler?.loadLastSuccess() ?? null,
57
+ })
58
+ : (deps.fullReportSelfGather ?? []),
52
59
  boardPublishLines: deps.fullReportBoardLines,
53
60
  recordTriggerUse,
54
61
  });
@@ -94,6 +101,28 @@ class OperatorTriggerLoop {
94
101
  }
95
102
  }
96
103
  delta.commit(events);
104
+ // M8: feed the board-reconcile leg AFTER commit (the loop's cursor is
105
+ // authoritative; reconcile is a freshness layer repaired by the 30-min cron).
106
+ if (this.deps.onChannelDelta && events.length > 0) {
107
+ const byChannel = new Map();
108
+ for (const event of events) {
109
+ const key = `${event.channel}:${event.channelId}`;
110
+ const bucket = byChannel.get(key) ?? [];
111
+ bucket.push(event);
112
+ byChannel.set(key, bucket);
113
+ }
114
+ for (const [channelKey, channelEvents] of byChannel) {
115
+ const lines = channelEvents
116
+ .slice(-10)
117
+ .map((e) => `- [id:${e.eventIndexId ?? e.id}] ${e.userId}: ${e.content.trim().slice(0, 200)}`);
118
+ try {
119
+ this.deps.onChannelDelta(channelKey, lines);
120
+ }
121
+ catch (err) {
122
+ log(`[trigger-loop] onChannelDelta failed for ${channelKey}: ${err instanceof Error ? err.message : String(err)}`);
123
+ }
124
+ }
125
+ }
97
126
  // Feed the drained window into the report accumulators (bounded per-channel) and keep the
98
127
  // author window. The digest reports on ALL channels seen, not only the ones that fired.
99
128
  if (events.length > 0) {
@@ -148,8 +177,18 @@ class OperatorTriggerLoop {
148
177
  if (output && reportScheduler) {
149
178
  const { fire, hourKey } = reportScheduler.shouldFire(new Date());
150
179
  if (fire) {
180
+ // Anchor = FIRE time, captured BEFORE the run: anchoring at completion would
181
+ // leave a gap (messages arriving while the run executes fall after the gather
182
+ // but before a completion-time anchor). Overlap is tolerable; gaps are not.
183
+ const firedAtIso = new Date().toISOString();
151
184
  fullReported = await this.fullReporter.report(reportAsk, output, 'full');
152
185
  reportScheduler.markFired(hourKey); // reached only if report() did not throw (sent OR agent-suppressed)
186
+ if (fullReported) {
187
+ // ONLY a delivered report advances the delta anchor. A NOTHING-suppressed
188
+ // report or a Task-4 ENVELOPE_EXPIRED abort must NOT advance it, so the
189
+ // next report's window still covers everything this run missed.
190
+ reportScheduler.markSuccess(firedAtIso);
191
+ }
153
192
  log(`[trigger-loop] tick ${tick}: full report ${fullReported ? 'SENT' : 'suppressed by agent'} (${hourKey})`);
154
193
  }
155
194
  }
@@ -1 +1 @@
1
- {"version":3,"file":"operator-trigger-loop.js","sourceRoot":"","sources":["../../src/operator/operator-trigger-loop.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"operator-trigger-loop.js","sourceRoot":"","sources":["../../src/operator/operator-trigger-loop.ts"],"names":[],"mappings":"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"}
@@ -5,11 +5,19 @@ export interface ReportSchedule {
5
5
  hourKey: string;
6
6
  };
7
7
  markFired(hourKey: string): void;
8
+ /** Anchor timestamp (ISO) of the last SUCCESSFUL full report, for delta-scoped gathers. */
9
+ loadLastSuccess(): string | null;
10
+ /** Persist the anchor after a full report is delivered (failures must never advance it). */
11
+ markSuccess(iso: string): void;
8
12
  }
9
13
  /** Persist/restore the last-fired hour key (so a restart within the same hour does not re-send). */
10
14
  export interface ReportScheduleStore {
11
15
  load(): string | null;
12
16
  save(hourKey: string): void;
17
+ /** Anchor timestamp (ISO) of the last SUCCESSFUL full report; null before the first one. */
18
+ loadLastSuccess(): string | null;
19
+ /** Persist the success anchor (read-modify-write so it never clobbers the fired-hour key). */
20
+ markSuccess(iso: string): void;
13
21
  }
14
22
  /** Local-time "YYYY-MM-DD:HH" bucket. Two ticks in the same local hour share a key. */
15
23
  export declare function hourKeyLocal(now: Date): string;
@@ -32,12 +40,27 @@ export declare class ReportScheduler implements ReportSchedule {
32
40
  };
33
41
  /** Mark this hour delivered (persist) so we fire once per configured hour, restart-safe. */
34
42
  markFired(hourKey: string): void;
43
+ /** Anchor of the last SUCCESSFUL full report (delegates to the store). */
44
+ loadLastSuccess(): string | null;
45
+ /** Persist the success anchor (delegates to the store; called ONLY on a delivered report). */
46
+ markSuccess(iso: string): void;
35
47
  }
36
48
  /** File-backed store under ~/.mama - mirrors ConnectorDeltaRepo's atomic cursor file. */
37
49
  export declare class FileReportScheduleStore implements ReportScheduleStore {
38
50
  private path;
39
51
  constructor(path: string);
52
+ /**
53
+ * Read-parse the whole state object. MISSING file -> {} (silent, as today). A corrupt/empty
54
+ * or non-object state file is disposable bookkeeping: rather than throw and permanently break
55
+ * the report leg, reset LOUDLY and return {}. Worst case after a reset is one duplicate report
56
+ * plus a wide gather window - both self-heal on the next successful report.
57
+ */
58
+ private readState;
59
+ /** Atomic full-object write (tmp+rename) - callers do read-modify-write to preserve sibling fields. */
60
+ private writeState;
40
61
  load(): string | null;
41
62
  save(hourKey: string): void;
63
+ loadLastSuccess(): string | null;
64
+ markSuccess(iso: string): void;
42
65
  }
43
66
  //# sourceMappingURL=report-scheduler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"report-scheduler.d.ts","sourceRoot":"","sources":["../../src/operator/report-scheduler.ts"],"names":[],"mappings":"AAeA,sGAAsG;AACtG,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,GAAG,EAAE,IAAI,GAAG;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1D,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED,oGAAoG;AACpG,MAAM,WAAW,mBAAmB;IAClC,IAAI,IAAI,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,uFAAuF;AACvF,wBAAgB,YAAY,CAAC,GAAG,EAAE,IAAI,GAAG,MAAM,CAG9C;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAQtD;AAED,qBAAa,eAAgB,YAAW,cAAc;IACpD,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,gBAAgB,CAAgB;gBAE5B,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,mBAAmB;IAMvD,8FAA8F;IAC9F,UAAU,CAAC,GAAG,EAAE,IAAI,GAAG;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAMzD,4FAA4F;IAC5F,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAIjC;AAED,yFAAyF;AACzF,qBAAa,uBAAwB,YAAW,mBAAmB;IACjE,OAAO,CAAC,IAAI,CAAS;gBAET,IAAI,EAAE,MAAM;IAIxB,IAAI,IAAI,MAAM,GAAG,IAAI;IAYrB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAM5B"}
1
+ {"version":3,"file":"report-scheduler.d.ts","sourceRoot":"","sources":["../../src/operator/report-scheduler.ts"],"names":[],"mappings":"AAeA,sGAAsG;AACtG,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,GAAG,EAAE,IAAI,GAAG;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1D,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,2FAA2F;IAC3F,eAAe,IAAI,MAAM,GAAG,IAAI,CAAC;IACjC,4FAA4F;IAC5F,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,oGAAoG;AACpG,MAAM,WAAW,mBAAmB;IAClC,IAAI,IAAI,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,4FAA4F;IAC5F,eAAe,IAAI,MAAM,GAAG,IAAI,CAAC;IACjC,8FAA8F;IAC9F,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,uFAAuF;AACvF,wBAAgB,YAAY,CAAC,GAAG,EAAE,IAAI,GAAG,MAAM,CAG9C;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAQtD;AAED,qBAAa,eAAgB,YAAW,cAAc;IACpD,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,gBAAgB,CAAgB;gBAE5B,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,mBAAmB;IAMvD,8FAA8F;IAC9F,UAAU,CAAC,GAAG,EAAE,IAAI,GAAG;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAMzD,4FAA4F;IAC5F,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKhC,0EAA0E;IAC1E,eAAe,IAAI,MAAM,GAAG,IAAI;IAIhC,8FAA8F;IAC9F,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;CAG/B;AAED,yFAAyF;AACzF,qBAAa,uBAAwB,YAAW,mBAAmB;IACjE,OAAO,CAAC,IAAI,CAAS;gBAET,IAAI,EAAE,MAAM;IAIxB;;;;;OAKG;IACH,OAAO,CAAC,SAAS;IAwBjB,uGAAuG;IACvG,OAAO,CAAC,UAAU;IAOlB,IAAI,IAAI,MAAM,GAAG,IAAI;IAKrB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAS3B,eAAe,IAAI,MAAM,GAAG,IAAI;IAKhC,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;CAU/B"}
@@ -57,6 +57,14 @@ class ReportScheduler {
57
57
  this.lastFiredHourKey = hourKey;
58
58
  this.store.save(hourKey);
59
59
  }
60
+ /** Anchor of the last SUCCESSFUL full report (delegates to the store). */
61
+ loadLastSuccess() {
62
+ return this.store.loadLastSuccess();
63
+ }
64
+ /** Persist the success anchor (delegates to the store; called ONLY on a delivered report). */
65
+ markSuccess(iso) {
66
+ this.store.markSuccess(iso);
67
+ }
60
68
  }
61
69
  exports.ReportScheduler = ReportScheduler;
62
70
  /** File-backed store under ~/.mama - mirrors ConnectorDeltaRepo's atomic cursor file. */
@@ -65,23 +73,63 @@ class FileReportScheduleStore {
65
73
  constructor(path) {
66
74
  this.path = path;
67
75
  }
68
- load() {
76
+ /**
77
+ * Read-parse the whole state object. MISSING file -> {} (silent, as today). A corrupt/empty
78
+ * or non-object state file is disposable bookkeeping: rather than throw and permanently break
79
+ * the report leg, reset LOUDLY and return {}. Worst case after a reset is one duplicate report
80
+ * plus a wide gather window - both self-heal on the next successful report.
81
+ */
82
+ readState() {
69
83
  if (!(0, node_fs_1.existsSync)(this.path)) {
70
- return null;
84
+ return {};
85
+ }
86
+ let parsed;
87
+ try {
88
+ parsed = JSON.parse((0, node_fs_1.readFileSync)(this.path, 'utf8'));
89
+ }
90
+ catch (error) {
91
+ console.error('[report-scheduler] state file corrupt or unreadable - resetting schedule state:', error);
92
+ return {};
71
93
  }
72
- const parsed = JSON.parse((0, node_fs_1.readFileSync)(this.path, 'utf8')); // throws on corrupt (no-fallback)
73
94
  if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
74
- throw new Error(`corrupt report-schedule state (not an object): ${this.path}`);
95
+ console.error('[report-scheduler] state file corrupt or unreadable - resetting schedule state:', `not a plain object: ${this.path}`);
96
+ return {};
75
97
  }
76
- const key = parsed.lastFiredHourKey;
77
- return typeof key === 'string' ? key : null;
98
+ return parsed;
78
99
  }
79
- save(hourKey) {
100
+ /** Atomic full-object write (tmp+rename) - callers do read-modify-write to preserve sibling fields. */
101
+ writeState(state) {
80
102
  (0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(this.path), { recursive: true });
81
103
  const tmp = (0, node_path_1.join)((0, node_path_1.dirname)(this.path), `.report-schedule.${process.pid}.tmp`);
82
- (0, node_fs_1.writeFileSync)(tmp, JSON.stringify({ lastFiredHourKey: hourKey }), 'utf8');
104
+ (0, node_fs_1.writeFileSync)(tmp, JSON.stringify(state), 'utf8');
83
105
  (0, node_fs_1.renameSync)(tmp, this.path); // atomic replace
84
106
  }
107
+ load() {
108
+ const key = this.readState().lastFiredHourKey;
109
+ return typeof key === 'string' ? key : null;
110
+ }
111
+ save(hourKey) {
112
+ // Read-modify-write: markFired must NOT clobber the success anchor.
113
+ const state = this.readState();
114
+ this.writeState({
115
+ lastFiredHourKey: hourKey,
116
+ ...(typeof state.lastSuccessIso === 'string' ? { lastSuccessIso: state.lastSuccessIso } : {}),
117
+ });
118
+ }
119
+ loadLastSuccess() {
120
+ const iso = this.readState().lastSuccessIso;
121
+ return typeof iso === 'string' ? iso : null;
122
+ }
123
+ markSuccess(iso) {
124
+ // Read-modify-write: advancing the anchor must NOT clobber the fired-hour key.
125
+ const state = this.readState();
126
+ this.writeState({
127
+ ...(typeof state.lastFiredHourKey === 'string'
128
+ ? { lastFiredHourKey: state.lastFiredHourKey }
129
+ : {}),
130
+ lastSuccessIso: iso,
131
+ });
132
+ }
85
133
  }
86
134
  exports.FileReportScheduleStore = FileReportScheduleStore;
87
135
  //# sourceMappingURL=report-scheduler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"report-scheduler.js","sourceRoot":"","sources":["../../src/operator/report-scheduler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"report-scheduler.js","sourceRoot":"","sources":["../../src/operator/report-scheduler.ts"],"names":[],"mappings":"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"}
@@ -41,8 +41,12 @@ export interface SituationReporterOptions {
41
41
  * (and which deleted its deterministic report builder for low quality). The lines
42
42
  * are injected from the runtime wiring (which knows the daemon's toolset); this
43
43
  * module stays generic. Digest mode never uses them (frequent + must stay light).
44
+ *
45
+ * A zero-arg provider is resolved at fire time (buildPrompt runs per report),
46
+ * so runtime wiring can inject freshly anchored gather lines (e.g. a delta
47
+ * `since=<last successful report>`) without rebuilding the reporter.
44
48
  */
45
- selfGatherLines?: string[];
49
+ selfGatherLines?: string[] | (() => string[]);
46
50
  /**
47
51
  * Kagemusha dual-output mechanism: lines instructing the FULL report run to also
48
52
  * publish the operator board slots (report_publish) before writing the text
@@ -1 +1 @@
1
- {"version":3,"file":"situation-report.d.ts","sourceRoot":"","sources":["../../src/operator/situation-report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACjF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpD;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,2BAA2B,CAAC;AAEjE,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAChD;AAED,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC;AAqB3C,MAAM,WAAW,wBAAwB;IACvC;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;CACnD;AAKD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,eAAe,CAAoC;IAC3D,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,IAAI,CAA2B;gBAE3B,IAAI,GAAE,wBAA6B;IAI/C,0EAA0E;IAC1E,YAAY,CAAC,MAAM,EAAE,oBAAoB,EAAE,GAAG,IAAI;IAgBlD,2FAA2F;IAC3F,UAAU,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IAmBxC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAInC,uFAAuF;IACvF,WAAW,IAAI,OAAO;IAItB;;;OAGG;IACG,MAAM,CACV,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,EAChC,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,OAAO,CAAC;IA2CnB,OAAO,CAAC,KAAK;IAQb,kGAAkG;IAClG,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM;CAwGtC"}
1
+ {"version":3,"file":"situation-report.d.ts","sourceRoot":"","sources":["../../src/operator/situation-report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACjF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpD;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,2BAA2B,CAAC;AAEjE,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAChD;AAED,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC;AAqB3C,MAAM,WAAW,wBAAwB;IACvC;;;;;;;;;;;OAWG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC;IAC9C;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;CACnD;AAKD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,eAAe,CAAoC;IAC3D,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,IAAI,CAA2B;gBAE3B,IAAI,GAAE,wBAA6B;IAI/C,0EAA0E;IAC1E,YAAY,CAAC,MAAM,EAAE,oBAAoB,EAAE,GAAG,IAAI;IAgBlD,2FAA2F;IAC3F,UAAU,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IAmBxC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAInC,uFAAuF;IACvF,WAAW,IAAI,OAAO;IAItB;;;OAGG;IACG,MAAM,CACV,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,EAChC,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,OAAO,CAAC;IA2CnB,OAAO,CAAC,KAAK;IAQb,kGAAkG;IAClG,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM;CAoHtC"}
@@ -126,6 +126,16 @@ class SituationReporter {
126
126
  }
127
127
  const fireLines = [...this.fireAgg.values()].map((f) => `- trigger "${f.kind}" [id: ${f.triggerId}] fired ${f.count}x on ${f.channelId}; recalled: ${[...f.topics].join(', ') || '(none)'}`);
128
128
  const memoryLines = [...this.recalled.entries()].map(([topic, content]) => `- ${topic}: ${content}`);
129
+ // Resolve the gather lines only for the FULL report - the digest framing never renders
130
+ // them, so a zero-arg PROVIDER must not be invoked (it may do real gather work) just to
131
+ // build a digest prompt. The guard below stays anchored on the RESOLVED array: a zero-arg
132
+ // provider's `.length` is its arity (0), so guarding on the raw opts value would compile
133
+ // cleanly and silently drop the ENTIRE gather block on every production report.
134
+ const gatherLines = mode === 'full'
135
+ ? typeof this.opts.selfGatherLines === 'function'
136
+ ? this.opts.selfGatherLines()
137
+ : (this.opts.selfGatherLines ?? [])
138
+ : [];
129
139
  // M2.1 posture: the full report is a DUTY report (always arrives - a quiet window is
130
140
  // reported as quiet, the aliveness signal owners rely on); the digest defaults to briefing
131
141
  // and keeps NOTHING only for pure noise.
@@ -140,7 +150,7 @@ class SituationReporter {
140
150
  "Structure the report with these sections (render the headings in the owner's language;",
141
151
  'omit a section only when it is truly empty):',
142
152
  '1) Key situation 2) Action required 3) Decisions needed 4) Pipeline 5) Next actions',
143
- ...(this.opts.selfGatherLines && this.opts.selfGatherLines.length > 0
153
+ ...(gatherLines.length > 0
144
154
  ? [
145
155
  '',
146
156
  'Before writing, ACTIVELY gather current context by CALLING your gateway tools.',
@@ -150,7 +160,7 @@ class SituationReporter {
150
160
  '{"name": "kagemusha_tasks", "input": {"status": "in_progress"}}',
151
161
  '```',
152
162
  'Gather with these gateway tool calls:',
153
- ...this.opts.selfGatherLines.map((line) => `- ${line}`),
163
+ ...gatherLines.map((line) => `- ${line}`),
154
164
  'These gateway tools are NOT native or deferred CLI tools: ToolSearch cannot',
155
165
  'load them and will find nothing. Invoke them ONLY as fenced tool_call JSON',
156
166
  'blocks in your reply text - do not search for them, and do not fall back to',