@nac3/forge-cli 1.21.1 → 1.21.3
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/agents/bridge.d.ts.map +1 -1
- package/dist/agents/bridge.js +2 -1
- package/dist/agents/bridge.js.map +1 -1
- package/dist/agents/runtime.d.ts.map +1 -1
- package/dist/agents/runtime.js +2 -1
- package/dist/agents/runtime.js.map +1 -1
- package/dist/agents/store.d.ts.map +1 -1
- package/dist/agents/store.js +3 -2
- package/dist/agents/store.js.map +1 -1
- package/dist/chat/graph_auto_ingest.d.ts +2 -0
- package/dist/chat/graph_auto_ingest.d.ts.map +1 -1
- package/dist/chat/graph_auto_ingest.js +98 -23
- package/dist/chat/graph_auto_ingest.js.map +1 -1
- package/dist/chat/server.d.ts.map +1 -1
- package/dist/chat/server.js +15 -1
- package/dist/chat/server.js.map +1 -1
- package/dist/chat/tools/fs_editor.d.ts.map +1 -1
- package/dist/chat/tools/fs_editor.js +2 -1
- package/dist/chat/tools/fs_editor.js.map +1 -1
- package/dist/chat/tools/project_lifecycle.d.ts.map +1 -1
- package/dist/chat/tools/project_lifecycle.js +3 -2
- package/dist/chat/tools/project_lifecycle.js.map +1 -1
- package/dist/chat/tools/reader.d.ts.map +1 -1
- package/dist/chat/tools/reader.js +2 -1
- package/dist/chat/tools/reader.js.map +1 -1
- package/dist/commands/keys_setup.d.ts.map +1 -1
- package/dist/commands/keys_setup.js +2 -1
- package/dist/commands/keys_setup.js.map +1 -1
- package/dist/core/atomic_write.d.ts.map +1 -1
- package/dist/core/atomic_write.js +7 -0
- package/dist/core/atomic_write.js.map +1 -1
- package/dist/core/brain_config.d.ts.map +1 -1
- package/dist/core/brain_config.js +2 -1
- package/dist/core/brain_config.js.map +1 -1
- package/dist/core/budget.d.ts.map +1 -1
- package/dist/core/budget.js +3 -2
- package/dist/core/budget.js.map +1 -1
- package/dist/core/cost_meter.d.ts.map +1 -1
- package/dist/core/cost_meter.js +2 -1
- package/dist/core/cost_meter.js.map +1 -1
- package/dist/core/limits_config.d.ts.map +1 -1
- package/dist/core/limits_config.js +2 -1
- package/dist/core/limits_config.js.map +1 -1
- package/dist/core/polar.d.ts.map +1 -1
- package/dist/core/polar.js +2 -1
- package/dist/core/polar.js.map +1 -1
- package/dist/core/projects.d.ts.map +1 -1
- package/dist/core/projects.js +2 -1
- package/dist/core/projects.js.map +1 -1
- package/dist/core/provider_keys.d.ts.map +1 -1
- package/dist/core/provider_keys.js +2 -1
- package/dist/core/provider_keys.js.map +1 -1
- package/dist/core/whats_new.d.ts.map +1 -1
- package/dist/core/whats_new.js +24 -1
- package/dist/core/whats_new.js.map +1 -1
- package/dist/mcp/config.d.ts.map +1 -1
- package/dist/mcp/config.js +2 -1
- package/dist/mcp/config.js.map +1 -1
- package/dist/mcp/plan_bridges.d.ts.map +1 -1
- package/dist/mcp/plan_bridges.js +15 -5
- package/dist/mcp/plan_bridges.js.map +1 -1
- package/dist/mcp/state.d.ts.map +1 -1
- package/dist/mcp/state.js +3 -2
- package/dist/mcp/state.js.map +1 -1
- package/dist/nac3/dispatch_log.d.ts.map +1 -1
- package/dist/nac3/dispatch_log.js +2 -1
- package/dist/nac3/dispatch_log.js.map +1 -1
- package/dist/pending/store.d.ts.map +1 -1
- package/dist/pending/store.js +2 -1
- package/dist/pending/store.js.map +1 -1
- package/dist/sizing/store.d.ts.map +1 -1
- package/dist/sizing/store.js +2 -1
- package/dist/sizing/store.js.map +1 -1
- package/dist/support/github_dispatcher.d.ts.map +1 -1
- package/dist/support/github_dispatcher.js +2 -1
- package/dist/support/github_dispatcher.js.map +1 -1
- package/dist/support/reports.d.ts.map +1 -1
- package/dist/support/reports.js +2 -1
- package/dist/support/reports.js.map +1 -1
- package/dist/urazuke/gates_data.d.ts.map +1 -1
- package/dist/urazuke/gates_data.js +2 -1
- package/dist/urazuke/gates_data.js.map +1 -1
- package/dist/urazuke/prompts_client.d.ts.map +1 -1
- package/dist/urazuke/prompts_client.js +2 -1
- package/dist/urazuke/prompts_client.js.map +1 -1
- package/dist/urazuke/receipts.d.ts.map +1 -1
- package/dist/urazuke/receipts.js +2 -1
- package/dist/urazuke/receipts.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/voice/router.d.ts.map +1 -1
- package/dist/voice/router.js +2 -1
- package/dist/voice/router.js.map +1 -1
- package/dist/voice/voiceprint/store.d.ts.map +1 -1
- package/dist/voice/voiceprint/store.js +2 -1
- package/dist/voice/voiceprint/store.js.map +1 -1
- package/dist/workflow/config.d.ts.map +1 -1
- package/dist/workflow/config.js +2 -1
- package/dist/workflow/config.js.map +1 -1
- package/dist/workflow/instances.d.ts.map +1 -1
- package/dist/workflow/instances.js +2 -1
- package/dist/workflow/instances.js.map +1 -1
- package/package.json +2 -2
- package/dist/chat/flow_layout.d.ts +0 -76
- package/dist/chat/flow_layout.d.ts.map +0 -1
- package/dist/chat/flow_layout.js +0 -247
- package/dist/chat/flow_layout.js.map +0 -1
- package/dist/commands/director.d.ts +0 -37
- package/dist/commands/director.d.ts.map +0 -1
- package/dist/commands/director.js +0 -290
- package/dist/commands/director.js.map +0 -1
- package/dist/commands/voice_setup.d.ts +0 -37
- package/dist/commands/voice_setup.d.ts.map +0 -1
- package/dist/commands/voice_setup.js +0 -308
- package/dist/commands/voice_setup.js.map +0 -1
package/dist/chat/flow_layout.js
DELETED
|
@@ -1,247 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* flow_layout.ts -- deterministic layered layout for BPMN/flow models, shared
|
|
3
|
-
* by the server SVG renderer (board_artifacts.renderFlowSvg) and mirrored by the
|
|
4
|
-
* panel's client renderBpmnView.
|
|
5
|
-
*
|
|
6
|
-
* Replaces the old "longest-path + fixed-height lane bands + naive sub-stacking"
|
|
7
|
-
* placement, which COLLIDED nodes whenever a (lane, column) cell held more than
|
|
8
|
-
* one node. This module:
|
|
9
|
-
* 1. assigns layers by longest path,
|
|
10
|
-
* 2. reduces edge crossings with a median-order sweep per column,
|
|
11
|
-
* 3. sizes each swimlane band to fit its fullest (lane,column) cell using each
|
|
12
|
-
* node's REAL footprint (shape height + wrapped label lines), so shapes AND
|
|
13
|
-
* multi-line event/gateway labels never overlap and a lane grows when its
|
|
14
|
-
* content is taller (Pablo 2026-09-07: wrap events/gateways + resize lanes).
|
|
15
|
-
*
|
|
16
|
-
* Pure + synchronous (no deps) so it runs identically server-side (Node) and in
|
|
17
|
-
* the browser panel. ASCII-only.
|
|
18
|
-
*/
|
|
19
|
-
/* Geometry constants -- kept in sync with the shapes drawn by the renderers. */
|
|
20
|
-
export const FL = {
|
|
21
|
-
COL_W: 178,
|
|
22
|
-
PAD: 30,
|
|
23
|
-
LANE_PAD: 18, // inner top/bottom padding of a lane band
|
|
24
|
-
LANE_MIN: 116, // minimum lane band height
|
|
25
|
-
LANE_LBL: 30, // width of the rotated lane-label gutter
|
|
26
|
-
TOP_LANES: 8,
|
|
27
|
-
TOP_PLAIN: 26,
|
|
28
|
-
EVENT_H: 36, // event circle diameter (r=18)
|
|
29
|
-
GATE_H: 46, // gateway diamond height (half=23)
|
|
30
|
-
TASK_H: 54, // task box height (label wraps INSIDE)
|
|
31
|
-
LABEL_LH: 13, // line height of a below-shape label line
|
|
32
|
-
LABEL_GAP: 12, // gap between a shape and its first below-label line
|
|
33
|
-
NODE_GAP: 20, // vertical gap between two nodes stacked in one cell
|
|
34
|
-
// below-shape label wrap (events + gateways):
|
|
35
|
-
LABEL_WRAP_CHARS: 20,
|
|
36
|
-
LABEL_WRAP_LINES: 3,
|
|
37
|
-
// task label wrap (INSIDE the box):
|
|
38
|
-
TASK_WRAP_CHARS: 17,
|
|
39
|
-
TASK_WRAP_LINES: 3,
|
|
40
|
-
};
|
|
41
|
-
/** Canonical label wrapper (shared with the renderers so reserved height matches
|
|
42
|
-
* what is actually drawn). Greedy word wrap; last line gets an ellipsis when it
|
|
43
|
-
* still overflows. */
|
|
44
|
-
export function wrapLabel(s, maxChars, maxLines) {
|
|
45
|
-
const words = String(s == null ? '' : s).split(/\s+/).filter(Boolean);
|
|
46
|
-
const lines = [];
|
|
47
|
-
let cur = '';
|
|
48
|
-
for (const w of words) {
|
|
49
|
-
if (!cur) {
|
|
50
|
-
cur = w;
|
|
51
|
-
}
|
|
52
|
-
else if ((cur + ' ' + w).length <= maxChars) {
|
|
53
|
-
cur += ' ' + w;
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
56
|
-
lines.push(cur);
|
|
57
|
-
cur = w;
|
|
58
|
-
if (lines.length === maxLines - 1)
|
|
59
|
-
break;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
if (cur && lines.length < maxLines)
|
|
63
|
-
lines.push(cur);
|
|
64
|
-
if (lines.length === maxLines) {
|
|
65
|
-
const last = lines[maxLines - 1];
|
|
66
|
-
if (last && last.length > maxChars)
|
|
67
|
-
lines[maxLines - 1] = last.slice(0, maxChars - 1) + '…';
|
|
68
|
-
}
|
|
69
|
-
return lines.length ? lines : [''];
|
|
70
|
-
}
|
|
71
|
-
function isEvent(type) { return /^(start|end|intermediate|event$)/.test(type); }
|
|
72
|
-
function isGateway(type) { return /^(gateway|decision|fork|join|merge)/.test(type); }
|
|
73
|
-
/** Total vertical space a node needs: shape height + (below-shape label lines). */
|
|
74
|
-
function footprint(n) {
|
|
75
|
-
const type = String(n.type || 'task');
|
|
76
|
-
const label = String(n.label || '');
|
|
77
|
-
if (isEvent(type)) {
|
|
78
|
-
const lines = label ? wrapLabel(label, FL.LABEL_WRAP_CHARS, FL.LABEL_WRAP_LINES).length : 0;
|
|
79
|
-
return FL.EVENT_H + (lines ? FL.LABEL_GAP + lines * FL.LABEL_LH : 0);
|
|
80
|
-
}
|
|
81
|
-
if (isGateway(type)) {
|
|
82
|
-
const lines = label ? wrapLabel(label, FL.LABEL_WRAP_CHARS, FL.LABEL_WRAP_LINES).length : 0;
|
|
83
|
-
return FL.GATE_H + (lines ? FL.LABEL_GAP + lines * FL.LABEL_LH : 0);
|
|
84
|
-
}
|
|
85
|
-
return FL.TASK_H; // task: label wraps inside the box
|
|
86
|
-
}
|
|
87
|
-
/** Distance from a node's _y (shape centre) up to the top of its shape. */
|
|
88
|
-
function topHalf(n) {
|
|
89
|
-
const type = String(n.type || 'task');
|
|
90
|
-
if (isEvent(type))
|
|
91
|
-
return FL.EVENT_H / 2;
|
|
92
|
-
if (isGateway(type))
|
|
93
|
-
return FL.GATE_H / 2;
|
|
94
|
-
return FL.TASK_H / 2;
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* Assign _x/_y to every node and return the diagram geometry (canvas size +
|
|
98
|
-
* swimlane bands). Mutates the nodes in place.
|
|
99
|
-
*/
|
|
100
|
-
export function layoutFlowModel(nodes, flows, lanes) {
|
|
101
|
-
const byId = {};
|
|
102
|
-
nodes.forEach((n) => { byId[n.id] = n; });
|
|
103
|
-
/* Drop declared-but-EMPTY lanes: a lane with no node renders as a confusing
|
|
104
|
-
* blank band (Pablo 2026-09-08: a 4-lane chart whose 4th lane had no elements
|
|
105
|
-
* -- the brain declared it but assigned its nodes to another lane). Keep only
|
|
106
|
-
* lanes that actually hold a node; if none remain, fall back to no-lane. */
|
|
107
|
-
const usedLaneIds = new Set();
|
|
108
|
-
for (const n of nodes) {
|
|
109
|
-
if (n.lane != null && String(n.lane))
|
|
110
|
-
usedLaneIds.add(String(n.lane));
|
|
111
|
-
}
|
|
112
|
-
lanes = lanes.filter((l) => usedLaneIds.has(l.id));
|
|
113
|
-
/* 1. layers -- longest path from the sources. */
|
|
114
|
-
const layer = {};
|
|
115
|
-
nodes.forEach((n) => { layer[n.id] = 0; });
|
|
116
|
-
for (let it = 0; it < nodes.length; it++) {
|
|
117
|
-
let changed = false;
|
|
118
|
-
for (const f of flows) {
|
|
119
|
-
if (byId[f.from] && byId[f.to] && (layer[f.to] ?? 0) < (layer[f.from] ?? 0) + 1) {
|
|
120
|
-
layer[f.to] = (layer[f.from] ?? 0) + 1;
|
|
121
|
-
changed = true;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
if (!changed)
|
|
125
|
-
break;
|
|
126
|
-
}
|
|
127
|
-
/* Compact columns: a cycle inflates longest-path layers (a node in a loop and
|
|
128
|
-
* everything downstream jumps to a huge layer), leaving EMPTY columns between
|
|
129
|
-
* clusters -- the diagram stretches horizontally with a big gap (Pablo's
|
|
130
|
-
* foto2, 2026-09-07). A proper DAG never has empty columns, so this is a no-op
|
|
131
|
-
* for acyclic flows; for cyclic ones it remaps the distinct used layer values
|
|
132
|
-
* to consecutive indices, closing the gaps. */
|
|
133
|
-
const usedLayers = Array.from(new Set(nodes.map((n) => layer[n.id] ?? 0))).sort((a, b) => a - b);
|
|
134
|
-
const remap = {};
|
|
135
|
-
usedLayers.forEach((v, i) => { remap[v] = i; });
|
|
136
|
-
nodes.forEach((n) => { layer[n.id] = remap[layer[n.id] ?? 0] ?? 0; });
|
|
137
|
-
const maxCol = usedLayers.length - 1;
|
|
138
|
-
const hasLanes = lanes.length > 0;
|
|
139
|
-
const laneIdx = {};
|
|
140
|
-
lanes.forEach((l, i) => { laneIdx[l.id] = i; });
|
|
141
|
-
const laneOf = (n) => hasLanes ? ((n.lane != null && laneIdx[n.lane] != null) ? laneIdx[n.lane] : 0) : 0;
|
|
142
|
-
/* 2. group into (lane, column) cells. */
|
|
143
|
-
const cell = {};
|
|
144
|
-
const cellKey = (li, col) => li + ':' + col;
|
|
145
|
-
nodes.forEach((n) => { const k = cellKey(laneOf(n), layer[n.id] ?? 0); (cell[k] = cell[k] || []).push(n.id); });
|
|
146
|
-
/* 3. crossing reduction: median-order sweeps. */
|
|
147
|
-
const preds = {};
|
|
148
|
-
const succs = {};
|
|
149
|
-
nodes.forEach((n) => { preds[n.id] = []; succs[n.id] = []; });
|
|
150
|
-
flows.forEach((f) => { if (byId[f.from] && byId[f.to]) {
|
|
151
|
-
succs[f.from].push(f.to);
|
|
152
|
-
preds[f.to].push(f.from);
|
|
153
|
-
} });
|
|
154
|
-
const rank = {};
|
|
155
|
-
const reindex = () => { for (const k of Object.keys(cell))
|
|
156
|
-
cell[k].forEach((id, i) => { rank[id] = i; }); };
|
|
157
|
-
reindex();
|
|
158
|
-
const median = (ids) => {
|
|
159
|
-
if (!ids.length)
|
|
160
|
-
return -1;
|
|
161
|
-
const rs = ids.map((i) => rank[i] ?? 0).sort((a, b) => a - b);
|
|
162
|
-
return rs[Math.floor(rs.length / 2)] ?? 0;
|
|
163
|
-
};
|
|
164
|
-
for (let sweep = 0; sweep < 4; sweep++) {
|
|
165
|
-
const usePreds = sweep % 2 === 0;
|
|
166
|
-
for (const k of Object.keys(cell)) {
|
|
167
|
-
const arr = cell[k];
|
|
168
|
-
if (arr.length < 2)
|
|
169
|
-
continue;
|
|
170
|
-
const key = (id) => { const m = median(usePreds ? preds[id] : succs[id]); return m < 0 ? (rank[id] ?? 0) : m; };
|
|
171
|
-
arr.sort((a, b) => (key(a) - key(b)) || ((rank[a] ?? 0) - (rank[b] ?? 0)));
|
|
172
|
-
}
|
|
173
|
-
reindex();
|
|
174
|
-
}
|
|
175
|
-
/* height of a cell's stacked nodes (footprints + inter-node gaps). */
|
|
176
|
-
const stackHeight = (ids) => {
|
|
177
|
-
if (!ids.length)
|
|
178
|
-
return 0;
|
|
179
|
-
let h = 0;
|
|
180
|
-
ids.forEach((id, i) => { h += footprint(byId[id]); if (i)
|
|
181
|
-
h += FL.NODE_GAP; });
|
|
182
|
-
return h;
|
|
183
|
-
};
|
|
184
|
-
/* place a cell's nodes centred in [top, top+bandH], stacked by footprint. */
|
|
185
|
-
const placeCell = (ids, x, top, bandH) => {
|
|
186
|
-
const sh = stackHeight(ids);
|
|
187
|
-
let cursor = top + Math.max(FL.LANE_PAD, (bandH - sh) / 2);
|
|
188
|
-
for (const id of ids) {
|
|
189
|
-
const n = byId[id];
|
|
190
|
-
const fp = footprint(n);
|
|
191
|
-
n._x = x;
|
|
192
|
-
n._y = cursor + topHalf(n);
|
|
193
|
-
cursor += fp + FL.NODE_GAP;
|
|
194
|
-
}
|
|
195
|
-
};
|
|
196
|
-
if (hasLanes) {
|
|
197
|
-
const bandH = lanes.map((_l, li) => {
|
|
198
|
-
let mx = 0;
|
|
199
|
-
for (let c = 0; c <= maxCol; c++) {
|
|
200
|
-
const a = cell[cellKey(li, c)];
|
|
201
|
-
if (a)
|
|
202
|
-
mx = Math.max(mx, stackHeight(a));
|
|
203
|
-
}
|
|
204
|
-
return Math.max(FL.LANE_MIN, mx + 2 * FL.LANE_PAD);
|
|
205
|
-
});
|
|
206
|
-
const bandTop = [];
|
|
207
|
-
let acc = FL.TOP_LANES;
|
|
208
|
-
for (let i = 0; i < lanes.length; i++) {
|
|
209
|
-
bandTop[i] = acc;
|
|
210
|
-
acc += bandH[i] ?? FL.LANE_MIN;
|
|
211
|
-
}
|
|
212
|
-
for (let li = 0; li < lanes.length; li++) {
|
|
213
|
-
for (let c = 0; c <= maxCol; c++) {
|
|
214
|
-
const ids = cell[cellKey(li, c)];
|
|
215
|
-
if (!ids || !ids.length)
|
|
216
|
-
continue;
|
|
217
|
-
const x = FL.PAD + FL.LANE_LBL + c * FL.COL_W + FL.COL_W / 2;
|
|
218
|
-
placeCell(ids, x, bandTop[li] ?? FL.TOP_LANES, bandH[li] ?? FL.LANE_MIN);
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
const W = FL.PAD + FL.LANE_LBL + (maxCol + 1) * FL.COL_W + FL.PAD;
|
|
222
|
-
const H = acc + FL.PAD;
|
|
223
|
-
const laneBands = lanes.map((l, i) => ({
|
|
224
|
-
id: l.id, label: String(l.label || l.id), y: bandTop[i] ?? FL.TOP_LANES, h: bandH[i] ?? FL.LANE_MIN,
|
|
225
|
-
}));
|
|
226
|
-
return { W: Math.round(W), H: Math.round(H), laneBands };
|
|
227
|
-
}
|
|
228
|
-
/* no lanes: one column stack, all in a single virtual band centred on the max. */
|
|
229
|
-
let maxStackH = 0;
|
|
230
|
-
for (let c = 0; c <= maxCol; c++) {
|
|
231
|
-
const a = cell[cellKey(0, c)];
|
|
232
|
-
if (a)
|
|
233
|
-
maxStackH = Math.max(maxStackH, stackHeight(a));
|
|
234
|
-
}
|
|
235
|
-
const bandH = Math.max(FL.LANE_MIN - 2 * FL.LANE_PAD, maxStackH);
|
|
236
|
-
for (let c = 0; c <= maxCol; c++) {
|
|
237
|
-
const ids = cell[cellKey(0, c)];
|
|
238
|
-
if (!ids || !ids.length)
|
|
239
|
-
continue;
|
|
240
|
-
const x = FL.PAD + c * FL.COL_W + FL.COL_W / 2;
|
|
241
|
-
placeCell(ids, x, FL.TOP_PLAIN, bandH);
|
|
242
|
-
}
|
|
243
|
-
const W = FL.PAD + (maxCol + 1) * FL.COL_W + FL.PAD;
|
|
244
|
-
const H = FL.TOP_PLAIN + bandH + FL.PAD;
|
|
245
|
-
return { W: Math.round(W), H: Math.round(H), laneBands: [] };
|
|
246
|
-
}
|
|
247
|
-
//# sourceMappingURL=flow_layout.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"flow_layout.js","sourceRoot":"","sources":["../../src/chat/flow_layout.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `yf director <spec>` (Director closure pendiente 2).
|
|
3
|
-
*
|
|
4
|
-
* Single-entry CLI that combines:
|
|
5
|
-
* 1. Spec ingest (read file -> recordIngest).
|
|
6
|
-
* 2. Director dispatch (via runAgent + factory or stub).
|
|
7
|
-
*
|
|
8
|
-
* Without --real: ingests + reports doc_id (smoke).
|
|
9
|
-
* With --real: also dispatches the live LLM step.
|
|
10
|
-
*
|
|
11
|
-
* Supported file formats: txt + md as plain UTF-8. Other formats
|
|
12
|
-
* (pdf, docx) follow-up via the reader registry.
|
|
13
|
-
*
|
|
14
|
-
* ASCII-only.
|
|
15
|
-
*/
|
|
16
|
-
import type { Command } from 'commander';
|
|
17
|
-
import { type StepFn } from '../agents/runner.js';
|
|
18
|
-
import type { AgentDefinition } from '../agents/types.js';
|
|
19
|
-
import { type Runtime } from '../agents/runtime.js';
|
|
20
|
-
export interface RegisterDirectorCommandDeps {
|
|
21
|
-
makeRealStep?: (opts: {
|
|
22
|
-
def: AgentDefinition;
|
|
23
|
-
trigger_reason: string;
|
|
24
|
-
project_root: string;
|
|
25
|
-
project_name: string;
|
|
26
|
-
forge_version: string;
|
|
27
|
-
/** Yuemail-dogfood fix #7: pass a Runtime so the Director's
|
|
28
|
-
* yujin.agent.delegate calls reach delegateToAgent + dispatch
|
|
29
|
-
* the target agent. Without this, the delegate callback in
|
|
30
|
-
* real_step_factory.ts stays undefined and every delegate
|
|
31
|
-
* invocation falls back to runNac3Invoke, which has no
|
|
32
|
-
* handler for agent.delegate and returns err. */
|
|
33
|
-
runtime?: Runtime;
|
|
34
|
-
}) => Promise<StepFn>;
|
|
35
|
-
}
|
|
36
|
-
export declare function registerDirectorCommand(program: Command, deps?: RegisterDirectorCommandDeps): void;
|
|
37
|
-
//# sourceMappingURL=director.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"director.d.ts","sourceRoot":"","sources":["../../src/commands/director.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,OAAO,EAAY,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,OAAO,EAAiB,KAAK,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEnE,MAAM,WAAW,2BAA2B;IAC1C,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE;QACpB,GAAG,EAAa,eAAe,CAAC;QAChC,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAI,MAAM,CAAC;QACvB,YAAY,EAAI,MAAM,CAAC;QACvB,aAAa,EAAG,MAAM,CAAC;QACvB;;;;;0DAKkD;QAClD,OAAO,CAAC,EAAQ,OAAO,CAAC;KACzB,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACvB;AAsED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,GAAE,2BAAgC,GAAG,IAAI,CAgNtG"}
|
|
@@ -1,290 +0,0 @@
|
|
|
1
|
-
import { promises as fs } from 'node:fs';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import crypto from 'node:crypto';
|
|
4
|
-
import { getAgentDefinition } from '../agents/store.js';
|
|
5
|
-
import { runAgent } from '../agents/runner.js';
|
|
6
|
-
import { recordIngest } from '../chat/ingest_session.js';
|
|
7
|
-
import { createRuntime } from '../agents/runtime.js';
|
|
8
|
-
function fileExtToFormat(filename) {
|
|
9
|
-
const ext = path.extname(filename).toLowerCase();
|
|
10
|
-
if (ext === '.md' || ext === '.markdown')
|
|
11
|
-
return 'markdown';
|
|
12
|
-
if (ext === '.txt')
|
|
13
|
-
return 'markdown'; /* parse as markdown */
|
|
14
|
-
if (ext === '.pdf')
|
|
15
|
-
return 'pdf';
|
|
16
|
-
if (ext === '.docx')
|
|
17
|
-
return 'docx';
|
|
18
|
-
return 'markdown'; /* best-effort default */
|
|
19
|
-
}
|
|
20
|
-
function buildDocFromText(filename, text) {
|
|
21
|
-
/* deterministic doc_id from file content -- 8-char sha1 hex slug. */
|
|
22
|
-
const hash = crypto.createHash('sha1').update(filename + ':' + text).digest('hex').slice(0, 12);
|
|
23
|
-
const slug = path.basename(filename).replace(/[^a-zA-Z0-9._-]/g, '-').slice(0, 60);
|
|
24
|
-
const id = slug + '-' + hash;
|
|
25
|
-
/* Split into sections per top-level heading. Fallback: one
|
|
26
|
-
* section with the whole text as a single paragraph block. */
|
|
27
|
-
const lines = text.split(/\r?\n/);
|
|
28
|
-
const sections = [];
|
|
29
|
-
let curHeading = '';
|
|
30
|
-
let curLevel = 0;
|
|
31
|
-
let curBlocks = [];
|
|
32
|
-
let sectionIdx = 0;
|
|
33
|
-
function flush() {
|
|
34
|
-
if (curBlocks.length === 0 && !curHeading)
|
|
35
|
-
return;
|
|
36
|
-
sections.push({
|
|
37
|
-
id: 'sec-' + sectionIdx,
|
|
38
|
-
heading: curHeading,
|
|
39
|
-
level: curLevel,
|
|
40
|
-
blocks: curBlocks.length > 0
|
|
41
|
-
? curBlocks.map((b) => ({ kind: 'paragraph', text: b }))
|
|
42
|
-
: [],
|
|
43
|
-
});
|
|
44
|
-
sectionIdx += 1;
|
|
45
|
-
curHeading = '';
|
|
46
|
-
curLevel = 0;
|
|
47
|
-
curBlocks = [];
|
|
48
|
-
}
|
|
49
|
-
for (const l of lines) {
|
|
50
|
-
const m = /^(#{1,6})\s+(.+)$/.exec(l.trim());
|
|
51
|
-
if (m) {
|
|
52
|
-
flush();
|
|
53
|
-
curHeading = m[2].trim();
|
|
54
|
-
curLevel = m[1].length;
|
|
55
|
-
continue;
|
|
56
|
-
}
|
|
57
|
-
if (l.trim().length > 0) {
|
|
58
|
-
curBlocks.push(l.trim());
|
|
59
|
-
}
|
|
60
|
-
else if (curBlocks.length > 0) {
|
|
61
|
-
/* blank line -> next paragraph boundary; leave for next non-blank. */
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
flush();
|
|
65
|
-
if (sections.length === 0) {
|
|
66
|
-
sections.push({
|
|
67
|
-
id: 'sec-0', heading: '', level: 0,
|
|
68
|
-
blocks: [{ kind: 'paragraph', text }],
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
return {
|
|
72
|
-
id,
|
|
73
|
-
filename: path.basename(filename),
|
|
74
|
-
format: fileExtToFormat(filename),
|
|
75
|
-
bytes: Buffer.byteLength(text, 'utf-8'),
|
|
76
|
-
title: sections[0].heading || path.basename(filename),
|
|
77
|
-
sections,
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
export function registerDirectorCommand(program, deps = {}) {
|
|
81
|
-
program.command('director')
|
|
82
|
-
.description('Single-entry orchestrator: ingest a spec + dispatch the Director. Default is a smoke run (ingest only). Pass --real to fire the live LLM step.')
|
|
83
|
-
.argument('<spec>', 'path to a spec file (.md / .txt; pdf/docx follow-up)')
|
|
84
|
-
.option('--reason <r>', 'override the auto-generated trigger reason')
|
|
85
|
-
.option('--real', 'use the real LLM step (slice 15e factory) -- requires anthropic_api_key')
|
|
86
|
-
.option('--json', 'emit JSON instead of human-readable summary')
|
|
87
|
-
.action(async (specPath, opts) => {
|
|
88
|
-
/* Step 1: read + ingest the spec. */
|
|
89
|
-
let text;
|
|
90
|
-
try {
|
|
91
|
-
text = await fs.readFile(path.resolve(specPath), 'utf-8');
|
|
92
|
-
}
|
|
93
|
-
catch (err) {
|
|
94
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
95
|
-
console.error('Failed to read spec at ' + JSON.stringify(specPath) + ': ' + msg);
|
|
96
|
-
process.exitCode = 1;
|
|
97
|
-
return;
|
|
98
|
-
}
|
|
99
|
-
const doc = buildDocFromText(specPath, text);
|
|
100
|
-
const session = recordIngest(doc);
|
|
101
|
-
/* Yuemail-dogfood fix #17: include the spec content in the
|
|
102
|
-
* Director's trigger_reason so the LLM has the actual
|
|
103
|
-
* requirements in its first turn. Without this, the
|
|
104
|
-
* Director only sees "spec doc_id=..." + the CLI --reason
|
|
105
|
-
* flag and starts asking the operator for a spec instead
|
|
106
|
-
* of delegating. The doc_id reference is kept in the
|
|
107
|
-
* header so the Director can quote it when delegating. */
|
|
108
|
-
const userReason = opts.reason || '';
|
|
109
|
-
const triggerReason = '## Task: orchestrate the implementation of the following spec.\n'
|
|
110
|
-
+ (userReason ? ('Operator note: ' + userReason + '\n\n') : '\n')
|
|
111
|
-
+ 'Spec doc_id: ' + session.doc_id + '\n'
|
|
112
|
-
+ 'Spec path: ' + specPath + '\n\n'
|
|
113
|
-
+ '--- BEGIN SPEC ---\n'
|
|
114
|
-
+ text
|
|
115
|
-
+ '\n--- END SPEC ---\n\n'
|
|
116
|
-
+ 'Per your YUEMAIL-DOGFOOD MANDATE: your first tool call MUST be '
|
|
117
|
-
+ 'yujin.agent.delegate({to_slug:"analyst", payload:<the spec above + "extract structured plan + tdd_first flag">, tokens_used:<n>}). '
|
|
118
|
-
+ 'Do NOT ask the operator for a spec -- it is included verbatim above.';
|
|
119
|
-
/* Step 2: ensure the Director is registered. */
|
|
120
|
-
const def = await getAgentDefinition('director');
|
|
121
|
-
if (!def) {
|
|
122
|
-
console.error('Director agent is not installed. Run `yf agent install --defaults` first.');
|
|
123
|
-
process.exitCode = 1;
|
|
124
|
-
return;
|
|
125
|
-
}
|
|
126
|
-
/* Step 3: dispatch the Director. */
|
|
127
|
-
let stepFn;
|
|
128
|
-
let runtimeForDelegate;
|
|
129
|
-
if (opts.real) {
|
|
130
|
-
/* Yuemail-dogfood fix #7 + #12 + #13: construct a
|
|
131
|
-
* Runtime up-front so yujin.agent.delegate has a
|
|
132
|
-
* dispatcher to call. The default runner adapter inside
|
|
133
|
-
* runtime.ts passes (slug, reason) to runAgent, which
|
|
134
|
-
* expects (def, opts) -- so sub-agents end up running
|
|
135
|
-
* with a broken adapter, the run fails immediately, and
|
|
136
|
-
* the Director sees ok=false from the delegate.
|
|
137
|
-
*
|
|
138
|
-
* Fix #12: inject a runner that, given a slug, loads
|
|
139
|
-
* the agent definition + builds a real LLM step via
|
|
140
|
-
* makeRealStep + runs the agent through runAgent with
|
|
141
|
-
* the correct shape. This is what makes a delegated
|
|
142
|
-
* Analyst / Coder / Tester / Scaffolder run with the
|
|
143
|
-
* actual Claude API instead of a no-op stub.
|
|
144
|
-
*
|
|
145
|
-
* Fix #13: actually CALL start() on the runtime. The
|
|
146
|
-
* initial Fix #7 comment said "no start() needed for
|
|
147
|
-
* one-shot CLI" which was wrong: runtime.ts:325 and
|
|
148
|
-
* :413 throw "runtime not started -- call start() first"
|
|
149
|
-
* inside dispatchAgent + dispatchAgentSoft if running is
|
|
150
|
-
* false. Without start(), every delegate raises that
|
|
151
|
-
* error and the Director falls back to inline. */
|
|
152
|
-
const projectCwd = process.cwd();
|
|
153
|
-
runtimeForDelegate = createRuntime({
|
|
154
|
-
runner: async (subSlug, subReason) => {
|
|
155
|
-
const subDef = await getAgentDefinition(subSlug);
|
|
156
|
-
if (!subDef) {
|
|
157
|
-
throw new Error('delegate target agent not installed: ' + subSlug);
|
|
158
|
-
}
|
|
159
|
-
const { makeRealStep } = await import('../agents/cli_real.js');
|
|
160
|
-
const subStep = await makeRealStep({
|
|
161
|
-
def: subDef,
|
|
162
|
-
trigger_reason: subReason,
|
|
163
|
-
project_root: projectCwd,
|
|
164
|
-
project_name: 'Director CLI (delegate)',
|
|
165
|
-
forge_version: 'cli',
|
|
166
|
-
/* The sub-agent does not own a sub-runtime; it
|
|
167
|
-
* is a leaf in this dispatch path. If a sub-
|
|
168
|
-
* agent itself invokes agent.delegate, that
|
|
169
|
-
* call will go through runtime.dispatchAgent
|
|
170
|
-
* on the SAME runtime instance -- so the
|
|
171
|
-
* director's runtime is sufficient for the
|
|
172
|
-
* whole tree. */
|
|
173
|
-
runtime: runtimeForDelegate,
|
|
174
|
-
});
|
|
175
|
-
const { runAgent } = await import('../agents/runner.js');
|
|
176
|
-
return runAgent(subDef, {
|
|
177
|
-
trigger_kind: 'manual',
|
|
178
|
-
trigger_reason: subReason,
|
|
179
|
-
step: subStep,
|
|
180
|
-
persist: true,
|
|
181
|
-
/* Cap sub-agents at 20 iterations -- same as the
|
|
182
|
-
* Director itself. Prevents a single delegated
|
|
183
|
-
* worker from runawaying the budget. */
|
|
184
|
-
max_iterations: 50,
|
|
185
|
-
});
|
|
186
|
-
},
|
|
187
|
-
});
|
|
188
|
-
/* Yuemail-dogfood fix #13: start the runtime BEFORE the
|
|
189
|
-
* director step is built. runtime.ts gates dispatchAgent
|
|
190
|
-
* on `running` and throws "runtime not started" if it
|
|
191
|
-
* is invoked before start(). The dispatch loop is on a
|
|
192
|
-
* setTimeout that unrefs itself, so node will still
|
|
193
|
-
* exit cleanly when stop() is called at the end. */
|
|
194
|
-
runtimeForDelegate.start();
|
|
195
|
-
const builder = deps.makeRealStep ?? (async (args) => {
|
|
196
|
-
const { makeRealStep } = await import('../agents/cli_real.js');
|
|
197
|
-
return makeRealStep({
|
|
198
|
-
def: args.def,
|
|
199
|
-
trigger_reason: args.trigger_reason,
|
|
200
|
-
project_root: args.project_root,
|
|
201
|
-
project_name: args.project_name,
|
|
202
|
-
forge_version: args.forge_version,
|
|
203
|
-
...(args.runtime ? { runtime: args.runtime } : {}),
|
|
204
|
-
/* Yuemail-dogfood fix #18: 8192 cap for the Director.
|
|
205
|
-
* The spec inlined in trigger_reason (~9 KB) + graph
|
|
206
|
-
* snapshot + R-strict mandate + system prompt easily
|
|
207
|
-
* burn the 4096 default on a single turn of textual
|
|
208
|
-
* acknowledgement before the LLM emits its first
|
|
209
|
-
* tool_use block. Sub-agents stay at the default. */
|
|
210
|
-
max_tokens: 8192,
|
|
211
|
-
});
|
|
212
|
-
});
|
|
213
|
-
try {
|
|
214
|
-
stepFn = await builder({
|
|
215
|
-
def, trigger_reason: triggerReason,
|
|
216
|
-
project_root: process.cwd(), project_name: 'Director CLI', forge_version: 'cli',
|
|
217
|
-
...(runtimeForDelegate ? { runtime: runtimeForDelegate } : {}),
|
|
218
|
-
});
|
|
219
|
-
}
|
|
220
|
-
catch (err) {
|
|
221
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
222
|
-
console.error('Failed to build real LLM step: ' + msg);
|
|
223
|
-
if (err && typeof err === 'object' && err.code === 'no_claude_key') {
|
|
224
|
-
console.error('');
|
|
225
|
-
console.error('Tip: run `yf keys setup --provider anthropic --key <KEY>` to load a key.');
|
|
226
|
-
}
|
|
227
|
-
process.exitCode = 1;
|
|
228
|
-
return;
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
else {
|
|
232
|
-
stepFn = async () => ({
|
|
233
|
-
text: 'cli stub: ingest of "' + session.doc_id + '" recorded. Pass --real to dispatch Claude.',
|
|
234
|
-
tokens_in: 0, tokens_out: 0, tool_calls: 0, done: true,
|
|
235
|
-
});
|
|
236
|
-
}
|
|
237
|
-
const run = await runAgent(def, {
|
|
238
|
-
trigger_kind: 'manual',
|
|
239
|
-
trigger_reason: triggerReason,
|
|
240
|
-
step: stepFn,
|
|
241
|
-
persist: true,
|
|
242
|
-
/* alpha.59z.156 E2E lesson -- the runner default
|
|
243
|
-
* max_iterations=100 lets a chatty Director burn ~200k
|
|
244
|
-
* tokens / >$5 before any human notices. Cap at 20 for
|
|
245
|
-
* the CLI single-entry path; users running through the
|
|
246
|
-
* panel keep the original 100 via runtime.dispatchAgent
|
|
247
|
-
* which doesn't override this.
|
|
248
|
-
*
|
|
249
|
-
* Yuemail-dogfood fix #19: cap raised from 20 -> 40.
|
|
250
|
-
* Sprint #10 exit-2'd at iter 20 with 27 tool calls and
|
|
251
|
-
* an in-flight scaffolder roundtrip. A full TDD cycle
|
|
252
|
-
* needs ~5 delegates per slice (analyst once + 3 slices
|
|
253
|
-
* x [coder, scaffolder, tester]) so 20 is a hair short.
|
|
254
|
-
* 40 still bounds blast radius -- at ~$0.4/iter via fix
|
|
255
|
-
* #20 loop discipline, max sprint cost is ~$16. */
|
|
256
|
-
max_iterations: 40,
|
|
257
|
-
});
|
|
258
|
-
if (opts.json) {
|
|
259
|
-
console.log(JSON.stringify({ doc_id: session.doc_id, run }, null, 2));
|
|
260
|
-
process.exitCode = run.status === 'succeeded' ? 0 : 2;
|
|
261
|
-
return;
|
|
262
|
-
}
|
|
263
|
-
console.log('Spec ingested:');
|
|
264
|
-
console.log(' Doc ID: ' + session.doc_id);
|
|
265
|
-
console.log(' Title: ' + doc.title);
|
|
266
|
-
console.log(' Sections: ' + doc.sections.length);
|
|
267
|
-
console.log(' Bytes: ' + doc.bytes);
|
|
268
|
-
console.log('');
|
|
269
|
-
console.log('Director run:');
|
|
270
|
-
console.log(' Run ID: ' + run.id);
|
|
271
|
-
console.log(' Status: ' + run.status + (run.kill_reason ? ' (' + run.kill_reason + ')' : ''));
|
|
272
|
-
console.log(' Trigger: ' + run.trigger_reason);
|
|
273
|
-
console.log(' Tokens: in=' + run.tokens_in + ' out=' + run.tokens_out);
|
|
274
|
-
console.log(' Tool calls: ' + run.tool_calls);
|
|
275
|
-
if (run.last_reply_summary) {
|
|
276
|
-
console.log(' Last reply: ' + run.last_reply_summary);
|
|
277
|
-
}
|
|
278
|
-
/* Yuemail-dogfood fix #13: stop the runtime we started so
|
|
279
|
-
* node can exit cleanly without waiting for the (unref'd)
|
|
280
|
-
* tick timer to drain. Best-effort -- never throw. */
|
|
281
|
-
if (runtimeForDelegate) {
|
|
282
|
-
try {
|
|
283
|
-
await runtimeForDelegate.stop();
|
|
284
|
-
}
|
|
285
|
-
catch { /* ignore */ }
|
|
286
|
-
}
|
|
287
|
-
process.exitCode = run.status === 'succeeded' ? 0 : 2;
|
|
288
|
-
});
|
|
289
|
-
}
|
|
290
|
-
//# sourceMappingURL=director.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"director.js","sourceRoot":"","sources":["../../src/commands/director.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `yf voice setup` -- interactive BYOK provider configuration.
|
|
3
|
-
*
|
|
4
|
-
* The user chooses one or more providers (OpenAI / Google /
|
|
5
|
-
* ElevenLabs), pastes the API keys, and this command:
|
|
6
|
-
*
|
|
7
|
-
* 1. Reads the current local provider keys from disk
|
|
8
|
-
* (~/.yujin-forge/provider_keys.json), if any.
|
|
9
|
-
* 2. Merges the new values on top.
|
|
10
|
-
* 3. Encrypts the merged payload with the SERVER_API_KEY
|
|
11
|
-
* from the vault (the same secret used for HMAC signing).
|
|
12
|
-
* 4. POSTs the encrypted blob to /v1/keys-sync/<handle> so
|
|
13
|
-
* the user's mobile + other paired devices pull it.
|
|
14
|
-
* 5. Writes the plaintext locally so subsequent voice calls
|
|
15
|
-
* can read it without re-prompting.
|
|
16
|
-
*
|
|
17
|
-
* Server never sees plaintext -- only the ciphertext blob.
|
|
18
|
-
*
|
|
19
|
-
* Subcommands:
|
|
20
|
-
* yf voice setup Interactive prompts.
|
|
21
|
-
* yf voice setup --show Print current local config (keys masked).
|
|
22
|
-
* yf voice setup --pull Pull the server copy + overwrite local.
|
|
23
|
-
* yf voice setup --provider openai --key sk-xxx
|
|
24
|
-
* Non-interactive single-provider set.
|
|
25
|
-
*
|
|
26
|
-
* ASCII-only.
|
|
27
|
-
*/
|
|
28
|
-
import type { Command } from 'commander';
|
|
29
|
-
export interface VoiceSetupOptions {
|
|
30
|
-
show?: boolean;
|
|
31
|
-
pull?: boolean;
|
|
32
|
-
provider?: string;
|
|
33
|
-
key?: string;
|
|
34
|
-
}
|
|
35
|
-
export declare function registerVoiceSetupCommand(parent: Command): void;
|
|
36
|
-
export declare function runVoiceSetup(opts: VoiceSetupOptions): Promise<void>;
|
|
37
|
-
//# sourceMappingURL=voice_setup.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"voice_setup.d.ts","sourceRoot":"","sources":["../../src/commands/voice_setup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8HzC,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAU/D;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuK1E"}
|