@namzu/cli 16.1.0 → 17.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -5
- package/dist/commands/drain.d.ts.map +1 -1
- package/dist/commands/drain.js +23 -1
- package/dist/commands/drain.js.map +1 -1
- package/dist/commands/run-stream.d.ts +3 -2
- package/dist/commands/run-stream.d.ts.map +1 -1
- package/dist/commands/run-stream.js +32 -37
- package/dist/commands/run-stream.js.map +1 -1
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +26 -24
- package/dist/commands/run.js.map +1 -1
- package/dist/config/load.d.ts +1 -1
- package/dist/config/load.d.ts.map +1 -1
- package/dist/config/load.js +3 -4
- package/dist/config/load.js.map +1 -1
- package/dist/doctor/checks/chain.d.ts +1 -1
- package/dist/doctor/checks/chain.d.ts.map +1 -1
- package/dist/doctor/checks/chain.js +2 -4
- package/dist/doctor/checks/chain.js.map +1 -1
- package/dist/integrations/files/attachment-store.d.ts.map +1 -1
- package/dist/integrations/files/attachment-store.js +3 -3
- package/dist/integrations/files/attachment-store.js.map +1 -1
- package/dist/integrations/plugins/runtime.d.ts.map +1 -1
- package/dist/integrations/plugins/runtime.js +4 -2
- package/dist/integrations/plugins/runtime.js.map +1 -1
- package/dist/integrations/providers/credential-store.d.ts.map +1 -1
- package/dist/integrations/providers/credential-store.js +13 -12
- package/dist/integrations/providers/credential-store.js.map +1 -1
- package/dist/integrations/providers/preferences.d.ts.map +1 -1
- package/dist/integrations/providers/preferences.js +5 -5
- package/dist/integrations/providers/preferences.js.map +1 -1
- package/dist/integrations/sessions/store.d.ts +31 -9
- package/dist/integrations/sessions/store.d.ts.map +1 -1
- package/dist/integrations/sessions/store.js +291 -69
- package/dist/integrations/sessions/store.js.map +1 -1
- package/dist/integrations/state/home.d.ts +25 -0
- package/dist/integrations/state/home.d.ts.map +1 -0
- package/dist/integrations/state/home.js +53 -0
- package/dist/integrations/state/home.js.map +1 -0
- package/dist/integrations/state/report.d.ts +8 -4
- package/dist/integrations/state/report.d.ts.map +1 -1
- package/dist/integrations/state/report.js +54 -7
- package/dist/integrations/state/report.js.map +1 -1
- package/dist/integrations/subagents/runtime.d.ts +3 -1
- package/dist/integrations/subagents/runtime.d.ts.map +1 -1
- package/dist/integrations/subagents/runtime.js +1 -0
- package/dist/integrations/subagents/runtime.js.map +1 -1
- package/dist/integrations/trust/store.d.ts.map +1 -1
- package/dist/integrations/trust/store.js +6 -6
- package/dist/integrations/trust/store.js.map +1 -1
- package/dist/memory/store.d.ts.map +1 -1
- package/dist/memory/store.js +7 -7
- package/dist/memory/store.js.map +1 -1
- package/dist/skills/store.d.ts +2 -1
- package/dist/skills/store.d.ts.map +1 -1
- package/dist/skills/store.js +11 -4
- package/dist/skills/store.js.map +1 -1
- package/dist/tui/App.d.ts.map +1 -1
- package/dist/tui/App.js +69 -51
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/LiveActivity.js +1 -1
- package/dist/tui/PermissionOverlay.d.ts.map +1 -1
- package/dist/tui/PermissionOverlay.js +4 -2
- package/dist/tui/PermissionOverlay.js.map +1 -1
- package/dist/tui/agent.d.ts +10 -2
- package/dist/tui/agent.d.ts.map +1 -1
- package/dist/tui/agent.js +76 -26
- package/dist/tui/agent.js.map +1 -1
- package/dist/tui/permission-review.d.ts.map +1 -1
- package/dist/tui/permission-review.js +47 -10
- package/dist/tui/permission-review.js.map +1 -1
- package/dist/user-commands/store.d.ts.map +1 -1
- package/dist/user-commands/store.js +4 -3
- package/dist/user-commands/store.js.map +1 -1
- package/package.json +3 -3
package/dist/skills/store.js
CHANGED
|
@@ -5,20 +5,24 @@
|
|
|
5
5
|
* (`name`, `description`) and a markdown body. Skills are discovered from
|
|
6
6
|
* two roots:
|
|
7
7
|
* - user: `~/.namzu/skills/<name>/SKILL.md`
|
|
8
|
-
* - project: `<cwd
|
|
8
|
+
* - project: `<cwd>/.namzu/skills/<name>/SKILL.md`
|
|
9
|
+
* - legacy project: `<cwd>/skills/<name>/SKILL.md`
|
|
9
10
|
*
|
|
10
11
|
* Project skills shadow user skills with the same name. The TUI lists them
|
|
11
12
|
* (`/skills`) and activates one (`/skill <name>`) by injecting its body
|
|
12
13
|
* into the agent's system prompt for subsequent turns.
|
|
13
14
|
*/
|
|
14
15
|
import { readFileSync, readdirSync } from 'node:fs';
|
|
15
|
-
import { homedir } from 'node:os';
|
|
16
16
|
import { join } from 'node:path';
|
|
17
17
|
import { parseFrontmatter } from '@namzu/sdk';
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
import { namzuHomePath } from '../integrations/state/home.js';
|
|
19
|
+
export function userSkillsDir(home) {
|
|
20
|
+
return join(namzuHomePath(home), 'skills');
|
|
20
21
|
}
|
|
21
22
|
export function projectSkillsDir(cwd = process.cwd()) {
|
|
23
|
+
return join(cwd, '.namzu', 'skills');
|
|
24
|
+
}
|
|
25
|
+
function legacyProjectSkillsDir(cwd = process.cwd()) {
|
|
22
26
|
return join(cwd, 'skills');
|
|
23
27
|
}
|
|
24
28
|
/**
|
|
@@ -114,10 +118,13 @@ function readSkillsFrom(dir, source) {
|
|
|
114
118
|
*/
|
|
115
119
|
export function discoverSkills(opts = {}) {
|
|
116
120
|
const user = readSkillsFrom(userSkillsDir(opts.home), 'user');
|
|
121
|
+
const legacyProject = readSkillsFrom(legacyProjectSkillsDir(opts.cwd), 'project');
|
|
117
122
|
const project = readSkillsFrom(projectSkillsDir(opts.cwd), 'project');
|
|
118
123
|
const byName = new Map();
|
|
119
124
|
for (const s of user)
|
|
120
125
|
byName.set(s.name, s);
|
|
126
|
+
for (const s of legacyProject)
|
|
127
|
+
byName.set(s.name, s);
|
|
121
128
|
for (const s of project)
|
|
122
129
|
byName.set(s.name, s); // project wins
|
|
123
130
|
return [...byName.values()].sort((a, b) => a.name.localeCompare(b.name));
|
package/dist/skills/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/skills/store.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/skills/store.ts"],"names":[],"mappings":"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"}
|
package/dist/tui/App.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/tui/App.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAON,KAAK,OAAO,EAiBZ,MAAM,YAAY,CAAA;AA+GnB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AA2CvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAU/D,MAAM,WAAW,QAAQ;IACxB,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAA;IACxB,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAA;IAC1D,0EAA0E;IAC1E,QAAQ,CAAC,cAAc,CAAC,EAAE,qBAAqB,CAAA;CAC/C;AAOD,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,EAAE;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;CAC5B,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;AAuKrB,6EAA6E;AAC7E,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,SAAS,MAAM,EAAE,CAM7F;AAED,sEAAsE;AACtE,wBAAgB,mBAAmB,CAClC,QAAQ,EAAE,SAAS,OAAO,EAAE,EAC5B,MAAM,EAAE,MAAM,MAAM,EACpB,iBAAiB,GAAE,SAAS,MAAM,EAAO,GACvC,SAAS,iBAAiB,EAAE,CAuE9B;AA8GD,wBAAgB,GAAG,CAAC,EACnB,GAAG,EAAE,UAAU,EACf,aAAa,EACb,cAAsC,GACtC,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/tui/App.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAON,KAAK,OAAO,EAiBZ,MAAM,YAAY,CAAA;AA+GnB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AA2CvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAU/D,MAAM,WAAW,QAAQ;IACxB,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAA;IACxB,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAA;IAC1D,0EAA0E;IAC1E,QAAQ,CAAC,cAAc,CAAC,EAAE,qBAAqB,CAAA;CAC/C;AAOD,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,EAAE;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;CAC5B,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;AAuKrB,6EAA6E;AAC7E,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,SAAS,MAAM,EAAE,CAM7F;AAED,sEAAsE;AACtE,wBAAgB,mBAAmB,CAClC,QAAQ,EAAE,SAAS,OAAO,EAAE,EAC5B,MAAM,EAAE,MAAM,MAAM,EACpB,iBAAiB,GAAE,SAAS,MAAM,EAAO,GACvC,SAAS,iBAAiB,EAAE,CAuE9B;AA8GD,wBAAgB,GAAG,CAAC,EACnB,GAAG,EAAE,UAAU,EACf,aAAa,EACb,cAAsC,GACtC,EAAE,QAAQ,2CAkoKV"}
|
package/dist/tui/App.js
CHANGED
|
@@ -478,6 +478,20 @@ export function App({ ctx: initialCtx, onExitSummary, externalEditor = defaultEx
|
|
|
478
478
|
focus: surface.kind === 'cockpit' ? surface.focus : surface.returnFocus,
|
|
479
479
|
});
|
|
480
480
|
}, [setAgentSurface]);
|
|
481
|
+
const openAgentCockpit = useCallback(() => {
|
|
482
|
+
const agents = subagentsRef.current;
|
|
483
|
+
const firstPhase = agentPhases(agents)[0];
|
|
484
|
+
const firstAgent = firstPhase?.agents[0];
|
|
485
|
+
if (!firstPhase || !firstAgent)
|
|
486
|
+
return false;
|
|
487
|
+
setAgentSurface({
|
|
488
|
+
kind: 'cockpit',
|
|
489
|
+
selectedPhaseId: firstPhase.id,
|
|
490
|
+
selectedId: firstAgent.viewId,
|
|
491
|
+
focus: 'agents',
|
|
492
|
+
});
|
|
493
|
+
return true;
|
|
494
|
+
}, [setAgentSurface]);
|
|
481
495
|
/** One git-backed review choice may be resolving while its visible picker remains authoritative. */
|
|
482
496
|
const reviewChoiceInFlightRef = useRef(null);
|
|
483
497
|
const exitArmedRef = useRef(false);
|
|
@@ -1338,47 +1352,41 @@ export function App({ ctx: initialCtx, onExitSummary, externalEditor = defaultEx
|
|
|
1338
1352
|
setMessages((prev) => prev.map((m) => m.id === id ? { ...m, content: finalContent ?? m.content, pending: false } : m));
|
|
1339
1353
|
}, []);
|
|
1340
1354
|
// Open the SDK session store and select the durable conversation once.
|
|
1341
|
-
//
|
|
1342
|
-
//
|
|
1355
|
+
// This is an admission gate for every startup, not optional persistence: a
|
|
1356
|
+
// corrupt or split estate must not silently widen into cwd-local state and
|
|
1357
|
+
// let the model run against a different history than the operator selected.
|
|
1343
1358
|
const ensureSessions = useCallback(async () => {
|
|
1344
1359
|
if (scopeRef.current)
|
|
1345
1360
|
return scopeRef.current;
|
|
1346
1361
|
const requestedConversationId = initialConversationIdRef.current;
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
conversationMaterializedRef.current = true;
|
|
1362
|
-
}
|
|
1363
|
-
else {
|
|
1364
|
-
// Provider/tool startup needs stable project/tenant/topic ids, not a
|
|
1365
|
-
// durable conversation. The cursor is replaced on first admitted use.
|
|
1366
|
-
sessionId = generateSessionId();
|
|
1367
|
-
}
|
|
1368
|
-
sessionsRef.current = sessions;
|
|
1369
|
-
scopeRef.current = {
|
|
1370
|
-
sessionId,
|
|
1371
|
-
topicId: sessions.topicId,
|
|
1372
|
-
projectId: sessions.projectId,
|
|
1373
|
-
tenantId: sessions.tenantId,
|
|
1374
|
-
};
|
|
1375
|
-
return scopeRef.current;
|
|
1376
|
-
}
|
|
1377
|
-
catch (error) {
|
|
1378
|
-
if (requestedConversationId)
|
|
1379
|
-
throw error;
|
|
1380
|
-
return undefined;
|
|
1362
|
+
const sessions = await openSessions(ctxRef.current.cwd);
|
|
1363
|
+
let sessionId;
|
|
1364
|
+
if (requestedConversationId) {
|
|
1365
|
+
const restored = await loadResumableConversation(sessions, requestedConversationId);
|
|
1366
|
+
sessionId = asSessionId(requestedConversationId);
|
|
1367
|
+
modelHistoryRef.current = restored;
|
|
1368
|
+
setMessages(projectConversation(restored, nextId));
|
|
1369
|
+
setHistory(promptHistoryFromConversation(restored));
|
|
1370
|
+
const persistedOutput = latestAssistantOutput(restored);
|
|
1371
|
+
lastCompletedOutputRef.current = persistedOutput
|
|
1372
|
+
? { text: persistedOutput, provenance: 'persisted' }
|
|
1373
|
+
: null;
|
|
1374
|
+
initialConversationIdRef.current = undefined;
|
|
1375
|
+
conversationMaterializedRef.current = true;
|
|
1381
1376
|
}
|
|
1377
|
+
else {
|
|
1378
|
+
// Provider/tool startup needs stable project/tenant/topic ids, not a
|
|
1379
|
+
// durable conversation. The cursor is replaced on first admitted use.
|
|
1380
|
+
sessionId = generateSessionId();
|
|
1381
|
+
}
|
|
1382
|
+
sessionsRef.current = sessions;
|
|
1383
|
+
scopeRef.current = {
|
|
1384
|
+
sessionId,
|
|
1385
|
+
topicId: sessions.topicId,
|
|
1386
|
+
projectId: sessions.projectId,
|
|
1387
|
+
tenantId: sessions.tenantId,
|
|
1388
|
+
};
|
|
1389
|
+
return scopeRef.current;
|
|
1382
1390
|
}, [nextId]);
|
|
1383
1391
|
/** Publish the provisional conversation exactly once, at first durable use. */
|
|
1384
1392
|
const materializeConversation = useCallback(async () => {
|
|
@@ -1429,6 +1437,9 @@ export function App({ ctx: initialCtx, onExitSummary, externalEditor = defaultEx
|
|
|
1429
1437
|
const s = await createAgentSession(prefs, detectedNow, {
|
|
1430
1438
|
scope,
|
|
1431
1439
|
cwd: activeCtx.cwd,
|
|
1440
|
+
...(sessionsRef.current?.backend === 'central'
|
|
1441
|
+
? { stateRoot: sessionsRef.current.root }
|
|
1442
|
+
: {}),
|
|
1432
1443
|
enableComputerUse: true,
|
|
1433
1444
|
rules: activeCtx.rules,
|
|
1434
1445
|
...(sessionsRef.current ? { sessionGoals: sessionsRef.current.goals } : {}),
|
|
@@ -1940,8 +1951,16 @@ export function App({ ctx: initialCtx, onExitSummary, externalEditor = defaultEx
|
|
|
1940
1951
|
setPermissionReviewOffset(0);
|
|
1941
1952
|
setPermissionDetailsOpen(false);
|
|
1942
1953
|
setPermission(null);
|
|
1943
|
-
if (resolve)
|
|
1954
|
+
if (resolve) {
|
|
1955
|
+
// The provider resumes asynchronously after the decision. Leaving the
|
|
1956
|
+
// old state in place during that hand-off painted an empty `…` row and
|
|
1957
|
+
// the now-invalid approval footer, so a four-agent batch looked frozen
|
|
1958
|
+
// precisely while its children were starting. The turn is working from
|
|
1959
|
+
// the instant consent resolves; the next tool event will refine this to
|
|
1960
|
+
// `tool`, and the ordinary turn finalizer owns the transition to idle.
|
|
1961
|
+
setState('thinking');
|
|
1944
1962
|
resolve(decision);
|
|
1963
|
+
}
|
|
1945
1964
|
}, [setPermissionDetailsOpen, setPermissionReviewOffset]);
|
|
1946
1965
|
/**
|
|
1947
1966
|
* Stop the running turn, and hand the screen back in a usable state.
|
|
@@ -2526,7 +2545,11 @@ export function App({ ctx: initialCtx, onExitSummary, externalEditor = defaultEx
|
|
|
2526
2545
|
activeToolsRef.current = [...running.slice(0, i), ...running.slice(i + 1)];
|
|
2527
2546
|
setActiveTools(activeToolsRef.current);
|
|
2528
2547
|
}
|
|
2529
|
-
pushMessage('tool', done?.label ?? formatToolCall(event.toolName, event.summary), false, event.isError ? '✗' : '✓', done?.detail, event.isError ? theme.status.error : theme.status.ok,
|
|
2548
|
+
pushMessage('tool', done?.label ?? formatToolCall(event.toolName, event.summary), false, event.isError ? '✗' : '✓', done?.detail, event.isError ? theme.status.error : theme.status.ok, event.durationMs !== undefined
|
|
2549
|
+
? formatElapsed(event.durationMs)
|
|
2550
|
+
: done
|
|
2551
|
+
? formatElapsed(Date.now() - done.startedAt)
|
|
2552
|
+
: undefined);
|
|
2530
2553
|
if (event.isError ||
|
|
2531
2554
|
(!event.hidden && (event.summary.length > 0 || (event.detail?.length ?? 0) > 0))) {
|
|
2532
2555
|
pushMessage('tool', event.isError ? `failed: ${event.summary}` : event.summary, false, '⎿', event.detail);
|
|
@@ -3077,21 +3100,9 @@ export function App({ ctx: initialCtx, onExitSummary, externalEditor = defaultEx
|
|
|
3077
3100
|
return;
|
|
3078
3101
|
}
|
|
3079
3102
|
case 'agent-cockpit': {
|
|
3080
|
-
|
|
3081
|
-
if (agents.length === 0) {
|
|
3103
|
+
if (!openAgentCockpit()) {
|
|
3082
3104
|
pushMessage('system', 'No delegated agents are available in this conversation yet. When an Agent tool starts one, /agent opens its live activity and retained transcript.');
|
|
3083
|
-
return;
|
|
3084
3105
|
}
|
|
3085
|
-
const firstPhase = agentPhases(agents)[0];
|
|
3086
|
-
const firstAgent = firstPhase?.agents[0];
|
|
3087
|
-
if (!firstPhase || !firstAgent)
|
|
3088
|
-
return;
|
|
3089
|
-
setAgentSurface({
|
|
3090
|
-
kind: 'cockpit',
|
|
3091
|
-
selectedPhaseId: firstPhase.id,
|
|
3092
|
-
selectedId: firstAgent.viewId,
|
|
3093
|
-
focus: 'agents',
|
|
3094
|
-
});
|
|
3095
3106
|
return;
|
|
3096
3107
|
}
|
|
3097
3108
|
case 'clear-screen':
|
|
@@ -3754,6 +3765,7 @@ export function App({ ctx: initialCtx, onExitSummary, externalEditor = defaultEx
|
|
|
3754
3765
|
exitWithSummary,
|
|
3755
3766
|
hasUnsettledTurn,
|
|
3756
3767
|
nextId,
|
|
3768
|
+
openAgentCockpit,
|
|
3757
3769
|
pushMessage,
|
|
3758
3770
|
rawOutput,
|
|
3759
3771
|
removeStoredCredential,
|
|
@@ -4225,6 +4237,12 @@ export function App({ ctx: initialCtx, onExitSummary, externalEditor = defaultEx
|
|
|
4225
4237
|
resolvePermission({ kind: 'approve-all' });
|
|
4226
4238
|
return;
|
|
4227
4239
|
}
|
|
4240
|
+
// The active child count already advertises this key beside Working.
|
|
4241
|
+
// Open the same retained cockpit as `/agent`; Enter then drills into a
|
|
4242
|
+
// child's transcript. Keep the shortcut below consent so it can never
|
|
4243
|
+
// hide an approval that owns the keyboard.
|
|
4244
|
+
if (key.ctrl && input === 't' && openAgentCockpit())
|
|
4245
|
+
return;
|
|
4228
4246
|
// Child observation owns navigation, but never outranks consent: the
|
|
4229
4247
|
// permission branch above preempts it if a child or parent call asks.
|
|
4230
4248
|
const agentView = agentSurfaceRef.current;
|