sensorium-mcp 3.1.2 → 3.1.3-board.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/Install-Sensorium.ps1 +61 -0
  2. package/dist/board/api/api.js +61 -0
  3. package/dist/board/api/client.js +96 -0
  4. package/dist/board/components/BottomNav.js +32 -0
  5. package/dist/board/components/Card.js +44 -0
  6. package/dist/board/components/CommentComposer.js +26 -0
  7. package/dist/board/components/CommentList.js +39 -0
  8. package/dist/board/components/Dropdown.js +66 -0
  9. package/dist/board/components/Lane.js +40 -0
  10. package/dist/board/components/PriorityChip.js +17 -0
  11. package/dist/board/components/ProfileSummary.js +39 -0
  12. package/dist/board/components/StateBanner.js +22 -0
  13. package/dist/board/components/StatusChip.js +21 -0
  14. package/dist/board/components/TokenEntry.js +42 -0
  15. package/dist/board/config.js +56 -0
  16. package/dist/board/index.html +18 -0
  17. package/dist/board/main.js +37 -0
  18. package/dist/board/mock/api.mock.js +193 -0
  19. package/dist/board/mock/fixtures.js +164 -0
  20. package/dist/board/schema/policy.js +192 -0
  21. package/dist/board/state/auth.js +55 -0
  22. package/dist/board/state/useBoard.js +149 -0
  23. package/dist/board/state/useBuilder.js +98 -0
  24. package/dist/board/state/useCard.js +67 -0
  25. package/dist/board/styles/board.css +1760 -0
  26. package/dist/board/styles/tokens.css +71 -0
  27. package/dist/board/vendor/vue.esm-browser.js +9 -0
  28. package/dist/board/views/App.js +65 -0
  29. package/dist/board/views/BoardView.js +84 -0
  30. package/dist/board/views/BuilderView.js +303 -0
  31. package/dist/board/views/CardView.js +245 -0
  32. package/dist/board/views/SettingsView.js +145 -0
  33. package/dist/config/index.d.ts +1 -0
  34. package/dist/config/index.d.ts.map +1 -1
  35. package/dist/config/index.js +12 -0
  36. package/dist/config/index.js.map +1 -1
  37. package/dist/config/misc-settings.d.ts +14 -0
  38. package/dist/config/misc-settings.d.ts.map +1 -1
  39. package/dist/config/misc-settings.js +53 -0
  40. package/dist/config/misc-settings.js.map +1 -1
  41. package/dist/dashboard/board-static.d.ts +23 -0
  42. package/dist/dashboard/board-static.d.ts.map +1 -0
  43. package/dist/dashboard/board-static.js +131 -0
  44. package/dist/dashboard/board-static.js.map +1 -0
  45. package/dist/dashboard/routes/board.d.ts +73 -0
  46. package/dist/dashboard/routes/board.d.ts.map +1 -0
  47. package/dist/dashboard/routes/board.js +623 -0
  48. package/dist/dashboard/routes/board.js.map +1 -0
  49. package/dist/dashboard/routes/settings.d.ts +2 -0
  50. package/dist/dashboard/routes/settings.d.ts.map +1 -1
  51. package/dist/dashboard/routes/settings.js +24 -1
  52. package/dist/dashboard/routes/settings.js.map +1 -1
  53. package/dist/dashboard/routes/threads-read.d.ts +7 -3
  54. package/dist/dashboard/routes/threads-read.d.ts.map +1 -1
  55. package/dist/dashboard/routes/threads-read.js +19 -4
  56. package/dist/dashboard/routes/threads-read.js.map +1 -1
  57. package/dist/dashboard/routes/types.d.ts +6 -0
  58. package/dist/dashboard/routes/types.d.ts.map +1 -1
  59. package/dist/dashboard/routes/types.js.map +1 -1
  60. package/dist/dashboard/routes.d.ts.map +1 -1
  61. package/dist/dashboard/routes.js +42 -1
  62. package/dist/dashboard/routes.js.map +1 -1
  63. package/dist/dashboard/spa.html +12 -12
  64. package/dist/data/board/board-schema.d.ts +22 -0
  65. package/dist/data/board/board-schema.d.ts.map +1 -0
  66. package/dist/data/board/board-schema.js +103 -0
  67. package/dist/data/board/board-schema.js.map +1 -0
  68. package/dist/data/board/board-types.d.ts +117 -0
  69. package/dist/data/board/board-types.d.ts.map +1 -0
  70. package/dist/data/board/board-types.js +9 -0
  71. package/dist/data/board/board-types.js.map +1 -0
  72. package/dist/data/board/card.repository.d.ts +64 -0
  73. package/dist/data/board/card.repository.d.ts.map +1 -0
  74. package/dist/data/board/card.repository.js +272 -0
  75. package/dist/data/board/card.repository.js.map +1 -0
  76. package/dist/data/board/comment.repository.d.ts +12 -0
  77. package/dist/data/board/comment.repository.d.ts.map +1 -0
  78. package/dist/data/board/comment.repository.js +31 -0
  79. package/dist/data/board/comment.repository.js.map +1 -0
  80. package/dist/data/board/lane.repository.d.ts +18 -0
  81. package/dist/data/board/lane.repository.d.ts.map +1 -0
  82. package/dist/data/board/lane.repository.js +44 -0
  83. package/dist/data/board/lane.repository.js.map +1 -0
  84. package/dist/data/board/profile-defaults.d.ts +19 -0
  85. package/dist/data/board/profile-defaults.d.ts.map +1 -0
  86. package/dist/data/board/profile-defaults.js +118 -0
  87. package/dist/data/board/profile-defaults.js.map +1 -0
  88. package/dist/data/memory/migration-runner.d.ts.map +1 -1
  89. package/dist/data/memory/migration-runner.js +4 -0
  90. package/dist/data/memory/migration-runner.js.map +1 -1
  91. package/dist/data/memory/narrative-store.d.ts +14 -0
  92. package/dist/data/memory/narrative-store.d.ts.map +1 -1
  93. package/dist/data/memory/narrative-store.js +36 -0
  94. package/dist/data/memory/narrative-store.js.map +1 -1
  95. package/dist/data/memory/narrative.d.ts.map +1 -1
  96. package/dist/data/memory/narrative.js +13 -1
  97. package/dist/data/memory/narrative.js.map +1 -1
  98. package/dist/data/memory/schema.d.ts.map +1 -1
  99. package/dist/data/memory/schema.js +4 -0
  100. package/dist/data/memory/schema.js.map +1 -1
  101. package/dist/index.js +84 -2
  102. package/dist/index.js.map +1 -1
  103. package/dist/integrations/openai/speech.d.ts.map +1 -1
  104. package/dist/integrations/openai/speech.js +52 -19
  105. package/dist/integrations/openai/speech.js.map +1 -1
  106. package/dist/lib/http-retry.d.ts +91 -0
  107. package/dist/lib/http-retry.d.ts.map +1 -0
  108. package/dist/lib/http-retry.js +177 -0
  109. package/dist/lib/http-retry.js.map +1 -0
  110. package/dist/lib/usage-metering/pricing.js +1 -1
  111. package/dist/lib/usage-metering/pricing.js.map +1 -1
  112. package/dist/lib/utils.d.ts +10 -0
  113. package/dist/lib/utils.d.ts.map +1 -1
  114. package/dist/lib/utils.js +22 -0
  115. package/dist/lib/utils.js.map +1 -1
  116. package/dist/server/http-server.d.ts +3 -1
  117. package/dist/server/http-server.d.ts.map +1 -1
  118. package/dist/server/http-server.js +6 -2
  119. package/dist/server/http-server.js.map +1 -1
  120. package/dist/services/board/board-signals.d.ts +25 -0
  121. package/dist/services/board/board-signals.d.ts.map +1 -0
  122. package/dist/services/board/board-signals.js +83 -0
  123. package/dist/services/board/board-signals.js.map +1 -0
  124. package/dist/services/board/card-briefing.d.ts +17 -0
  125. package/dist/services/board/card-briefing.d.ts.map +1 -0
  126. package/dist/services/board/card-briefing.js +86 -0
  127. package/dist/services/board/card-briefing.js.map +1 -0
  128. package/dist/services/board/orchestrator.service.d.ts +55 -0
  129. package/dist/services/board/orchestrator.service.d.ts.map +1 -0
  130. package/dist/services/board/orchestrator.service.js +198 -0
  131. package/dist/services/board/orchestrator.service.js.map +1 -0
  132. package/dist/services/board/release-worker.d.ts +32 -0
  133. package/dist/services/board/release-worker.d.ts.map +1 -0
  134. package/dist/services/board/release-worker.js +49 -0
  135. package/dist/services/board/release-worker.js.map +1 -0
  136. package/dist/services/board/report-capture.d.ts +48 -0
  137. package/dist/services/board/report-capture.d.ts.map +1 -0
  138. package/dist/services/board/report-capture.js +172 -0
  139. package/dist/services/board/report-capture.js.map +1 -0
  140. package/dist/services/board/worker-spawn.d.ts +30 -0
  141. package/dist/services/board/worker-spawn.d.ts.map +1 -0
  142. package/dist/services/board/worker-spawn.js +90 -0
  143. package/dist/services/board/worker-spawn.js.map +1 -0
  144. package/dist/services/broker-client.d.ts +30 -0
  145. package/dist/services/broker-client.d.ts.map +1 -1
  146. package/dist/services/broker-client.js +23 -0
  147. package/dist/services/broker-client.js.map +1 -1
  148. package/dist/services/http-retry.d.ts +1 -90
  149. package/dist/services/http-retry.d.ts.map +1 -1
  150. package/dist/services/http-retry.js +1 -176
  151. package/dist/services/http-retry.js.map +1 -1
  152. package/dist/services/passive-notice.service.d.ts +39 -0
  153. package/dist/services/passive-notice.service.d.ts.map +1 -0
  154. package/dist/services/passive-notice.service.js +274 -0
  155. package/dist/services/passive-notice.service.js.map +1 -0
  156. package/dist/services/spawn-common.d.ts.map +1 -1
  157. package/dist/services/spawn-common.js +14 -1
  158. package/dist/services/spawn-common.js.map +1 -1
  159. package/dist/services/telegram.d.ts +7 -5
  160. package/dist/services/telegram.d.ts.map +1 -1
  161. package/dist/services/telegram.js +18 -13
  162. package/dist/services/telegram.js.map +1 -1
  163. package/dist/services/usage/usage-inbox-notifier.d.ts +50 -0
  164. package/dist/services/usage/usage-inbox-notifier.d.ts.map +1 -0
  165. package/dist/services/usage/usage-inbox-notifier.js +118 -0
  166. package/dist/services/usage/usage-inbox-notifier.js.map +1 -0
  167. package/dist/services/usage/usage-poller.service.d.ts +41 -0
  168. package/dist/services/usage/usage-poller.service.d.ts.map +1 -0
  169. package/dist/services/usage/usage-poller.service.js +66 -0
  170. package/dist/services/usage/usage-poller.service.js.map +1 -0
  171. package/dist/services/usage/usage-snapshot-provider.d.ts +29 -0
  172. package/dist/services/usage/usage-snapshot-provider.d.ts.map +1 -0
  173. package/dist/services/usage/usage-snapshot-provider.js +59 -0
  174. package/dist/services/usage/usage-snapshot-provider.js.map +1 -0
  175. package/dist/services/usage/usage-types.d.ts +23 -0
  176. package/dist/services/usage/usage-types.d.ts.map +1 -0
  177. package/dist/services/usage/usage-types.js +14 -0
  178. package/dist/services/usage/usage-types.js.map +1 -0
  179. package/dist/services/worker-cleanup.service.d.ts +6 -1
  180. package/dist/services/worker-cleanup.service.d.ts.map +1 -1
  181. package/dist/services/worker-cleanup.service.js +123 -10
  182. package/dist/services/worker-cleanup.service.js.map +1 -1
  183. package/dist/tools/delegate-tool.d.ts.map +1 -1
  184. package/dist/tools/delegate-tool.js +32 -0
  185. package/dist/tools/delegate-tool.js.map +1 -1
  186. package/dist/tools/utility-tools.d.ts.map +1 -1
  187. package/dist/tools/utility-tools.js +7 -3
  188. package/dist/tools/utility-tools.js.map +1 -1
  189. package/dist/tools/wait/consolidation-strategy.d.ts +42 -0
  190. package/dist/tools/wait/consolidation-strategy.d.ts.map +1 -0
  191. package/dist/tools/wait/consolidation-strategy.js +50 -0
  192. package/dist/tools/wait/consolidation-strategy.js.map +1 -0
  193. package/dist/tools/wait/drive-handler.d.ts +5 -7
  194. package/dist/tools/wait/drive-handler.d.ts.map +1 -1
  195. package/dist/tools/wait/drive-handler.js +30 -48
  196. package/dist/tools/wait/drive-handler.js.map +1 -1
  197. package/dist/tools/wait/message-delivery.d.ts.map +1 -1
  198. package/dist/tools/wait/message-delivery.js +13 -0
  199. package/dist/tools/wait/message-delivery.js.map +1 -1
  200. package/package.json +2 -2
  201. package/templates/atomic-build-spec.default.md +57 -0
  202. package/templates/buildless-vue-preview.default.md +47 -0
  203. package/templates/phased-build.default.md +59 -0
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Settings screen — ✅ EDITABLE.
3
+ *
4
+ * Token entry (production auth), the live MODE, and the connected lanes. In
5
+ * preview the token field is shown for design purposes but marked as ignored.
6
+ */
7
+
8
+ import { onMounted, ref } from "../vendor/vue.esm-browser.js";
9
+ import { useAuth } from "../state/auth.js";
10
+ import { useBoard } from "../state/useBoard.js";
11
+
12
+ export default {
13
+ name: "SettingsView",
14
+ setup() {
15
+ const auth = useAuth();
16
+ const board = useBoard();
17
+ const draftToken = ref(auth.token.value);
18
+ const saved = ref(false);
19
+ const newLane = ref("");
20
+ const editingId = ref(null);
21
+ const editName = ref("");
22
+ const laneErr = ref(null);
23
+
24
+ onMounted(() => {
25
+ if (!board.lanes.value.length) board.actions.refresh();
26
+ });
27
+
28
+ function save() {
29
+ auth.setToken(draftToken.value.trim());
30
+ saved.value = true;
31
+ setTimeout(() => (saved.value = false), 1500);
32
+ }
33
+ function clear() {
34
+ auth.clearToken();
35
+ draftToken.value = "";
36
+ }
37
+ function laneCount(threadId) {
38
+ return board.cards.value.filter((c) => c.laneThreadId === threadId).length;
39
+ }
40
+ async function addLane() {
41
+ const n = newLane.value.trim();
42
+ if (!n) return;
43
+ laneErr.value = null;
44
+ try {
45
+ await board.actions.addLane(n);
46
+ newLane.value = "";
47
+ } catch (e) {
48
+ laneErr.value = (e && e.message) || String(e);
49
+ }
50
+ }
51
+ function startEdit(l) {
52
+ laneErr.value = null;
53
+ editingId.value = l.threadId;
54
+ editName.value = l.name;
55
+ }
56
+ async function saveEdit() {
57
+ const n = editName.value.trim();
58
+ if (!n) return;
59
+ try {
60
+ await board.actions.renameLane(editingId.value, n);
61
+ editingId.value = null;
62
+ } catch (e) {
63
+ laneErr.value = (e && e.message) || String(e);
64
+ }
65
+ }
66
+ async function removeLane(l) {
67
+ laneErr.value = null;
68
+ try {
69
+ await board.actions.removeLane(l.threadId);
70
+ } catch (e) {
71
+ laneErr.value = (e && e.message) || String(e);
72
+ }
73
+ }
74
+
75
+ return {
76
+ auth, board, draftToken, saved, save, clear,
77
+ newLane, editingId, editName, laneErr,
78
+ laneCount, addLane, startEdit, saveEdit, removeLane,
79
+ };
80
+ },
81
+ template: `
82
+ <section class="settings">
83
+ <header class="settings__head">
84
+ <h1 class="settings__title">Settings</h1>
85
+ <p class="settings__note mono-label">TOKEN · MODE · LANES</p>
86
+ </header>
87
+
88
+ <section class="section">
89
+ <h2 class="section__label">API token</h2>
90
+ <p class="settings__note" v-if="auth.isPreview">
91
+ Preview mode — the token is ignored (mock data). Shown here so the entry screen is designable.
92
+ </p>
93
+ <label class="field">
94
+ <input class="input" type="password" v-model="draftToken" placeholder="Paste the board token" autocomplete="off" />
95
+ </label>
96
+ <div class="actions">
97
+ <button class="btn btn--primary" type="button" @click="save">Save</button>
98
+ <button class="btn btn--ghost" type="button" @click="clear">Clear</button>
99
+ <span v-if="saved" class="settings__saved">Saved ✓</span>
100
+ </div>
101
+ </section>
102
+
103
+ <section class="section">
104
+ <h2 class="section__label">Mode</h2>
105
+ <p class="prose"><span class="badge" :class="'badge--mode-' + auth.mode">{{ auth.mode }}</span></p>
106
+ </section>
107
+
108
+ <section class="section section--plain">
109
+ <h2 class="section__label">Lanes</h2>
110
+ <div v-if="laneErr" class="notice notice--error">{{ laneErr }}</div>
111
+ <ul class="list">
112
+ <li v-for="l in board.lanes.value" :key="l.threadId" class="list__row">
113
+ <template v-if="editingId === l.threadId">
114
+ <input class="input input--sm" v-model="editName" @keydown.enter.prevent="saveEdit" />
115
+ <button class="btn btn--sm btn--primary" type="button" @click="saveEdit">Save</button>
116
+ <button class="btn btn--sm btn--ghost" type="button" @click="editingId = null">Cancel</button>
117
+ </template>
118
+ <template v-else>
119
+ <span class="list__main">{{ l.name }}</span>
120
+ <span class="chip" :class="l.connected ? 'chip--live' : 'chip--muted'">
121
+ <span v-if="l.connected" class="dot dot--pulse"></span>
122
+ {{ l.connected ? 'connected' : 'disconnected' }}
123
+ </span>
124
+ <span class="chip chip--muted">{{ laneCount(l.threadId) }} cards</span>
125
+ <button class="iconbtn" type="button" aria-label="Rename lane" @click="startEdit(l)">
126
+ <svg viewBox="0 0 16 16" width="14" height="14" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M11.3 2.1l2.6 2.6L5.6 13H3v-2.6l8.3-8.3z"></path></svg>
127
+ </button>
128
+ <button class="iconbtn iconbtn--danger" type="button" aria-label="Delete lane"
129
+ :disabled="laneCount(l.threadId) > 0"
130
+ :title="laneCount(l.threadId) > 0 ? 'Move or delete its cards first' : 'Delete lane'"
131
+ @click="removeLane(l)">
132
+ <svg viewBox="0 0 16 16" width="14" height="14" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><path d="M4 4l8 8M12 4l-8 8"></path></svg>
133
+ </button>
134
+ </template>
135
+ </li>
136
+ <li v-if="!board.lanes.value.length" class="list__row list__row--empty">No lanes connected yet.</li>
137
+ </ul>
138
+ <div class="lane-add">
139
+ <input class="input" v-model="newLane" placeholder="New lane name…" @keydown.enter.prevent="addLane" />
140
+ <button class="btn phases__addbtn" type="button" @click="addLane">Add</button>
141
+ </div>
142
+ </section>
143
+ </section>
144
+ `,
145
+ };
@@ -12,6 +12,7 @@ export * from "./keep-alive-settings.js";
12
12
  export * from "./misc-settings.js";
13
13
  export * from "./detail-grant.js";
14
14
  export declare const TELEGRAM_API_BASE_URL: string;
15
+ export declare const TELEGRAM_SEND_TIMEOUT_MS: number;
15
16
  export declare const AUTONOMOUS_MODE: boolean;
16
17
  export declare const TEMPLATES_DIR: string;
17
18
  export declare const config: AppConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGjD,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AASlC,eAAO,MAAM,qBAAqB,QAC+B,CAAC;AAGlE,eAAO,MAAM,eAAe,SAAyC,CAAC;AAiCtE,eAAO,MAAM,aAAa,QAAwB,CAAC;AAKnD,eAAO,MAAM,MAAM,EAAE,SAWpB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGjD,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AASlC,eAAO,MAAM,qBAAqB,QAC+B,CAAC;AAWlE,eAAO,MAAM,wBAAwB,QAGzB,CAAC;AAGb,eAAO,MAAM,eAAe,SAAyC,CAAC;AAiCtE,eAAO,MAAM,aAAa,QAAwB,CAAC;AAKnD,eAAO,MAAM,MAAM,EAAE,SAWpB,CAAC"}
@@ -21,6 +21,18 @@ const { version: PKG_VERSION } = esmRequire("../../package.json");
21
21
  const TELEGRAM_TOKEN = process.env.TELEGRAM_TOKEN ?? "";
22
22
  const TELEGRAM_CHAT_ID = process.env.TELEGRAM_CHAT_ID ?? "";
23
23
  export const TELEGRAM_API_BASE_URL = process.env.TELEGRAM_API_BASE_URL ?? "https://api.telegram.org";
24
+ /**
25
+ * Total time budget (ms) bounding a Telegram *send* — the WHOLE retry sequence
26
+ * (all attempts plus their backoff), not each attempt. Defaults to 30s to match
27
+ * the TelegramClient class-method budget and to survive a scale-to-zero proxy
28
+ * cold-start (e.g. an Azure Container Apps gateway behind TELEGRAM_API_BASE_URL),
29
+ * which can take several seconds to warm up. Configurable via
30
+ * TELEGRAM_SEND_TIMEOUT_MS; invalid/non-positive values fall back to 30000.
31
+ */
32
+ const rawTelegramSendTimeoutMs = Number(process.env.TELEGRAM_SEND_TIMEOUT_MS ?? "");
33
+ export const TELEGRAM_SEND_TIMEOUT_MS = Number.isFinite(rawTelegramSendTimeoutMs) && rawTelegramSendTimeoutMs > 0
34
+ ? rawTelegramSendTimeoutMs
35
+ : 30_000;
24
36
  const OPENAI_API_KEY = process.env.OPENAI_API_KEY ?? "";
25
37
  const VOICE_ANALYSIS_URL = process.env.VOICE_ANALYSIS_URL ?? "";
26
38
  export const AUTONOMOUS_MODE = process.env.AUTONOMOUS_MODE === "true";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"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"}
@@ -39,6 +39,20 @@ export declare function setPredefinedPrompts(list: PredefinedPrompt[]): void;
39
39
  /** Whether guardrail (Active Decisions) notes are injected into memory briefings. */
40
40
  export declare function getGuardrailsEnabled(): boolean;
41
41
  export declare function setGuardrailsEnabled(enabled: boolean): void;
42
+ /**
43
+ * Whether the usage inbox-notifier is allowed to fan out high-utilization
44
+ * alerts to keep-alive threads. Operator-first alerting invariant: default OFF.
45
+ */
46
+ export declare function getUsageNotifyEnabled(): boolean;
47
+ export declare function setUsageNotifyEnabled(enabled: boolean): void;
48
+ /** Whether an alert has already fired for this dedup key in the current window. */
49
+ export declare function hasUsageNotifiedWindow(key: string): boolean;
50
+ /**
51
+ * Record that an alert fired for `key`, expiring at `expiresAtMs` (the window's
52
+ * reset instant). Prunes any entries whose window has already passed on write,
53
+ * so the map stays bounded to live windows.
54
+ */
55
+ export declare function markUsageNotifiedWindow(key: string, expiresAtMs: number): void;
42
56
  /**
43
57
  * Read the MEMORY_SOURCE_THREAD_ID env var set by the parent process
44
58
  * when spawning a child thread (worker/branch). Returns the parent
@@ -1 +1 @@
1
- {"version":3,"file":"misc-settings.d.ts","sourceRoot":"","sources":["../../src/config/misc-settings.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH,eAAO,MAAM,WAAW,6CAA8C,CAAC;AACvE,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAErD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,SAAS,CAE3D;AAED,qEAAqE;AACrE,wBAAgB,iBAAiB,IAAI,aAAa,EAAE,CASnD;AAED,kFAAkF;AAClF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAM3D;AAED,4CAA4C;AAC5C,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAItD;AAID,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,OAAO,CAAC;AAEnD,2EAA2E;AAC3E,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAO5E;AAED,+CAA+C;AAC/C,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAMxF;AAOD,sFAAsF;AACtF,wBAAgB,wBAAwB,IAAI,MAAM,CAIjD;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAM5D;AAYD,wBAAgB,gBAAgB,IAAI,MAAM,CAIzC;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAMpD;AAQD,wBAAgB,qBAAqB,IAAI,MAAM,CAI9C;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAM3D;AAQD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAKD,yEAAyE;AACzE,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,OAAO,GAAG,gBAAgB,EAAE,CAY3E;AAED,wBAAgB,oBAAoB,IAAI,gBAAgB,EAAE,CAEzD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAInE;AAID,qFAAqF;AACrF,wBAAgB,oBAAoB,IAAI,OAAO,CAI9C;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAI3D;AAID;;;;GAIG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,GAAG,SAAS,CAK5D"}
1
+ {"version":3,"file":"misc-settings.d.ts","sourceRoot":"","sources":["../../src/config/misc-settings.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH,eAAO,MAAM,WAAW,6CAA8C,CAAC;AACvE,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAErD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,SAAS,CAE3D;AAED,qEAAqE;AACrE,wBAAgB,iBAAiB,IAAI,aAAa,EAAE,CASnD;AAED,kFAAkF;AAClF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAM3D;AAED,4CAA4C;AAC5C,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAItD;AAID,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,OAAO,CAAC;AAEnD,2EAA2E;AAC3E,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAO5E;AAED,+CAA+C;AAC/C,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAMxF;AAOD,sFAAsF;AACtF,wBAAgB,wBAAwB,IAAI,MAAM,CAIjD;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAM5D;AAYD,wBAAgB,gBAAgB,IAAI,MAAM,CAIzC;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAMpD;AAQD,wBAAgB,qBAAqB,IAAI,MAAM,CAI9C;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAM3D;AAQD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAKD,yEAAyE;AACzE,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,OAAO,GAAG,gBAAgB,EAAE,CAY3E;AAED,wBAAgB,oBAAoB,IAAI,gBAAgB,EAAE,CAEzD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAInE;AAID,qFAAqF;AACrF,wBAAgB,oBAAoB,IAAI,OAAO,CAI9C;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAI3D;AAID;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAI/C;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAI5D;AAgBD,mFAAmF;AACnF,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAK3D;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAY9E;AAID;;;;GAIG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,GAAG,SAAS,CAK5D"}
@@ -152,6 +152,59 @@ export function setGuardrailsEnabled(enabled) {
152
152
  s.guardrailsEnabled = enabled;
153
153
  });
154
154
  }
155
+ // ─── Usage-notify setting ───────────────────────────────────────────────────
156
+ /**
157
+ * Whether the usage inbox-notifier is allowed to fan out high-utilization
158
+ * alerts to keep-alive threads. Operator-first alerting invariant: default OFF.
159
+ */
160
+ export function getUsageNotifyEnabled() {
161
+ const v = readSettings().usageNotifyEnabled;
162
+ if (typeof v === "boolean")
163
+ return v;
164
+ return false; // default: disabled
165
+ }
166
+ export function setUsageNotifyEnabled(enabled) {
167
+ updateSettings((s) => {
168
+ s.usageNotifyEnabled = enabled;
169
+ });
170
+ }
171
+ // ─── Usage-notify dedup windows ─────────────────────────────────────────────
172
+ // Persisted so an MCP restart inside a 5h-reset window cannot re-spam a
173
+ // high-utilization alert. Keyed `${agentType}:${reset5hAt}`; the value is the
174
+ // window's expiry epoch-ms (the reset instant) so stale entries self-prune.
175
+ function sanitizeUsageWindows(raw) {
176
+ if (!raw || typeof raw !== "object")
177
+ return {};
178
+ const out = {};
179
+ for (const [k, v] of Object.entries(raw)) {
180
+ if (typeof v === "number" && Number.isFinite(v))
181
+ out[k] = v;
182
+ }
183
+ return out;
184
+ }
185
+ /** Whether an alert has already fired for this dedup key in the current window. */
186
+ export function hasUsageNotifiedWindow(key) {
187
+ return Object.prototype.hasOwnProperty.call(sanitizeUsageWindows(readSettings().usageNotifiedWindows), key);
188
+ }
189
+ /**
190
+ * Record that an alert fired for `key`, expiring at `expiresAtMs` (the window's
191
+ * reset instant). Prunes any entries whose window has already passed on write,
192
+ * so the map stays bounded to live windows.
193
+ */
194
+ export function markUsageNotifiedWindow(key, expiresAtMs) {
195
+ updateSettings((s) => {
196
+ // Prune from the settings object the transaction was handed — re-reading the
197
+ // file here would step outside updateSettings' read-modify-write cycle.
198
+ const now = Date.now();
199
+ const next = {};
200
+ for (const [k, v] of Object.entries(sanitizeUsageWindows(s.usageNotifiedWindows))) {
201
+ if (v > now)
202
+ next[k] = v;
203
+ }
204
+ next[key] = expiresAtMs;
205
+ s.usageNotifiedWindows = next;
206
+ });
207
+ }
155
208
  // ─── Child thread memory source ───────────────────────────────────────────
156
209
  /**
157
210
  * Read the MEMORY_SOURCE_THREAD_ID env var set by the parent process
@@ -1 +1 @@
1
- {"version":3,"file":"misc-settings.js","sourceRoot":"","sources":["../../src/config/misc-settings.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAEnE,+EAA+E;AAC/E,4EAA4E;AAC5E,2EAA2E;AAC3E,+EAA+E;AAC/E,0BAA0B;AAE1B,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,WAAW,EAAE,QAAQ,EAAE,SAAS,CAAU,CAAC;AAQvE,MAAM,UAAU,gBAAgB,CAAC,CAAU;IACzC,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAK,WAAiC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACjF,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,iBAAiB;IAC/B,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC,cAAc,CAAC;IAC1C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,OAAO,GAAG,CAAC,MAAM,CACf,CAAC,CAAC,EAAsB,EAAE,CACxB,CAAC,CAAC,CAAC;QACH,OAAQ,CAAmB,CAAC,IAAI,KAAK,QAAQ;QAC7C,gBAAgB,CAAE,CAAmB,CAAC,IAAI,CAAC,CAC9C,CAAC;AACJ,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,gBAAgB,CAAC,KAAoB;IACnD,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE;QACnB,MAAM,IAAI,GAAG,iBAAiB,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC;QACtE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC,CAAC,cAAc,GAAG,IAAI,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE;QACnB,CAAC,CAAC,cAAc,GAAG,iBAAiB,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;AACL,CAAC;AAMD,2EAA2E;AAC3E,MAAM,UAAU,yBAAyB,CAAC,QAAgB;IACxD,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC,uBAA8D,CAAC;IAC1F,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,OAAO;YAAE,OAAO,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,SAAS,CAAC,CAAC,yBAAyB;AAC7C,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,yBAAyB,CAAC,QAAgB,EAAE,IAAsB;IAChF,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE;QACnB,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,uBAAuB,IAAI,EAAE,CAA4B,CAAC;QACzE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC;QAC7B,CAAC,CAAC,uBAAuB,GAAG,GAAG,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,+EAA+E;AAE/E,kFAAkF;AAClF,MAAM,+BAA+B,GAAG,EAAE,CAAC;AAE3C,sFAAsF;AACtF,MAAM,UAAU,wBAAwB;IACtC,MAAM,CAAC,GAAG,YAAY,EAAE,CAAC,qBAAqB,CAAC;IAC/C,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IACpE,OAAO,+BAA+B,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAa;IACpD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO;IACtC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE;QACnB,CAAC,CAAC,qBAAqB,GAAG,OAAO,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,+EAA+E;AAE/E;;;;;GAKG;AACH,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAEpC,MAAM,UAAU,gBAAgB;IAC9B,MAAM,CAAC,GAAG,YAAY,EAAE,CAAC,aAAa,CAAC;IACvC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAChF,OAAO,uBAAuB,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO;IACtC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE;QACnB,CAAC,CAAC,aAAa,GAAG,OAAO,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,uEAAuE;AAEvE,MAAM,4BAA4B,GAAG,IAAI,CAAC;AAC1C,MAAM,qBAAqB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;AACnF,MAAM,gBAAgB,GAAG,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,SAAS,CAAC;AAEpG,MAAM,UAAU,qBAAqB;IACnC,MAAM,CAAC,GAAG,YAAY,EAAE,CAAC,kBAAkB,CAAC;IAC5C,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IACpE,OAAO,gBAAgB,IAAI,4BAA4B,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IACjD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO;IACtC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE;QACnB,CAAC,CAAC,kBAAkB,GAAG,OAAO,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC;AAaD,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAC5B,MAAM,eAAe,GAAG,IAAI,CAAC;AAE7B,yEAAyE;AACzE,MAAM,UAAU,0BAA0B,CAAC,GAAY;IACrD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,MAAM,GAAG,GAAuB,EAAE,CAAC;IACnC,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,SAAS;QAChD,MAAM,GAAG,GAAG,IAA+B,CAAC;QAC5C,MAAM,KAAK,GAAG,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,MAAM,IAAI,GAAG,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI;YAAE,SAAS;QAC9B,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC;IAC9F,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,0BAA0B,CAAC,YAAY,EAAE,CAAC,iBAAiB,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAwB;IAC3D,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE;QACnB,CAAC,CAAC,iBAAiB,GAAG,0BAA0B,CAAC,IAAI,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC;AAED,+EAA+E;AAE/E,qFAAqF;AACrF,MAAM,UAAU,oBAAoB;IAClC,MAAM,CAAC,GAAG,YAAY,EAAE,CAAC,iBAAiB,CAAC;IAC3C,IAAI,OAAO,CAAC,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC;IACrC,OAAO,IAAI,CAAC,CAAC,mBAAmB;AAClC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE;QACnB,CAAC,CAAC,iBAAiB,GAAG,OAAO,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,6EAA6E;AAE7E;;;;GAIG;AACH,MAAM,UAAU,uBAAuB;IACrC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;IAChD,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACtB,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5C,CAAC"}
1
+ {"version":3,"file":"misc-settings.js","sourceRoot":"","sources":["../../src/config/misc-settings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Board-front static serving — GET /board and /board/*.
3
+ *
4
+ * The board is a separate, BUILDLESS app (§4.2 of the v2 plan): the server serves
5
+ * src/board-front/ as static files, no bundling. Resolution mirrors the dashboard
6
+ * SPA's getDashboardHTML() candidate pattern — try the packaged copy first
7
+ * (dist/board/), fall back to the dev source (src/board-front/) so edits are live
8
+ * on refresh under tsx with no rebuild.
9
+ *
10
+ * Served WITHOUT auth exactly like /dashboard (the SPA handles token entry in the
11
+ * browser; every /api/* call it makes is Bearer-authed). A path-traversal guard
12
+ * keeps requests inside the board root.
13
+ */
14
+ import type { ServerResponse } from "node:http";
15
+ /** True for the board app's own routes. */
16
+ export declare function isBoardPath(pathname: string): boolean;
17
+ /**
18
+ * Serve a board-front file. Returns true once the response is handled.
19
+ * `/board` (no trailing slash) 301s to `/board/` so the app's relative asset
20
+ * URLs (`./main.js`, `./vendor/…`) resolve under /board/.
21
+ */
22
+ export declare function handleBoardStatic(pathname: string, res: ServerResponse): boolean;
23
+ //# sourceMappingURL=board-static.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"board-static.d.ts","sourceRoot":"","sources":["../../src/dashboard/board-static.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAKhD,2CAA2C;AAC3C,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAErD;AAuDD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CA2DhF"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Board-front static serving — GET /board and /board/*.
3
+ *
4
+ * The board is a separate, BUILDLESS app (§4.2 of the v2 plan): the server serves
5
+ * src/board-front/ as static files, no bundling. Resolution mirrors the dashboard
6
+ * SPA's getDashboardHTML() candidate pattern — try the packaged copy first
7
+ * (dist/board/), fall back to the dev source (src/board-front/) so edits are live
8
+ * on refresh under tsx with no rebuild.
9
+ *
10
+ * Served WITHOUT auth exactly like /dashboard (the SPA handles token entry in the
11
+ * browser; every /api/* call it makes is Bearer-authed). A path-traversal guard
12
+ * keeps requests inside the board root.
13
+ */
14
+ import { existsSync, readFileSync, realpathSync, statSync } from "node:fs";
15
+ import { dirname, extname, join, normalize, sep } from "node:path";
16
+ import { fileURLToPath } from "node:url";
17
+ /** True for the board app's own routes. */
18
+ export function isBoardPath(pathname) {
19
+ return pathname === "/board" || pathname.startsWith("/board/");
20
+ }
21
+ const MIME = {
22
+ ".html": "text/html; charset=utf-8",
23
+ ".js": "text/javascript; charset=utf-8",
24
+ ".mjs": "text/javascript; charset=utf-8",
25
+ ".css": "text/css; charset=utf-8",
26
+ ".json": "application/json; charset=utf-8",
27
+ ".map": "application/json; charset=utf-8",
28
+ ".svg": "image/svg+xml",
29
+ ".ico": "image/x-icon",
30
+ ".png": "image/png",
31
+ ".webmanifest": "application/manifest+json",
32
+ };
33
+ /** Candidate board roots, packaged first then dev source. */
34
+ function boardRootCandidates() {
35
+ const __dir = dirname(fileURLToPath(import.meta.url)); // src/dashboard or dist/dashboard
36
+ return [
37
+ join(__dir, "..", "..", "dist", "board"), // packaged install
38
+ join(__dir, "..", "..", "src", "board-front"), // dev via tsx (live on refresh)
39
+ ];
40
+ }
41
+ let _cachedRoot;
42
+ /** First candidate root that actually contains index.html (cached). */
43
+ function boardRoot() {
44
+ if (_cachedRoot !== undefined)
45
+ return _cachedRoot;
46
+ _cachedRoot = boardRootCandidates().find((r) => existsSync(join(r, "index.html"))) ?? null;
47
+ return _cachedRoot;
48
+ }
49
+ let _cachedRealRoot;
50
+ /** The board root resolved through symlinks (cached) — the containment anchor
51
+ * for the symlink guard. Falls back to the lexical root if realpath fails. */
52
+ function boardRealRoot() {
53
+ if (_cachedRealRoot !== undefined)
54
+ return _cachedRealRoot;
55
+ const r = boardRoot();
56
+ try {
57
+ _cachedRealRoot = r ? realpathSync(r) : null;
58
+ }
59
+ catch {
60
+ _cachedRealRoot = r;
61
+ }
62
+ return _cachedRealRoot;
63
+ }
64
+ function sendFile(res, file) {
65
+ const body = readFileSync(file);
66
+ const type = MIME[extname(file).toLowerCase()] ?? "application/octet-stream";
67
+ res.writeHead(200, { "Content-Type": type, "Cache-Control": "no-cache" });
68
+ res.end(body);
69
+ }
70
+ /**
71
+ * Serve a board-front file. Returns true once the response is handled.
72
+ * `/board` (no trailing slash) 301s to `/board/` so the app's relative asset
73
+ * URLs (`./main.js`, `./vendor/…`) resolve under /board/.
74
+ */
75
+ export function handleBoardStatic(pathname, res) {
76
+ if (pathname === "/board") {
77
+ res.writeHead(301, { Location: "/board/" });
78
+ res.end();
79
+ return true;
80
+ }
81
+ const root = boardRoot();
82
+ if (!root) {
83
+ res.writeHead(500, { "Content-Type": "text/plain" });
84
+ res.end("board-front not found");
85
+ return true;
86
+ }
87
+ let rel = pathname.slice("/board/".length);
88
+ if (rel === "")
89
+ rel = "index.html";
90
+ let decoded;
91
+ try {
92
+ decoded = decodeURIComponent(rel);
93
+ }
94
+ catch {
95
+ res.writeHead(400, { "Content-Type": "text/plain" });
96
+ res.end("Bad request");
97
+ return true;
98
+ }
99
+ const full = normalize(join(root, decoded));
100
+ // Lexical traversal guard: the joined path must stay under the root.
101
+ if (full !== root && !full.startsWith(root + sep)) {
102
+ res.writeHead(403, { "Content-Type": "text/plain" });
103
+ res.end("Forbidden");
104
+ return true;
105
+ }
106
+ // Symlink guard: resolve the REAL path and re-check containment, so a symlink
107
+ // placed inside the root cannot read a file outside it. A missing file / broken
108
+ // link (realpathSync throws) is an unknown client path → hash-router fallback.
109
+ let real;
110
+ try {
111
+ real = realpathSync(full);
112
+ }
113
+ catch {
114
+ sendFile(res, join(root, "index.html"));
115
+ return true;
116
+ }
117
+ const realRoot = boardRealRoot();
118
+ if (realRoot && real !== realRoot && !real.startsWith(realRoot + sep)) {
119
+ res.writeHead(403, { "Content-Type": "text/plain" });
120
+ res.end("Forbidden");
121
+ return true;
122
+ }
123
+ // A directory (e.g. `/board/`) resolves to the app entry.
124
+ if (statSync(real).isDirectory()) {
125
+ sendFile(res, join(root, "index.html"));
126
+ return true;
127
+ }
128
+ sendFile(res, real);
129
+ return true;
130
+ }
131
+ //# sourceMappingURL=board-static.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"board-static.js","sourceRoot":"","sources":["../../src/dashboard/board-static.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Dashboard API — Agent Task Board routes.
3
+ *
4
+ * The ONLY write surface for the board (single-writer invariant): the operator
5
+ * acts here; agents never see these endpoints. The orchestrator service is the
6
+ * other writer (worker reports → comments, status moves) but that is server
7
+ * code, not an exposed surface.
8
+ *
9
+ * Routes (all Bearer-auth like every /api/*):
10
+ * GET /api/board/cards?includeArchived=1&lane=<threadId>
11
+ * POST /api/board/cards
12
+ * GET /api/board/cards/:id (card + comments)
13
+ * PATCH /api/board/cards/:id
14
+ * DELETE /api/board/cards/:id
15
+ * POST /api/board/cards/:id/comments
16
+ * GET /api/board/lanes
17
+ * POST /api/board/lanes
18
+ * DELETE /api/board/lanes/:threadId
19
+ * GET /api/board/profiles
20
+ * PUT /api/board/profiles
21
+ */
22
+ import { type RouteArgs, type RouteHandler } from "./types.js";
23
+ /** GET /api/board/cards → { cards } (comments not included; fetch per card). */
24
+ export declare const handleGetBoardCards: RouteHandler;
25
+ /** POST /api/board/cards — create; type seeds the profile, explicit fields win. */
26
+ export declare const handlePostBoardCard: RouteHandler;
27
+ /** GET /api/board/cards/:id → { card, comments } */
28
+ export declare function handleGetBoardCard(args: RouteArgs, cardId: number): boolean;
29
+ /**
30
+ * PATCH /api/board/cards/:id — operator edits, drag-drop status moves, resume.
31
+ *
32
+ * Live-card policy (design D2/D4): a card that is in_progress is TASK-IMMUTABLE.
33
+ * The bound worker owns what it is DOING; the only way to change that is an
34
+ * explicit Stop (POST .../stop) that decommissions it. So while in_progress:
35
+ * • re-laning, archiving, and profile/type edits are REFUSED (409) — "Stop
36
+ * first" — because they would silently diverge from what the worker runs.
37
+ * • moving to backlog (re-run) or done ALLOWS the move but first releases
38
+ * (kills + tears down) the bound worker, so no orphaned/duplicate worker
39
+ * survives to double-push or leak its report (R1 closes B1/B2).
40
+ * Leaving in_progress/blocked clears the worker binding + blocked reason so a
41
+ * later dispatch spawns a FRESH stateless worker (design §3.5).
42
+ */
43
+ export declare function handlePatchBoardCard(args: RouteArgs, cardId: number): Promise<boolean>;
44
+ /**
45
+ * POST /api/board/cards/:id/stop — explicit operator Stop (design D3).
46
+ * Decommission the bound worker (kill + teardown) and park the card in blocked
47
+ * with a clear reason. Blocked is never auto-dispatched, so the card sits safely
48
+ * until the operator resumes it (→ backlog re-dispatches a fresh worker).
49
+ */
50
+ export declare function handleStopBoardCard(args: RouteArgs, cardId: number): Promise<boolean>;
51
+ /** DELETE /api/board/cards/:id — remove the card. A live card's bound worker
52
+ * is decommissioned first (R1/B8) so deleting it never orphans a running
53
+ * worker that would push/report against a card that no longer exists. */
54
+ export declare function handleDeleteBoardCard(args: RouteArgs, cardId: number): Promise<boolean>;
55
+ /** POST /api/board/cards/:id/comments — operator comment. */
56
+ export declare function handlePostBoardComment(args: RouteArgs, cardId: number): Promise<boolean>;
57
+ /** GET /api/board/lanes → lanes decorated with thread names for the UI. */
58
+ export declare const handleGetBoardLanes: RouteHandler;
59
+ /** POST /api/board/lanes — connect/disconnect a thread, set max_concurrent. */
60
+ export declare const handlePostBoardLane: RouteHandler;
61
+ /** DELETE /api/board/lanes/:threadId */
62
+ export declare function handleDeleteBoardLane(args: RouteArgs, threadId: number): boolean;
63
+ /** GET /api/board/profiles → effective per-type templates (builtin ⊕ overrides). */
64
+ export declare const handleGetBoardProfiles: RouteHandler;
65
+ /** PUT /api/board/profiles — persist operator overrides wholesale. */
66
+ export declare const handlePutBoardProfiles: RouteHandler;
67
+ /**
68
+ * GET /api/board/usage → current usage snapshot(s) from the shared provider.
69
+ * Agent-type-blind consumer of the port (OCP): returns whatever the poller has
70
+ * stored, `{ sources: [] }` when the monitor is inert.
71
+ */
72
+ export declare function handleGetBoardUsage({ json }: RouteArgs): boolean;
73
+ //# sourceMappingURL=board.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"board.d.ts","sourceRoot":"","sources":["../../../src/dashboard/routes/board.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAY,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAuJzE,gFAAgF;AAChF,eAAO,MAAM,mBAAmB,EAAE,YAuBjC,CAAC;AAEF,mFAAmF;AACnF,eAAO,MAAM,mBAAmB,EAAE,YA4DjC,CAAC;AAEF,oDAAoD;AACpD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAa3E;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAiJ5F;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAwB3F;AAED;;0EAE0E;AAC1E,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAoB7F;AAED,6DAA6D;AAC7D,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAkB9F;AAID,2EAA2E;AAC3E,eAAO,MAAM,mBAAmB,EAAE,YAWjC,CAAC;AAEF,+EAA+E;AAC/E,eAAO,MAAM,mBAAmB,EAAE,YAkCjC,CAAC;AAEF,wCAAwC;AACxC,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAuBhF;AAID,oFAAoF;AACpF,eAAO,MAAM,sBAAsB,EAAE,YAOpC,CAAC;AAEF,sEAAsE;AACtE,eAAO,MAAM,sBAAsB,EAAE,YAgCpC,CAAC;AAIF;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS,GAAG,OAAO,CAGhE"}