@heretek-ai/epistemic-swarm 1.0.5 → 1.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/tui.js +224 -174
- package/package.json +2 -2
- package/src/agents.ts +9 -0
- package/src/continue.ts +2 -2
- package/src/panels.tsx +19 -0
- package/src/policy.ts +46 -33
- package/src/research.ts +105 -41
- package/src/rpc-def.ts +19 -31
- package/src/rpc.ts +26 -77
- package/src/runtime.ts +44 -37
- package/src/server.ts +69 -7
- package/src/session.ts +4 -2
- package/src/tools.ts +16 -1
- package/src/tui.tsx +32 -18
package/dist/tui.js
CHANGED
|
@@ -94,51 +94,107 @@ var FactoryPanel = (props) => {
|
|
|
94
94
|
return _el$8;
|
|
95
95
|
})(), _$createComponent(Show, {
|
|
96
96
|
get when() {
|
|
97
|
-
return data().
|
|
97
|
+
return data().tree;
|
|
98
98
|
},
|
|
99
99
|
get children() {
|
|
100
|
-
var _el$0 = _$createElement("text"), _el$1 = _$createTextNode(`
|
|
100
|
+
var _el$0 = _$createElement("text"), _el$1 = _$createTextNode(`Design tree (round `), _el$10 = _$createTextNode(`): `), _el$11 = _$createTextNode(` settled \xB7 `), _el$12 = _$createTextNode(` open \xB7 `), _el$14 = _$createTextNode(` deferred`);
|
|
101
101
|
_$insertNode(_el$0, _el$1);
|
|
102
|
-
_$
|
|
102
|
+
_$insertNode(_el$0, _el$10);
|
|
103
|
+
_$insertNode(_el$0, _el$11);
|
|
104
|
+
_$insertNode(_el$0, _el$12);
|
|
105
|
+
_$insertNode(_el$0, _el$14);
|
|
106
|
+
_$insert(_el$0, () => data().tree.round, _el$10);
|
|
107
|
+
_$insert(_el$0, () => data().tree.settled, _el$11);
|
|
108
|
+
_$insert(_el$0, () => data().tree.open, _el$12);
|
|
109
|
+
_$insert(_el$0, () => data().tree.deferred, _el$14);
|
|
110
|
+
_$insert(_el$0, (() => {
|
|
111
|
+
var _c$3 = _$memo(() => !!data().tree.facts);
|
|
112
|
+
return () => _c$3() ? ` (${data().tree.facts} for research)` : "";
|
|
113
|
+
})(), null);
|
|
103
114
|
return _el$0;
|
|
104
115
|
}
|
|
116
|
+
}), _$createComponent(Show, {
|
|
117
|
+
get when() {
|
|
118
|
+
return data().halt;
|
|
119
|
+
},
|
|
120
|
+
get children() {
|
|
121
|
+
var _el$15 = _$createElement("text"), _el$16 = _$createTextNode(`HALTED: `);
|
|
122
|
+
_$insertNode(_el$15, _el$16);
|
|
123
|
+
_$insert(_el$15, () => data().halt, null);
|
|
124
|
+
return _el$15;
|
|
125
|
+
}
|
|
105
126
|
}), _$createComponent(Show, {
|
|
106
127
|
get when() {
|
|
107
128
|
return data().release;
|
|
108
129
|
},
|
|
109
130
|
get children() {
|
|
110
|
-
var _el$
|
|
111
|
-
_$insertNode(_el$
|
|
112
|
-
_$insert(_el$
|
|
113
|
-
return _el$
|
|
131
|
+
var _el$17 = _$createElement("text"), _el$18 = _$createTextNode(`PR: `);
|
|
132
|
+
_$insertNode(_el$17, _el$18);
|
|
133
|
+
_$insert(_el$17, () => data().release, null);
|
|
134
|
+
return _el$17;
|
|
114
135
|
}
|
|
115
136
|
}), _$createComponent(Show, {
|
|
116
137
|
get when() {
|
|
117
138
|
return data().pending.length;
|
|
118
139
|
},
|
|
119
140
|
get children() {
|
|
120
|
-
var _el$
|
|
121
|
-
_$insertNode(_el$
|
|
122
|
-
_$insert(_el$
|
|
123
|
-
return _el$
|
|
141
|
+
var _el$19 = _$createElement("text"), _el$20 = _$createTextNode(`Waiting on human: `);
|
|
142
|
+
_$insertNode(_el$19, _el$20);
|
|
143
|
+
_$insert(_el$19, () => data().pending.join(", "), null);
|
|
144
|
+
return _el$19;
|
|
145
|
+
}
|
|
146
|
+
}), _$createComponent(Show, {
|
|
147
|
+
get when() {
|
|
148
|
+
return data().audits?.length;
|
|
149
|
+
},
|
|
150
|
+
get children() {
|
|
151
|
+
return [(() => {
|
|
152
|
+
var _el$21 = _$createElement("text");
|
|
153
|
+
_$insertNode(_el$21, _$createTextNode(`Audits:`));
|
|
154
|
+
return _el$21;
|
|
155
|
+
})(), _$createComponent(For, {
|
|
156
|
+
get each() {
|
|
157
|
+
return data().audits;
|
|
158
|
+
},
|
|
159
|
+
children: (audit) => (() => {
|
|
160
|
+
var _el$25 = _$createElement("text"), _el$26 = _$createTextNode(` `), _el$27 = _$createTextNode(` \xB7 `), _el$28 = _$createTextNode(` \xB7 `), _el$29 = _$createTextNode(` r`), _el$30 = _$createTextNode(` \xB7 t:`), _el$31 = _$createTextNode(` a:`);
|
|
161
|
+
_$insertNode(_el$25, _el$26);
|
|
162
|
+
_$insertNode(_el$25, _el$27);
|
|
163
|
+
_$insertNode(_el$25, _el$28);
|
|
164
|
+
_$insertNode(_el$25, _el$29);
|
|
165
|
+
_$insertNode(_el$25, _el$30);
|
|
166
|
+
_$insertNode(_el$25, _el$31);
|
|
167
|
+
_$insert(_el$25, () => audit.id, _el$27);
|
|
168
|
+
_$insert(_el$25, () => audit.target, _el$28);
|
|
169
|
+
_$insert(_el$25, () => audit.status, _el$29);
|
|
170
|
+
_$insert(_el$25, () => audit.round, _el$30);
|
|
171
|
+
_$insert(_el$25, () => audit.thesis, _el$31);
|
|
172
|
+
_$insert(_el$25, () => audit.antithesis, null);
|
|
173
|
+
_$insert(_el$25, (() => {
|
|
174
|
+
var _c$4 = _$memo(() => !!audit.tiebreak);
|
|
175
|
+
return () => _c$4() ? ` x:${audit.tiebreak}` : "";
|
|
176
|
+
})(), null);
|
|
177
|
+
return _el$25;
|
|
178
|
+
})()
|
|
179
|
+
})];
|
|
124
180
|
}
|
|
125
181
|
}), (() => {
|
|
126
|
-
var _el$
|
|
127
|
-
_$insertNode(_el$
|
|
128
|
-
return _el$
|
|
182
|
+
var _el$23 = _$createElement("text");
|
|
183
|
+
_$insertNode(_el$23, _$createTextNode(`Phases:`));
|
|
184
|
+
return _el$23;
|
|
129
185
|
})(), _$createComponent(For, {
|
|
130
186
|
get each() {
|
|
131
187
|
return data().phases;
|
|
132
188
|
},
|
|
133
189
|
children: (phase) => (() => {
|
|
134
|
-
var _el$
|
|
135
|
-
_$insertNode(_el$
|
|
136
|
-
_$insertNode(_el$
|
|
137
|
-
_$insert(_el$
|
|
138
|
-
_$insert(_el$
|
|
139
|
-
_$insert(_el$
|
|
140
|
-
_$insert(_el$
|
|
141
|
-
return _el$
|
|
190
|
+
var _el$32 = _$createElement("text"), _el$33 = _$createTextNode(` \xB7 `), _el$34 = _$createTextNode(` \xB7 failures `);
|
|
191
|
+
_$insertNode(_el$32, _el$33);
|
|
192
|
+
_$insertNode(_el$32, _el$34);
|
|
193
|
+
_$insert(_el$32, () => phase.id === data().activePhase ? "\u25B6 " : " ", _el$33);
|
|
194
|
+
_$insert(_el$32, () => phase.id, _el$33);
|
|
195
|
+
_$insert(_el$32, () => phase.status, _el$34);
|
|
196
|
+
_$insert(_el$32, () => phase.failures, null);
|
|
197
|
+
return _el$32;
|
|
142
198
|
})()
|
|
143
199
|
})]
|
|
144
200
|
})];
|
|
@@ -160,43 +216,43 @@ var LspPanel = (props) => {
|
|
|
160
216
|
},
|
|
161
217
|
get fallback() {
|
|
162
218
|
return (() => {
|
|
163
|
-
var _el$
|
|
164
|
-
_$insert(_el$
|
|
165
|
-
return _el$
|
|
219
|
+
var _el$35 = _$createElement("text");
|
|
220
|
+
_$insert(_el$35, () => state.error() ? "" : "Loading language servers\u2026");
|
|
221
|
+
return _el$35;
|
|
166
222
|
})();
|
|
167
223
|
},
|
|
168
224
|
children: (data) => [(() => {
|
|
169
|
-
var _el$
|
|
170
|
-
_$insert(_el$
|
|
171
|
-
return _el$
|
|
225
|
+
var _el$36 = _$createElement("text");
|
|
226
|
+
_$insert(_el$36, () => data().enabled ? "LSP is on." : "LSP is disabled (lsp: false).");
|
|
227
|
+
return _el$36;
|
|
172
228
|
})(), _$createComponent(For, {
|
|
173
229
|
get each() {
|
|
174
230
|
return data().servers;
|
|
175
231
|
},
|
|
176
232
|
children: (server) => (() => {
|
|
177
|
-
var _el$
|
|
178
|
-
_$insertNode(_el$
|
|
179
|
-
_$insertNode(_el$
|
|
180
|
-
_$insertNode(_el$
|
|
181
|
-
_$insert(_el$
|
|
182
|
-
_$insert(_el$
|
|
183
|
-
_$insert(_el$
|
|
184
|
-
_$insert(_el$
|
|
185
|
-
var _c$
|
|
186
|
-
return () => _c$
|
|
233
|
+
var _el$37 = _$createElement("text"), _el$38 = _$createTextNode(` `), _el$39 = _$createTextNode(` [`), _el$40 = _$createTextNode(`]`);
|
|
234
|
+
_$insertNode(_el$37, _el$38);
|
|
235
|
+
_$insertNode(_el$37, _el$39);
|
|
236
|
+
_$insertNode(_el$37, _el$40);
|
|
237
|
+
_$insert(_el$37, () => server.available ? "\u25CF" : "\u25CB", _el$38);
|
|
238
|
+
_$insert(_el$37, () => server.id, _el$39);
|
|
239
|
+
_$insert(_el$37, () => server.extensions.join(" "), _el$40);
|
|
240
|
+
_$insert(_el$37, (() => {
|
|
241
|
+
var _c$5 = _$memo(() => !!server.running);
|
|
242
|
+
return () => _c$5() ? ` \xB7 ${server.running} running` : "";
|
|
187
243
|
})(), null);
|
|
188
|
-
_$insert(_el$
|
|
189
|
-
return _el$
|
|
244
|
+
_$insert(_el$37, () => server.available ? "" : " \u2014 not installed", null);
|
|
245
|
+
return _el$37;
|
|
190
246
|
})()
|
|
191
247
|
}), _$createComponent(For, {
|
|
192
248
|
get each() {
|
|
193
249
|
return data().diagnostics;
|
|
194
250
|
},
|
|
195
251
|
children: (diagnostic) => (() => {
|
|
196
|
-
var _el$
|
|
197
|
-
_$insertNode(_el$
|
|
198
|
-
_$insert(_el$
|
|
199
|
-
return _el$
|
|
252
|
+
var _el$41 = _$createElement("text"), _el$42 = _$createTextNode(`! `);
|
|
253
|
+
_$insertNode(_el$41, _el$42);
|
|
254
|
+
_$insert(_el$41, diagnostic, null);
|
|
255
|
+
return _el$41;
|
|
200
256
|
})()
|
|
201
257
|
})]
|
|
202
258
|
})];
|
|
@@ -218,30 +274,30 @@ var HooksPanel = (props) => {
|
|
|
218
274
|
},
|
|
219
275
|
get fallback() {
|
|
220
276
|
return (() => {
|
|
221
|
-
var _el$
|
|
222
|
-
_$insert(_el$
|
|
223
|
-
return _el$
|
|
277
|
+
var _el$43 = _$createElement("text");
|
|
278
|
+
_$insert(_el$43, () => state.error() ? "" : "Loading hooks\u2026");
|
|
279
|
+
return _el$43;
|
|
224
280
|
})();
|
|
225
281
|
},
|
|
226
282
|
children: (data) => [(() => {
|
|
227
|
-
var _el$
|
|
228
|
-
_$insertNode(_el$
|
|
229
|
-
_$insertNode(_el$
|
|
230
|
-
_$insert(_el$
|
|
231
|
-
_$insert(_el$
|
|
232
|
-
_$insert(_el$
|
|
233
|
-
var _c$
|
|
234
|
-
return () => _c$
|
|
283
|
+
var _el$44 = _$createElement("text"), _el$45 = _$createTextNode(` handler(s) \xB7 `), _el$46 = _$createTextNode(` from the project \xB7 `);
|
|
284
|
+
_$insertNode(_el$44, _el$45);
|
|
285
|
+
_$insertNode(_el$44, _el$46);
|
|
286
|
+
_$insert(_el$44, () => data().handlers, _el$45);
|
|
287
|
+
_$insert(_el$44, () => data().projectHandlers, _el$46);
|
|
288
|
+
_$insert(_el$44, (() => {
|
|
289
|
+
var _c$6 = _$memo(() => data().projectHandlers === 0);
|
|
290
|
+
return () => _c$6() ? "nothing to trust" : data().trusted ? "trusted" : "NOT trusted";
|
|
235
291
|
})(), null);
|
|
236
|
-
return _el$
|
|
292
|
+
return _el$44;
|
|
237
293
|
})(), _$createComponent(For, {
|
|
238
294
|
get each() {
|
|
239
295
|
return data().projectLines;
|
|
240
296
|
},
|
|
241
297
|
children: (line) => (() => {
|
|
242
|
-
var _el$
|
|
243
|
-
_$insert(_el$
|
|
244
|
-
return _el$
|
|
298
|
+
var _el$50 = _$createElement("text");
|
|
299
|
+
_$insert(_el$50, line);
|
|
300
|
+
return _el$50;
|
|
245
301
|
})()
|
|
246
302
|
}), _$createComponent(Show, {
|
|
247
303
|
get when() {
|
|
@@ -249,24 +305,24 @@ var HooksPanel = (props) => {
|
|
|
249
305
|
},
|
|
250
306
|
get children() {
|
|
251
307
|
return [(() => {
|
|
252
|
-
var _el$
|
|
253
|
-
_$insertNode(_el$
|
|
254
|
-
return _el$
|
|
308
|
+
var _el$48 = _$createElement("text");
|
|
309
|
+
_$insertNode(_el$48, _$createTextNode(`Capability loss (advisory rows):`));
|
|
310
|
+
return _el$48;
|
|
255
311
|
})(), _$createComponent(For, {
|
|
256
312
|
get each() {
|
|
257
313
|
return data().loss;
|
|
258
314
|
},
|
|
259
315
|
children: (item) => (() => {
|
|
260
|
-
var _el$
|
|
261
|
-
_$insertNode(_el$
|
|
262
|
-
_$insertNode(_el$
|
|
263
|
-
_$insertNode(_el$
|
|
264
|
-
_$insertNode(_el$
|
|
265
|
-
_$insert(_el$
|
|
266
|
-
_$insert(_el$
|
|
267
|
-
_$insert(_el$
|
|
268
|
-
_$insert(_el$
|
|
269
|
-
return _el$
|
|
316
|
+
var _el$51 = _$createElement("text"), _el$52 = _$createTextNode(`! `), _el$53 = _$createTextNode(` \xB7 `), _el$54 = _$createTextNode(` \u2014 `), _el$55 = _$createTextNode(`: `);
|
|
317
|
+
_$insertNode(_el$51, _el$52);
|
|
318
|
+
_$insertNode(_el$51, _el$53);
|
|
319
|
+
_$insertNode(_el$51, _el$54);
|
|
320
|
+
_$insertNode(_el$51, _el$55);
|
|
321
|
+
_$insert(_el$51, () => item.event, _el$53);
|
|
322
|
+
_$insert(_el$51, () => item.handler, _el$54);
|
|
323
|
+
_$insert(_el$51, () => item.support, _el$55);
|
|
324
|
+
_$insert(_el$51, () => item.reason, null);
|
|
325
|
+
return _el$51;
|
|
270
326
|
})()
|
|
271
327
|
})];
|
|
272
328
|
}
|
|
@@ -275,20 +331,20 @@ var HooksPanel = (props) => {
|
|
|
275
331
|
return data().diagnostics;
|
|
276
332
|
},
|
|
277
333
|
children: (item) => (() => {
|
|
278
|
-
var _el$
|
|
279
|
-
_$insertNode(_el$
|
|
280
|
-
_$insert(_el$
|
|
281
|
-
return _el$
|
|
334
|
+
var _el$56 = _$createElement("text"), _el$57 = _$createTextNode(`! `);
|
|
335
|
+
_$insertNode(_el$56, _el$57);
|
|
336
|
+
_$insert(_el$56, item, null);
|
|
337
|
+
return _el$56;
|
|
282
338
|
})()
|
|
283
339
|
}), _$createComponent(For, {
|
|
284
340
|
get each() {
|
|
285
341
|
return data().recent;
|
|
286
342
|
},
|
|
287
343
|
children: (item) => (() => {
|
|
288
|
-
var _el$
|
|
289
|
-
_$insertNode(_el$
|
|
290
|
-
_$insert(_el$
|
|
291
|
-
return _el$
|
|
344
|
+
var _el$58 = _$createElement("text"), _el$59 = _$createTextNode(`recent error: `);
|
|
345
|
+
_$insertNode(_el$58, _el$59);
|
|
346
|
+
_$insert(_el$58, item, null);
|
|
347
|
+
return _el$58;
|
|
292
348
|
})()
|
|
293
349
|
})]
|
|
294
350
|
})];
|
|
@@ -310,9 +366,9 @@ var BrainstormPanel = (props) => {
|
|
|
310
366
|
},
|
|
311
367
|
get fallback() {
|
|
312
368
|
return (() => {
|
|
313
|
-
var _el$
|
|
314
|
-
_$insert(_el$
|
|
315
|
-
return _el$
|
|
369
|
+
var _el$60 = _$createElement("text");
|
|
370
|
+
_$insert(_el$60, () => state.error() ? "" : "Loading brainstorm\u2026");
|
|
371
|
+
return _el$60;
|
|
316
372
|
})();
|
|
317
373
|
},
|
|
318
374
|
children: (data) => _$createComponent(Show, {
|
|
@@ -321,41 +377,41 @@ var BrainstormPanel = (props) => {
|
|
|
321
377
|
},
|
|
322
378
|
get fallback() {
|
|
323
379
|
return (() => {
|
|
324
|
-
var _el$
|
|
325
|
-
_$insertNode(_el$
|
|
326
|
-
return _el$
|
|
380
|
+
var _el$75 = _$createElement("text");
|
|
381
|
+
_$insertNode(_el$75, _$createTextNode(`No brainstorm in .factory/brainstorm yet. Run /brainstorm.`));
|
|
382
|
+
return _el$75;
|
|
327
383
|
})();
|
|
328
384
|
},
|
|
329
385
|
get children() {
|
|
330
386
|
return [(() => {
|
|
331
|
-
var _el$
|
|
332
|
-
_$insertNode(_el$
|
|
333
|
-
_$insert(_el$
|
|
334
|
-
return _el$
|
|
387
|
+
var _el$61 = _$createElement("text"), _el$62 = _$createTextNode(`Brief: `);
|
|
388
|
+
_$insertNode(_el$61, _el$62);
|
|
389
|
+
_$insert(_el$61, () => data().brief, null);
|
|
390
|
+
return _el$61;
|
|
335
391
|
})(), (() => {
|
|
336
|
-
var _el$
|
|
337
|
-
_$insertNode(_el$
|
|
338
|
-
_$insertNode(_el$
|
|
339
|
-
_$insertNode(_el$
|
|
340
|
-
_$insert(_el$
|
|
341
|
-
_$insert(_el$
|
|
342
|
-
_$insert(_el$
|
|
343
|
-
_$insert(_el$
|
|
344
|
-
return _el$
|
|
392
|
+
var _el$63 = _$createElement("text"), _el$64 = _$createTextNode(` idea(s) \xB7 `), _el$65 = _$createTextNode(` duplicate(s) \xB7 `), _el$66 = _$createTextNode(` scored \xB7 `);
|
|
393
|
+
_$insertNode(_el$63, _el$64);
|
|
394
|
+
_$insertNode(_el$63, _el$65);
|
|
395
|
+
_$insertNode(_el$63, _el$66);
|
|
396
|
+
_$insert(_el$63, () => data().ideas, _el$64);
|
|
397
|
+
_$insert(_el$63, () => data().duplicates, _el$65);
|
|
398
|
+
_$insert(_el$63, () => data().scored, _el$66);
|
|
399
|
+
_$insert(_el$63, () => data().complete ? "complete" : "in progress", null);
|
|
400
|
+
return _el$63;
|
|
345
401
|
})(), (() => {
|
|
346
|
-
var _el$
|
|
347
|
-
_$insertNode(_el$
|
|
348
|
-
_$insert(_el$
|
|
349
|
-
return _el$
|
|
402
|
+
var _el$68 = _$createElement("text"), _el$69 = _$createTextNode(`Coverage: `);
|
|
403
|
+
_$insertNode(_el$68, _el$69);
|
|
404
|
+
_$insert(_el$68, () => data().lenses.map((lens) => `${lens} ${data().coverage[lens] ?? 0}`).join(" \xB7 "), null);
|
|
405
|
+
return _el$68;
|
|
350
406
|
})(), _$createComponent(Show, {
|
|
351
407
|
get when() {
|
|
352
408
|
return data().gaps.length;
|
|
353
409
|
},
|
|
354
410
|
get children() {
|
|
355
|
-
var _el$
|
|
356
|
-
_$insertNode(_el$
|
|
357
|
-
_$insert(_el$
|
|
358
|
-
return _el$
|
|
411
|
+
var _el$71 = _$createElement("text"), _el$72 = _$createTextNode(`Gaps: `);
|
|
412
|
+
_$insertNode(_el$71, _el$72);
|
|
413
|
+
_$insert(_el$71, () => data().gaps.join(", "), null);
|
|
414
|
+
return _el$71;
|
|
359
415
|
}
|
|
360
416
|
}), _$createComponent(Show, {
|
|
361
417
|
get when() {
|
|
@@ -363,24 +419,24 @@ var BrainstormPanel = (props) => {
|
|
|
363
419
|
},
|
|
364
420
|
get children() {
|
|
365
421
|
return [(() => {
|
|
366
|
-
var _el$
|
|
367
|
-
_$insertNode(_el$
|
|
368
|
-
return _el$
|
|
422
|
+
var _el$73 = _$createElement("text");
|
|
423
|
+
_$insertNode(_el$73, _$createTextNode(`Shortlist:`));
|
|
424
|
+
return _el$73;
|
|
369
425
|
})(), _$createComponent(For, {
|
|
370
426
|
get each() {
|
|
371
427
|
return data().shortlist;
|
|
372
428
|
},
|
|
373
429
|
children: (entry) => (() => {
|
|
374
|
-
var _el$
|
|
375
|
-
_$insertNode(_el$
|
|
376
|
-
_$insertNode(_el$
|
|
377
|
-
_$insertNode(_el$
|
|
378
|
-
_$insert(_el$
|
|
379
|
-
_$insert(_el$
|
|
380
|
-
_$insert(_el$
|
|
381
|
-
_$insert(_el$
|
|
382
|
-
_$insert(_el$
|
|
383
|
-
return _el$
|
|
430
|
+
var _el$77 = _$createElement("text"), _el$78 = _$createTextNode(` `), _el$79 = _$createTextNode(` (`), _el$80 = _$createTextNode(`/20) \u2014 `);
|
|
431
|
+
_$insertNode(_el$77, _el$78);
|
|
432
|
+
_$insertNode(_el$77, _el$79);
|
|
433
|
+
_$insertNode(_el$77, _el$80);
|
|
434
|
+
_$insert(_el$77, () => entry.outlier ? "\u25C7" : "\u25C6", _el$78);
|
|
435
|
+
_$insert(_el$77, () => entry.id, _el$79);
|
|
436
|
+
_$insert(_el$77, () => entry.total, _el$80);
|
|
437
|
+
_$insert(_el$77, () => entry.title, null);
|
|
438
|
+
_$insert(_el$77, () => entry.outlier ? " (forced outlier)" : "", null);
|
|
439
|
+
return _el$77;
|
|
384
440
|
})()
|
|
385
441
|
})];
|
|
386
442
|
}
|
|
@@ -461,25 +517,15 @@ var EsRpc = define({
|
|
|
461
517
|
input: obj({}),
|
|
462
518
|
output: obj({ summary: str, stage: str, pending: strArray }, ["summary", "stage", "pending"])
|
|
463
519
|
},
|
|
520
|
+
configState: {
|
|
521
|
+
input: obj({}),
|
|
522
|
+
output: obj({ config: str, sources: strArray, warnings: strArray }, ["config", "sources", "warnings"])
|
|
523
|
+
},
|
|
464
524
|
previewApproval: {
|
|
465
525
|
input: obj({ stage: { type: "string", enum: ["frontier", "spec"] } }, ["stage"]),
|
|
466
526
|
output: Preview
|
|
467
527
|
},
|
|
468
|
-
approve: {
|
|
469
|
-
input: obj({ stage: { type: "string", enum: ["frontier", "spec"] }, user: str, token: str }, [
|
|
470
|
-
"stage",
|
|
471
|
-
"user",
|
|
472
|
-
"token"
|
|
473
|
-
]),
|
|
474
|
-
output: obj({ message: str }, ["message"]),
|
|
475
|
-
errors: { refused: obj({ reason: str }, ["reason"]) }
|
|
476
|
-
},
|
|
477
528
|
previewTrust: { input: obj({}), output: Preview },
|
|
478
|
-
trust: {
|
|
479
|
-
input: obj({ user: str, token: str }, ["user", "token"]),
|
|
480
|
-
output: obj({ message: str }, ["message"]),
|
|
481
|
-
errors: { refused: obj({ reason: str }, ["reason"]) }
|
|
482
|
-
},
|
|
483
529
|
previewResume: { input: obj({}), output: Preview },
|
|
484
530
|
previewLspInstall: { input: obj({ id: str }, ["id"]), output: Preview },
|
|
485
531
|
lspInstall: {
|
|
@@ -487,17 +533,6 @@ var EsRpc = define({
|
|
|
487
533
|
output: obj({ message: str }, ["message"]),
|
|
488
534
|
errors: { refused: obj({ reason: str }, ["reason"]) }
|
|
489
535
|
},
|
|
490
|
-
resume: {
|
|
491
|
-
input: obj({
|
|
492
|
-
user: str,
|
|
493
|
-
token: str,
|
|
494
|
-
acceptControlDrift: { type: "boolean" },
|
|
495
|
-
raiseCeilingUSD: { type: "number" },
|
|
496
|
-
extendRuntime: { type: "boolean" }
|
|
497
|
-
}, ["user", "token"]),
|
|
498
|
-
output: obj({ message: str }, ["message"]),
|
|
499
|
-
errors: { refused: obj({ reason: str }, ["reason"]) }
|
|
500
|
-
},
|
|
501
536
|
factoryState: {
|
|
502
537
|
input: obj({}),
|
|
503
538
|
output: obj({
|
|
@@ -511,7 +546,12 @@ var EsRpc = define({
|
|
|
511
546
|
"estimated"
|
|
512
547
|
]),
|
|
513
548
|
phases: { type: "array" },
|
|
514
|
-
pending: strArray
|
|
549
|
+
pending: strArray,
|
|
550
|
+
audits: { type: "array" },
|
|
551
|
+
tree: obj(Object.fromEntries(["round", "total", "settled", "open", "deferred", "facts", "frontier"].map((key) => [
|
|
552
|
+
key,
|
|
553
|
+
{ type: "number" }
|
|
554
|
+
])), ["round", "total", "settled", "open", "deferred", "facts", "frontier"])
|
|
515
555
|
}, ["stage", "spend", "phases", "pending"])
|
|
516
556
|
},
|
|
517
557
|
lspState: {
|
|
@@ -571,6 +611,12 @@ var tui_default = Plugin.define({
|
|
|
571
611
|
message,
|
|
572
612
|
variant
|
|
573
613
|
});
|
|
614
|
+
call("configState").then((view) => {
|
|
615
|
+
for (const warning of view.warnings)
|
|
616
|
+
toast(warning, "error");
|
|
617
|
+
}).catch(() => {
|
|
618
|
+
return;
|
|
619
|
+
});
|
|
574
620
|
const confirm = async (preview, label) => {
|
|
575
621
|
if (!preview.ok || !preview.token) {
|
|
576
622
|
await context.ui.dialog.alert({
|
|
@@ -612,55 +658,59 @@ var tui_default = Plugin.define({
|
|
|
612
658
|
}));
|
|
613
659
|
if (stage !== "frontier" && stage !== "spec")
|
|
614
660
|
return;
|
|
615
|
-
const
|
|
661
|
+
const preview = await call("previewApproval", {
|
|
616
662
|
stage
|
|
617
|
-
})
|
|
663
|
+
});
|
|
664
|
+
const token = await confirm(preview, "Approve");
|
|
618
665
|
if (!token)
|
|
619
666
|
return;
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
667
|
+
await context.ui.dialog.alert({
|
|
668
|
+
title: preview.title,
|
|
669
|
+
message: `${preview.lines.join(`
|
|
670
|
+
`)}
|
|
671
|
+
|
|
672
|
+
Run \`es approve ${stage}\` at a terminal with your passphrase (1.1.1: approvals need the sealed human key).`
|
|
673
|
+
});
|
|
625
674
|
});
|
|
626
675
|
const trust = guarded(async () => {
|
|
627
|
-
const
|
|
676
|
+
const preview = await call("previewTrust");
|
|
677
|
+
const token = await confirm(preview, "Trust");
|
|
628
678
|
if (!token)
|
|
629
679
|
return;
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
680
|
+
await context.ui.dialog.alert({
|
|
681
|
+
title: preview.title,
|
|
682
|
+
message: `${preview.lines.join(`
|
|
683
|
+
`)}
|
|
684
|
+
|
|
685
|
+
Run \`es trust\` at a terminal with your passphrase to sign these.`
|
|
686
|
+
});
|
|
634
687
|
});
|
|
635
688
|
const resume = guarded(async () => {
|
|
636
689
|
const preview = await call("previewResume");
|
|
637
690
|
const token = await confirm(preview, "Resume");
|
|
638
691
|
if (!token)
|
|
639
692
|
return;
|
|
693
|
+
const lines = preview.lines.join(`
|
|
694
|
+
`);
|
|
640
695
|
const drift = preview.lines.some((line) => line.startsWith("Control-file drift"));
|
|
641
|
-
let
|
|
696
|
+
let raise = "";
|
|
642
697
|
if (/spend ceiling/i.test(preview.lines[0] ?? "")) {
|
|
643
698
|
const raised = await context.ui.dialog.prompt({
|
|
644
699
|
title: "New spend ceiling (USD)",
|
|
645
700
|
placeholder: "e.g. 50"
|
|
646
701
|
});
|
|
647
|
-
|
|
702
|
+
if (raised)
|
|
703
|
+
raise = ` --raise-ceiling ${raised}`;
|
|
648
704
|
}
|
|
649
|
-
const
|
|
650
|
-
const
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
raiseCeilingUSD
|
|
658
|
-
} : {},
|
|
659
|
-
...extendRuntime ? {
|
|
660
|
-
extendRuntime: true
|
|
661
|
-
} : {}
|
|
705
|
+
const extend = /runtime cap/i.test(lines) ? " --extend-runtime" : "";
|
|
706
|
+
const flags = `${drift ? " --accept-drift" : ""}${raise}${extend}`;
|
|
707
|
+
await context.ui.dialog.alert({
|
|
708
|
+
title: preview.title,
|
|
709
|
+
message: `${preview.lines.join(`
|
|
710
|
+
`)}
|
|
711
|
+
|
|
712
|
+
Run \`es factory resume${flags}\` at a terminal with your passphrase.`
|
|
662
713
|
});
|
|
663
|
-
toast(result.message, "success");
|
|
664
714
|
});
|
|
665
715
|
const lspInstall = guarded(async (input) => {
|
|
666
716
|
const id = input?.trim() || await context.ui.dialog.prompt({
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@heretek-ai/epistemic-swarm",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.2",
|
|
4
4
|
"description": "Epistemic Swarm: an AI build factory for OpenCode v2 — grill, research, spec, build, QA and release, gated mechanically.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"test": "bun test"
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
|
-
"@heretek-ai/es-core": "1.
|
|
44
|
+
"@heretek-ai/es-core": "1.1.2",
|
|
45
45
|
"@opencode/plugin": "2.0.24"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
package/src/agents.ts
CHANGED
|
@@ -12,6 +12,9 @@ export interface CompiledAgent {
|
|
|
12
12
|
readonly model?: { providerID: string; id: string }
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
+
/** The host's own web tools, denied to seats whose web access is "cached". */
|
|
16
|
+
export const HOST_WEB_TOOLS = ["websearch", "webfetch"] as const
|
|
17
|
+
|
|
15
18
|
export function permissionRules(spec: AgentSpec, mcpServers: readonly string[]): CompiledAgent["permissions"] {
|
|
16
19
|
const rules: CompiledAgent["permissions"] = [
|
|
17
20
|
{ action: "es_*", resource: "*", effect: "deny" },
|
|
@@ -20,6 +23,9 @@ export function permissionRules(spec: AgentSpec, mcpServers: readonly string[]):
|
|
|
20
23
|
...spec.spawns.map((agent) => ({ action: "subagent", resource: agent, effect: "allow" as const })),
|
|
21
24
|
{ action: "skill", resource: "*", effect: "deny" },
|
|
22
25
|
...spec.skills.map((skill) => ({ action: "skill", resource: skill, effect: "allow" as const })),
|
|
26
|
+
// Code Mode (`execute`) reaches host tools no seat needs, including MCP
|
|
27
|
+
// resources outside the seat's MCP scope.
|
|
28
|
+
{ action: "execute", resource: "*", effect: "deny" },
|
|
23
29
|
]
|
|
24
30
|
for (const server of mcpServers)
|
|
25
31
|
if (!spec.mcp.includes(server))
|
|
@@ -32,6 +38,9 @@ export function permissionRules(spec: AgentSpec, mcpServers: readonly string[]):
|
|
|
32
38
|
// this only grants autonomous seats access to a scratch directory.
|
|
33
39
|
rules.push({ action: "external_directory", resource: "/tmp/*", effect: "allow" }) // NOSONAR
|
|
34
40
|
}
|
|
41
|
+
if (spec.web === "cached")
|
|
42
|
+
// Search as policy: web facts only through the cached, citable es_research_* tools.
|
|
43
|
+
for (const action of HOST_WEB_TOOLS) rules.push({ action, resource: "*", effect: "deny" })
|
|
35
44
|
if (spec.writes.length === 0) rules.push({ action: "edit", resource: "*", effect: "deny" })
|
|
36
45
|
if (spec.lsp === "none") rules.push({ action: "lsp", resource: "*", effect: "deny" })
|
|
37
46
|
if (spec.lsp !== "full") rules.push({ action: "lsp_rename", resource: "*", effect: "deny" })
|
package/src/continue.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// work remains (not halted, not waiting on a human approval or the grill), we
|
|
3
3
|
// re-prompt it to continue. Progress-aware: three idle turns without any state
|
|
4
4
|
// change stop the loop so a confused agent cannot spin on budget.
|
|
5
|
-
import {
|
|
5
|
+
import { pendingApprovals } from "@heretek-ai/es-core"
|
|
6
6
|
import type { Runtime } from "./runtime.ts"
|
|
7
7
|
|
|
8
8
|
const ACTIVE = new Set(["RESEARCH", "SPEC", "BUILD", "QA", "RELEASE"])
|
|
@@ -34,7 +34,7 @@ export function createFactoryContinuation(
|
|
|
34
34
|
if (count >= STALL_LIMIT) return
|
|
35
35
|
await ctx.session.prompt({
|
|
36
36
|
sessionID,
|
|
37
|
-
text: `${
|
|
37
|
+
text: `${await runtime.factory.summary(state)}\nThe factory run is not finished. Continue from the current stage (no human is needed unless an approval is due).`,
|
|
38
38
|
})
|
|
39
39
|
}
|
|
40
40
|
}
|