@nac3/forge-cli 1.21.2 → 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.
@@ -1 +1 @@
1
- {"version":3,"file":"whats_new.d.ts","sourceRoot":"","sources":["../../src/core/whats_new.ts"],"names":[],"mappings":"AA2BA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAK,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAID,eAAO,MAAM,OAAO,EAAE,aAAa,EAiKlC,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED,iBAAS,YAAY,IAAI,MAAM,CAI9B;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQ3D;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMlE;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG;IACvC,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAI,MAAM,CAAC;IACjB,OAAO,EAAG,MAAM,CAAC;CAClB,CAaA;AAED,sEAAsE;AACtE,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAoB5D;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,cAAc,CAAC,CAqBzB;AAED,iBAAiB;AACjB,eAAO,MAAM,SAAS;;CAAmB,CAAC"}
1
+ {"version":3,"file":"whats_new.d.ts","sourceRoot":"","sources":["../../src/core/whats_new.ts"],"names":[],"mappings":"AA2BA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAK,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAID,eAAO,MAAM,OAAO,EAAE,aAAa,EA2KlC,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED,iBAAS,YAAY,IAAI,MAAM,CAI9B;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQ3D;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMlE;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG;IACvC,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAI,MAAM,CAAC;IACjB,OAAO,EAAG,MAAM,CAAC;CAClB,CAaA;AAED,sEAAsE;AACtE,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAoB5D;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,cAAc,CAAC,CAqBzB;AAED,iBAAiB;AACjB,eAAO,MAAM,SAAS;;CAAmB,CAAC"}
@@ -27,6 +27,16 @@ import { renameWithRetry } from '../core/atomic_write.js';
27
27
  /* The catalog is ordered newest-first. Sumi adds an entry at the
28
28
  * top with every shipped alpha that has a user-visible change. */
29
29
  export const CATALOG = [
30
+ {
31
+ version: '1.21.3',
32
+ date: '2026-10-26',
33
+ summary: 'The package no longer ships compiled files whose source was deleted',
34
+ bullets: [
35
+ 'Three .js files with no source travelled in every tarball: the old voice setup (unified into `yf keys setup`), the build-side director removed in June, and a pizarron module deleted as dead. tsc emits but does not prune, so nothing ever removed them.',
36
+ 'It was not just weight: one of them held the last raw fs.rename in the published product, while the guard added hours earlier reported zero -- because that guard reads src/ and npm ships dist/.',
37
+ 'The build now wipes its output directory first, and a new guard inspects the ARTIFACT: no orphan compiled file, no rename without the retry. When there is nothing built to inspect it says so instead of passing.',
38
+ ],
39
+ },
30
40
  {
31
41
  version: '1.21.2',
32
42
  date: '2026-10-26',
@@ -1 +1 @@
1
- {"version":3,"file":"whats_new.js","sourceRoot":"","sources":["../../src/core/whats_new.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"whats_new.js","sourceRoot":"","sources":["../../src/core/whats_new.ts"],"names":[],"mappings":"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"}
package/dist/version.d.ts CHANGED
@@ -2,5 +2,5 @@
2
2
  * Yujin Forge CLI version. Kept in sync with package.json by the npm
3
3
  * "version" lifecycle (scripts/sync_version.mjs) so the two never drift.
4
4
  */
5
- export declare const VERSION = "1.21.2";
5
+ export declare const VERSION = "1.21.3";
6
6
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -2,5 +2,5 @@
2
2
  * Yujin Forge CLI version. Kept in sync with package.json by the npm
3
3
  * "version" lifecycle (scripts/sync_version.mjs) so the two never drift.
4
4
  */
5
- export const VERSION = '1.21.2';
5
+ export const VERSION = '1.21.3';
6
6
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nac3/forge-cli",
3
- "version": "1.21.2",
3
+ "version": "1.21.3",
4
4
  "description": "Yujin Forge -- voice-first NAC-3 React development framework. CLI + chat panel + spec ingest + 10-format document reader + voice loop.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "author": "Pablo Kuschnirof <pablo@rpaforce.com>",
@@ -17,7 +17,7 @@
17
17
  },
18
18
  "scripts": {
19
19
  "version": "node scripts/sync_version.mjs && git add src/version.ts",
20
- "build": "tsc && node scripts/copy_qa_assets.mjs",
20
+ "build": "node scripts/clean_dist.mjs && tsc && node scripts/copy_qa_assets.mjs",
21
21
  "dev": "tsx watch src/bin/yf.ts",
22
22
  "typecheck": "tsc --noEmit",
23
23
  "typecheck:all": "pnpm typecheck && pnpm --filter @yujin/hito4-server typecheck && pnpm --filter @yujin/forge-mobile typecheck",
@@ -1,76 +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
- export interface LayoutNode {
20
- id: string;
21
- type?: string;
22
- label?: string;
23
- lane?: string;
24
- gateway?: string;
25
- _x?: number;
26
- _y?: number;
27
- }
28
- export interface LayoutFlow {
29
- from: string;
30
- to: string;
31
- label?: string;
32
- }
33
- export interface LayoutLane {
34
- id: string;
35
- label?: string;
36
- }
37
- export interface LaneBand {
38
- id: string;
39
- label: string;
40
- y: number;
41
- h: number;
42
- }
43
- export interface LayoutResult {
44
- W: number;
45
- H: number;
46
- laneBands: LaneBand[];
47
- }
48
- export declare const FL: {
49
- COL_W: number;
50
- PAD: number;
51
- LANE_PAD: number;
52
- LANE_MIN: number;
53
- LANE_LBL: number;
54
- TOP_LANES: number;
55
- TOP_PLAIN: number;
56
- EVENT_H: number;
57
- GATE_H: number;
58
- TASK_H: number;
59
- LABEL_LH: number;
60
- LABEL_GAP: number;
61
- NODE_GAP: number;
62
- LABEL_WRAP_CHARS: number;
63
- LABEL_WRAP_LINES: number;
64
- TASK_WRAP_CHARS: number;
65
- TASK_WRAP_LINES: number;
66
- };
67
- /** Canonical label wrapper (shared with the renderers so reserved height matches
68
- * what is actually drawn). Greedy word wrap; last line gets an ellipsis when it
69
- * still overflows. */
70
- export declare function wrapLabel(s: string, maxChars: number, maxLines: number): string[];
71
- /**
72
- * Assign _x/_y to every node and return the diagram geometry (canvas size +
73
- * swimlane bands). Mutates the nodes in place.
74
- */
75
- export declare function layoutFlowModel(nodes: LayoutNode[], flows: LayoutFlow[], lanes: LayoutLane[]): LayoutResult;
76
- //# sourceMappingURL=flow_layout.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"flow_layout.d.ts","sourceRoot":"","sources":["../../src/chat/flow_layout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC3E,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;CAC1B;AACD,MAAM,WAAW,UAAU;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE;AACxE,MAAM,WAAW,UAAU;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE;AAE1D,MAAM,WAAW,QAAQ;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE;AAC7E,MAAM,WAAW,YAAY;IAAG,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,QAAQ,EAAE,CAAA;CAAE;AAG7E,eAAO,MAAM,EAAE;;;;;;;;;;;;;;;;;;CAoBd,CAAC;AAEF;;uBAEuB;AACvB,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAcjF;AA2BD;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,GAC5D,YAAY,CA4Hd"}
@@ -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"}
@@ -1,308 +0,0 @@
1
- import { promises as fs } from 'node:fs';
2
- import path from 'node:path';
3
- import os from 'node:os';
4
- import prompts from 'prompts';
5
- import { c, header } from '../ui/colors.js';
6
- import { Vault } from '../vault/store.js';
7
- import { configDir } from '../license/index.js';
8
- import { readLicense } from '../core/polar.js';
9
- import { signBearer, HITO4_BASE_URL } from '../license/hito4_client.js';
10
- import { encryptUserKeys, decryptUserKeys, envelopeToBlob, envelopeFromBlob, } from '../core/keys_envelope.js';
11
- const VAULT_SECRET_SLOT = 'yf_server_api_key';
12
- const LOCAL_KEYS_FILE = 'provider_keys.json';
13
- function localKeysPath() {
14
- const home = process.env.HOME || process.env.USERPROFILE || os.homedir();
15
- return path.join(home, '.yujin-forge', LOCAL_KEYS_FILE);
16
- }
17
- async function readLocalKeys() {
18
- try {
19
- const raw = await fs.readFile(localKeysPath(), 'utf-8');
20
- const parsed = JSON.parse(raw);
21
- if (parsed && parsed.v === 1)
22
- return parsed;
23
- }
24
- catch { /* missing or malformed -- treat as empty */ }
25
- return { v: 1, updated_at: '1970-01-01T00:00:00Z' };
26
- }
27
- async function writeLocalKeys(payload) {
28
- const p = localKeysPath();
29
- await fs.mkdir(path.dirname(p), { recursive: true });
30
- const tmp = p + '.tmp';
31
- await fs.writeFile(tmp, JSON.stringify(payload, null, 2), 'utf-8');
32
- await fs.rename(tmp, p);
33
- }
34
- function maskKey(k) {
35
- if (!k)
36
- return '(none)';
37
- if (k.length <= 8)
38
- return '****';
39
- return k.slice(0, 4) + '...' + k.slice(-4);
40
- }
41
- async function loadServerSecret() {
42
- const vault = await Vault.open({ configDir: configDir() });
43
- if (!vault.has(VAULT_SECRET_SLOT)) {
44
- throw new Error('voice setup: vault slot "' + VAULT_SECRET_SLOT + '" is empty. '
45
- + 'Run `yf vault set ' + VAULT_SECRET_SLOT + '` with the value '
46
- + 'provided at signup (or your tenant admin) before configuring '
47
- + 'voice providers.');
48
- }
49
- return vault.get(VAULT_SECRET_SLOT);
50
- }
51
- async function loadUserHandle() {
52
- const lic = await readLicense();
53
- if (!lic.user_handle) {
54
- throw new Error('voice setup: no user_handle on the local license cache. '
55
- + 'Run `yf license activate --user-handle <you@example.com>` first.');
56
- }
57
- return lic.user_handle;
58
- }
59
- async function pushToServer(payload) {
60
- const secret = await loadServerSecret();
61
- const handle = await loadUserHandle();
62
- const env = await encryptUserKeys(payload, secret);
63
- const blob = envelopeToBlob(env);
64
- const bearer = signBearer(secret, handle);
65
- const url = HITO4_BASE_URL.replace(/\/+$/, '') + '/v1/keys-sync/' + encodeURIComponent(handle);
66
- const r = await fetch(url, {
67
- method: 'POST',
68
- headers: {
69
- Authorization: 'Bearer ' + bearer,
70
- 'content-type': 'application/json',
71
- },
72
- body: JSON.stringify({ blob, ts: payload.updated_at }),
73
- });
74
- if (!r.ok) {
75
- let detail = '';
76
- try {
77
- detail = await r.text();
78
- }
79
- catch { /* */ }
80
- throw new Error('voice setup: server push failed (HTTP ' + r.status + '): ' + detail.slice(0, 200));
81
- }
82
- }
83
- async function pullFromServer() {
84
- const secret = await loadServerSecret();
85
- const handle = await loadUserHandle();
86
- const bearer = signBearer(secret, handle);
87
- const url = HITO4_BASE_URL.replace(/\/+$/, '') + '/v1/keys-sync/' + encodeURIComponent(handle);
88
- const r = await fetch(url, {
89
- method: 'GET',
90
- headers: { Authorization: 'Bearer ' + bearer },
91
- });
92
- if (!r.ok) {
93
- let detail = '';
94
- try {
95
- detail = await r.text();
96
- }
97
- catch { /* */ }
98
- throw new Error('voice setup: server pull failed (HTTP ' + r.status + '): ' + detail.slice(0, 200));
99
- }
100
- const body = await r.json();
101
- if (!body.blob)
102
- return null;
103
- const env = envelopeFromBlob(body.blob);
104
- return decryptUserKeys(env, secret);
105
- }
106
- function printCurrent(p) {
107
- header('Yujin Forge -- voice setup (current local)');
108
- console.log('');
109
- console.log(' OpenAI API key: ' + c.dim(maskKey(p.openai_api_key)));
110
- console.log(' Google STT key: ' + c.dim(maskKey(p.google_stt_key)));
111
- console.log(' Google TTS key: ' + c.dim(maskKey(p.google_tts_key)));
112
- console.log(' ElevenLabs API key: ' + c.dim(maskKey(p.elevenlabs_api_key)));
113
- console.log('');
114
- console.log(' STT preference: ' + c.brand(p.stt_provider_preference ?? '(not set)'));
115
- console.log(' TTS preference: ' + c.brand(p.tts_provider_preference ?? '(not set)'));
116
- console.log(' STT language: ' + (p.stt_language ?? c.dim('(default)')));
117
- console.log(' TTS voice: ' + (p.tts_voice ?? c.dim('(default)')));
118
- console.log(' Last updated: ' + c.dim(p.updated_at));
119
- }
120
- export function registerVoiceSetupCommand(parent) {
121
- parent
122
- .command('setup')
123
- .description('Configure voice provider API keys (OpenAI / Google / ElevenLabs). '
124
- + 'Encrypts + syncs to your other devices automatically.')
125
- .option('--show', 'print current local config (keys masked)')
126
- .option('--pull', 'pull the server copy + overwrite local')
127
- .option('--provider <name>', 'non-interactive: set this provider')
128
- .option('--key <value>', 'non-interactive: the API key value for --provider')
129
- .action(async (opts) => { await runVoiceSetup(opts); });
130
- }
131
- export async function runVoiceSetup(opts) {
132
- /* --show: print current + exit. */
133
- if (opts.show) {
134
- const current = await readLocalKeys();
135
- printCurrent(current);
136
- return;
137
- }
138
- /* --pull: server -> local. */
139
- if (opts.pull) {
140
- let pulled;
141
- try {
142
- pulled = await pullFromServer();
143
- }
144
- catch (err) {
145
- console.error(c.error(err instanceof Error ? err.message : String(err)));
146
- process.exitCode = 1;
147
- return;
148
- }
149
- if (!pulled) {
150
- console.log(c.dim('Server has no provider keys for this user yet.'));
151
- return;
152
- }
153
- await writeLocalKeys(pulled);
154
- header('Yujin Forge -- voice setup (pulled from server)');
155
- console.log('');
156
- printCurrent(pulled);
157
- return;
158
- }
159
- /* --provider / --key: non-interactive single set. */
160
- if (opts.provider || opts.key) {
161
- if (!opts.provider || !opts.key) {
162
- console.error(c.error('--provider and --key must be used together.'));
163
- process.exitCode = 1;
164
- return;
165
- }
166
- const merged = await readLocalKeys();
167
- const ts = new Date().toISOString();
168
- const p = opts.provider.toLowerCase();
169
- if (p === 'openai')
170
- merged.openai_api_key = opts.key;
171
- else if (p === 'google-stt')
172
- merged.google_stt_key = opts.key;
173
- else if (p === 'google-tts')
174
- merged.google_tts_key = opts.key;
175
- else if (p === 'elevenlabs')
176
- merged.elevenlabs_api_key = opts.key;
177
- else {
178
- console.error(c.error('--provider must be one of: openai, google-stt, google-tts, elevenlabs'));
179
- process.exitCode = 1;
180
- return;
181
- }
182
- merged.updated_at = ts;
183
- try {
184
- await pushToServer(merged);
185
- await writeLocalKeys(merged);
186
- header('Yujin Forge -- voice setup (saved)');
187
- console.log('');
188
- printCurrent(merged);
189
- }
190
- catch (err) {
191
- console.error(c.error(err instanceof Error ? err.message : String(err)));
192
- process.exitCode = 1;
193
- }
194
- return;
195
- }
196
- /* Interactive flow. */
197
- const current = await readLocalKeys();
198
- header('Yujin Forge -- voice setup');
199
- console.log('');
200
- console.log(c.dim('Configure the API keys for your chosen voice providers. The keys are'));
201
- console.log(c.dim('encrypted with your account secret + synced to your mobile + other'));
202
- console.log(c.dim('paired devices automatically. The server never sees plaintext.'));
203
- console.log('');
204
- console.log(c.dim('Press Enter on any field to keep its current value.'));
205
- console.log('');
206
- const answers = await prompts([
207
- {
208
- type: 'multiselect',
209
- name: 'providers',
210
- message: 'Which providers do you want to configure?',
211
- choices: [
212
- { title: 'OpenAI (Whisper for STT + tts-1 for TTS)', value: 'openai' },
213
- { title: 'Google Cloud (Speech-to-Text + Text-to-Speech)', value: 'google' },
214
- { title: 'ElevenLabs (TTS only -- higher quality voice)', value: 'elevenlabs' },
215
- ],
216
- min: 1,
217
- hint: 'Space to select, Enter to confirm.',
218
- },
219
- ]);
220
- if (!answers.providers || answers.providers.length === 0) {
221
- console.log(c.dim('No providers selected. Aborting.'));
222
- return;
223
- }
224
- const merged = { ...current };
225
- if (answers.providers.includes('openai')) {
226
- const r = await prompts({
227
- type: 'password',
228
- name: 'k',
229
- message: 'OpenAI API key (sk-...). Current: ' + maskKey(current.openai_api_key),
230
- });
231
- if (r.k)
232
- merged.openai_api_key = r.k;
233
- }
234
- if (answers.providers.includes('google')) {
235
- const sttR = await prompts({
236
- type: 'password',
237
- name: 'k',
238
- message: 'Google Cloud Speech-to-Text API key. Current: ' + maskKey(current.google_stt_key),
239
- });
240
- if (sttR.k)
241
- merged.google_stt_key = sttR.k;
242
- const ttsR = await prompts({
243
- type: 'password',
244
- name: 'k',
245
- message: 'Google Cloud Text-to-Speech API key (can be same as STT). Current: ' + maskKey(current.google_tts_key),
246
- });
247
- if (ttsR.k)
248
- merged.google_tts_key = ttsR.k;
249
- }
250
- if (answers.providers.includes('elevenlabs')) {
251
- const r = await prompts({
252
- type: 'password',
253
- name: 'k',
254
- message: 'ElevenLabs API key. Current: ' + maskKey(current.elevenlabs_api_key),
255
- });
256
- if (r.k)
257
- merged.elevenlabs_api_key = r.k;
258
- }
259
- /* Preferences (which provider to USE for each direction). */
260
- const sttCandidates = [];
261
- if (merged.openai_api_key)
262
- sttCandidates.push({ title: 'OpenAI (Whisper)', value: 'openai' });
263
- if (merged.google_stt_key)
264
- sttCandidates.push({ title: 'Google', value: 'google' });
265
- if (sttCandidates.length > 0) {
266
- const pref = await prompts({
267
- type: 'select',
268
- name: 'p',
269
- message: 'Preferred STT provider',
270
- choices: sttCandidates,
271
- initial: 0,
272
- });
273
- if (pref.p)
274
- merged.stt_provider_preference = pref.p;
275
- }
276
- const ttsCandidates = [];
277
- if (merged.openai_api_key)
278
- ttsCandidates.push({ title: 'OpenAI (tts-1)', value: 'openai' });
279
- if (merged.google_tts_key)
280
- ttsCandidates.push({ title: 'Google', value: 'google' });
281
- if (merged.elevenlabs_api_key)
282
- ttsCandidates.push({ title: 'ElevenLabs', value: 'elevenlabs' });
283
- if (ttsCandidates.length > 0) {
284
- const pref = await prompts({
285
- type: 'select',
286
- name: 'p',
287
- message: 'Preferred TTS provider',
288
- choices: ttsCandidates,
289
- initial: 0,
290
- });
291
- if (pref.p)
292
- merged.tts_provider_preference = pref.p;
293
- }
294
- merged.updated_at = new Date().toISOString();
295
- try {
296
- await pushToServer(merged);
297
- await writeLocalKeys(merged);
298
- console.log('');
299
- console.log(c.success('Voice config saved + synced.'));
300
- console.log('');
301
- printCurrent(merged);
302
- }
303
- catch (err) {
304
- console.error(c.error(err instanceof Error ? err.message : String(err)));
305
- process.exitCode = 1;
306
- }
307
- }
308
- //# sourceMappingURL=voice_setup.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"voice_setup.js","sourceRoot":"","sources":["../../src/commands/voice_setup.ts"],"names":[],"mappings":"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"}