@namzu/cli 0.6.0 → 0.7.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/dist/__tests__/permission-rules-reach-the-turn.test.d.ts +31 -0
- package/dist/__tests__/permission-rules-reach-the-turn.test.d.ts.map +1 -0
- package/dist/__tests__/permission-rules-reach-the-turn.test.js +132 -0
- package/dist/__tests__/permission-rules-reach-the-turn.test.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +16 -3
- package/dist/cli.js.map +1 -1
- package/dist/cli.test.js +7 -1
- package/dist/cli.test.js.map +1 -1
- package/dist/commands/__tests__/run-flags.test.js +0 -1
- package/dist/commands/__tests__/run-flags.test.js.map +1 -1
- package/dist/commands/__tests__/run-stream-flags.test.js +0 -1
- package/dist/commands/__tests__/run-stream-flags.test.js.map +1 -1
- package/dist/commands/run-stream.d.ts +3 -3
- package/dist/commands/run-stream.js +3 -3
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +4 -0
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/stubs.d.ts +10 -0
- package/dist/commands/stubs.d.ts.map +1 -1
- package/dist/commands/stubs.js +12 -2
- package/dist/commands/stubs.js.map +1 -1
- package/dist/config/load.d.ts.map +1 -1
- package/dist/config/load.js +20 -4
- package/dist/config/load.js.map +1 -1
- package/dist/config/schema.d.ts +0 -12
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/doctor/checks/credentials.d.ts +20 -0
- package/dist/doctor/checks/credentials.d.ts.map +1 -0
- package/dist/doctor/checks/credentials.js +58 -0
- package/dist/doctor/checks/credentials.js.map +1 -0
- package/dist/doctor/checks/credentials.test.d.ts +10 -0
- package/dist/doctor/checks/credentials.test.d.ts.map +1 -0
- package/dist/doctor/checks/credentials.test.js +47 -0
- package/dist/doctor/checks/credentials.test.js.map +1 -0
- package/dist/doctor/checks/index.d.ts +2 -1
- package/dist/doctor/checks/index.d.ts.map +1 -1
- package/dist/doctor/checks/index.js +3 -1
- package/dist/doctor/checks/index.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/integrations/providers/discover.d.ts +3 -8
- package/dist/integrations/providers/discover.d.ts.map +1 -1
- package/dist/integrations/providers/discover.js +2 -12
- package/dist/integrations/providers/discover.js.map +1 -1
- package/dist/integrations/providers/discover.test.js +1 -28
- package/dist/integrations/providers/discover.test.js.map +1 -1
- package/dist/integrations/providers/index.d.ts +0 -1
- package/dist/integrations/providers/index.d.ts.map +1 -1
- package/dist/integrations/providers/index.js +0 -1
- package/dist/integrations/providers/index.js.map +1 -1
- package/dist/integrations/providers/oauth.d.ts +1 -1
- package/dist/integrations/providers/oauth.js +1 -1
- package/dist/integrations/providers/preferences.d.ts +2 -2
- package/dist/integrations/providers/preferences.js +2 -2
- package/dist/integrations/sessions/store.js +1 -1
- package/dist/integrations/sessions/store.js.map +1 -1
- package/dist/integrations/subagents/__tests__/delegation-trace.test.d.ts +2 -0
- package/dist/integrations/subagents/__tests__/delegation-trace.test.d.ts.map +1 -0
- package/dist/integrations/subagents/__tests__/delegation-trace.test.js +69 -0
- package/dist/integrations/subagents/__tests__/delegation-trace.test.js.map +1 -0
- package/dist/integrations/subagents/runtime.d.ts.map +1 -1
- package/dist/integrations/subagents/runtime.js +12 -2
- package/dist/integrations/subagents/runtime.js.map +1 -1
- package/dist/integrations/updates.d.ts +4 -12
- package/dist/integrations/updates.d.ts.map +1 -1
- package/dist/integrations/updates.js +6 -53
- package/dist/integrations/updates.js.map +1 -1
- package/dist/tui/App.d.ts.map +1 -1
- package/dist/tui/App.js +42 -141
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/Picker.d.ts +4 -4
- package/dist/tui/Picker.d.ts.map +1 -1
- package/dist/tui/Picker.js +6 -8
- package/dist/tui/Picker.js.map +1 -1
- package/dist/tui/StatusBar.d.ts +39 -3
- package/dist/tui/StatusBar.d.ts.map +1 -1
- package/dist/tui/StatusBar.js +33 -9
- package/dist/tui/StatusBar.js.map +1 -1
- package/dist/tui/__tests__/context-gauge.test.d.ts +2 -0
- package/dist/tui/__tests__/context-gauge.test.d.ts.map +1 -0
- package/dist/tui/__tests__/context-gauge.test.js +83 -0
- package/dist/tui/__tests__/context-gauge.test.js.map +1 -0
- package/dist/tui/__tests__/deferred-tool-discovery.test.d.ts +24 -0
- package/dist/tui/__tests__/deferred-tool-discovery.test.d.ts.map +1 -0
- package/dist/tui/__tests__/deferred-tool-discovery.test.js +111 -0
- package/dist/tui/__tests__/deferred-tool-discovery.test.js.map +1 -0
- package/dist/tui/__tests__/to-agent-event.test.js +181 -0
- package/dist/tui/__tests__/to-agent-event.test.js.map +1 -1
- package/dist/tui/__tests__/working-directory.test.js +0 -6
- package/dist/tui/__tests__/working-directory.test.js.map +1 -1
- package/dist/tui/agent.d.ts +38 -2
- package/dist/tui/agent.d.ts.map +1 -1
- package/dist/tui/agent.js +110 -31
- package/dist/tui/agent.js.map +1 -1
- package/dist/tui/slashCommands.d.ts +0 -6
- package/dist/tui/slashCommands.d.ts.map +1 -1
- package/dist/tui/slashCommands.js +1 -21
- package/dist/tui/slashCommands.js.map +1 -1
- package/dist/tui/types.d.ts +12 -0
- package/dist/tui/types.d.ts.map +1 -1
- package/package.json +5 -6
- package/dist/commands/tools.d.ts +0 -16
- package/dist/commands/tools.d.ts.map +0 -1
- package/dist/commands/tools.js +0 -161
- package/dist/commands/tools.js.map +0 -1
- package/dist/integrations/clawtool/agents.d.ts +0 -31
- package/dist/integrations/clawtool/agents.d.ts.map +0 -1
- package/dist/integrations/clawtool/agents.js +0 -30
- package/dist/integrations/clawtool/agents.js.map +0 -1
- package/dist/integrations/clawtool/agents.test.d.ts +0 -2
- package/dist/integrations/clawtool/agents.test.d.ts.map +0 -1
- package/dist/integrations/clawtool/agents.test.js +0 -79
- package/dist/integrations/clawtool/agents.test.js.map +0 -1
- package/dist/integrations/clawtool/auth.d.ts +0 -26
- package/dist/integrations/clawtool/auth.d.ts.map +0 -1
- package/dist/integrations/clawtool/auth.js +0 -56
- package/dist/integrations/clawtool/auth.js.map +0 -1
- package/dist/integrations/clawtool/auth.test.d.ts +0 -2
- package/dist/integrations/clawtool/auth.test.d.ts.map +0 -1
- package/dist/integrations/clawtool/auth.test.js +0 -40
- package/dist/integrations/clawtool/auth.test.js.map +0 -1
- package/dist/integrations/clawtool/binary.d.ts +0 -25
- package/dist/integrations/clawtool/binary.d.ts.map +0 -1
- package/dist/integrations/clawtool/binary.js +0 -50
- package/dist/integrations/clawtool/binary.js.map +0 -1
- package/dist/integrations/clawtool/binary.test.d.ts +0 -2
- package/dist/integrations/clawtool/binary.test.d.ts.map +0 -1
- package/dist/integrations/clawtool/binary.test.js +0 -50
- package/dist/integrations/clawtool/binary.test.js.map +0 -1
- package/dist/integrations/clawtool/daemon.d.ts +0 -37
- package/dist/integrations/clawtool/daemon.d.ts.map +0 -1
- package/dist/integrations/clawtool/daemon.js +0 -109
- package/dist/integrations/clawtool/daemon.js.map +0 -1
- package/dist/integrations/clawtool/daemon.test.d.ts +0 -11
- package/dist/integrations/clawtool/daemon.test.d.ts.map +0 -1
- package/dist/integrations/clawtool/daemon.test.js +0 -118
- package/dist/integrations/clawtool/daemon.test.js.map +0 -1
- package/dist/integrations/clawtool/dispatch.d.ts +0 -33
- package/dist/integrations/clawtool/dispatch.d.ts.map +0 -1
- package/dist/integrations/clawtool/dispatch.js +0 -155
- package/dist/integrations/clawtool/dispatch.js.map +0 -1
- package/dist/integrations/clawtool/dispatch.test.d.ts +0 -2
- package/dist/integrations/clawtool/dispatch.test.d.ts.map +0 -1
- package/dist/integrations/clawtool/dispatch.test.js +0 -138
- package/dist/integrations/clawtool/dispatch.test.js.map +0 -1
- package/dist/integrations/clawtool/index.d.ts +0 -11
- package/dist/integrations/clawtool/index.d.ts.map +0 -1
- package/dist/integrations/clawtool/index.js +0 -10
- package/dist/integrations/clawtool/index.js.map +0 -1
- package/dist/integrations/clawtool/mcp.d.ts +0 -51
- package/dist/integrations/clawtool/mcp.d.ts.map +0 -1
- package/dist/integrations/clawtool/mcp.js +0 -174
- package/dist/integrations/clawtool/mcp.js.map +0 -1
- package/dist/integrations/clawtool/mcp.test.d.ts +0 -2
- package/dist/integrations/clawtool/mcp.test.d.ts.map +0 -1
- package/dist/integrations/clawtool/mcp.test.js +0 -126
- package/dist/integrations/clawtool/mcp.test.js.map +0 -1
- package/dist/integrations/clawtool/paths.d.ts +0 -8
- package/dist/integrations/clawtool/paths.d.ts.map +0 -1
- package/dist/integrations/clawtool/paths.js +0 -19
- package/dist/integrations/clawtool/paths.js.map +0 -1
- package/dist/integrations/clawtool/peers.d.ts +0 -67
- package/dist/integrations/clawtool/peers.d.ts.map +0 -1
- package/dist/integrations/clawtool/peers.js +0 -150
- package/dist/integrations/clawtool/peers.js.map +0 -1
- package/dist/integrations/clawtool/plugin.d.ts +0 -42
- package/dist/integrations/clawtool/plugin.d.ts.map +0 -1
- package/dist/integrations/clawtool/plugin.js +0 -38
- package/dist/integrations/clawtool/plugin.js.map +0 -1
- package/dist/integrations/clawtool/state.d.ts +0 -11
- package/dist/integrations/clawtool/state.d.ts.map +0 -1
- package/dist/integrations/clawtool/state.js +0 -41
- package/dist/integrations/clawtool/state.js.map +0 -1
- package/dist/integrations/clawtool/state.test.d.ts +0 -2
- package/dist/integrations/clawtool/state.test.d.ts.map +0 -1
- package/dist/integrations/clawtool/state.test.js +0 -38
- package/dist/integrations/clawtool/state.test.js.map +0 -1
- package/dist/integrations/clawtool/tooling.d.ts +0 -52
- package/dist/integrations/clawtool/tooling.d.ts.map +0 -1
- package/dist/integrations/clawtool/tooling.js +0 -91
- package/dist/integrations/clawtool/tooling.js.map +0 -1
- package/dist/integrations/clawtool/tooling.test.d.ts +0 -2
- package/dist/integrations/clawtool/tooling.test.d.ts.map +0 -1
- package/dist/integrations/clawtool/tooling.test.js +0 -58
- package/dist/integrations/clawtool/tooling.test.js.map +0 -1
- package/dist/integrations/clawtool/types.d.ts +0 -41
- package/dist/integrations/clawtool/types.d.ts.map +0 -1
- package/dist/integrations/clawtool/types.js +0 -9
- package/dist/integrations/clawtool/types.js.map +0 -1
- package/dist/integrations/providers/secrets.d.ts +0 -37
- package/dist/integrations/providers/secrets.d.ts.map +0 -1
- package/dist/integrations/providers/secrets.js +0 -69
- package/dist/integrations/providers/secrets.js.map +0 -1
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { LocalTaskGateway } from '@namzu/sdk';
|
|
3
|
+
import { createSubagentRuntime } from '../runtime.js';
|
|
4
|
+
/**
|
|
5
|
+
* A delegated run belongs inside the turn that asked for it.
|
|
6
|
+
*
|
|
7
|
+
* The kernel supports this end to end — the executing tool's span reaches
|
|
8
|
+
* `createTask`, survives `configOverrides`, is stamped onto the child config
|
|
9
|
+
* after the host's `configBuilder` runs, and becomes the child run's trace
|
|
10
|
+
* parent. Every hop was built and tested. The `Agent` tool simply did not pass
|
|
11
|
+
* the first one, so a sub-agent opened its own ROOT trace and the delegation
|
|
12
|
+
* structure — the one thing a delegation trace exists to record — was absent.
|
|
13
|
+
*
|
|
14
|
+
* The gateway is constructed inside the runtime, so the spy goes on its
|
|
15
|
+
* prototype: this drives the real tool through the real wiring rather than
|
|
16
|
+
* re-deriving what the tool ought to do. A unit test on the span helper would
|
|
17
|
+
* have passed throughout the defect.
|
|
18
|
+
*/
|
|
19
|
+
const fakeSpan = { __brand: 'span' };
|
|
20
|
+
function toolContext(parentSpan) {
|
|
21
|
+
return { runId: 'run_test', ...(parentSpan ? { parentSpan } : {}) };
|
|
22
|
+
}
|
|
23
|
+
async function buildAgentTool() {
|
|
24
|
+
const created = [];
|
|
25
|
+
vi.spyOn(LocalTaskGateway.prototype, 'createTask').mockImplementation(async (options) => {
|
|
26
|
+
created.push(options);
|
|
27
|
+
return { taskId: 'tsk_1' };
|
|
28
|
+
});
|
|
29
|
+
vi.spyOn(LocalTaskGateway.prototype, 'waitForTask').mockResolvedValue({
|
|
30
|
+
state: 'completed',
|
|
31
|
+
result: { status: 'completed', result: 'done' },
|
|
32
|
+
});
|
|
33
|
+
const runtime = await createSubagentRuntime({
|
|
34
|
+
cwd: '/tmp',
|
|
35
|
+
model: 'test-model',
|
|
36
|
+
buildProvider: () => ({}),
|
|
37
|
+
buildTools: () => ({}),
|
|
38
|
+
});
|
|
39
|
+
return { agentTool: runtime.agentTool, created };
|
|
40
|
+
}
|
|
41
|
+
afterEach(() => {
|
|
42
|
+
vi.restoreAllMocks();
|
|
43
|
+
});
|
|
44
|
+
describe('the Agent tool parents a delegated run to the turn that asked for it', () => {
|
|
45
|
+
it('passes the executing tool span through to the child run', async () => {
|
|
46
|
+
const { agentTool, created } = await buildAgentTool();
|
|
47
|
+
await agentTool.execute({ description: 'audit', prompt: 'do a thing' }, toolContext(fakeSpan));
|
|
48
|
+
expect(created).toHaveLength(1);
|
|
49
|
+
expect(created[0]?.parentSpan).toBe(fakeSpan);
|
|
50
|
+
});
|
|
51
|
+
it('omits the key entirely when the turn supplied no span', async () => {
|
|
52
|
+
// Not the same as passing `undefined`: the kernel branches on the
|
|
53
|
+
// property's presence, and a top-level run with no parent is correct
|
|
54
|
+
// to start its own root. Refusing to invent one is the other half of
|
|
55
|
+
// the fix, not an edge case.
|
|
56
|
+
const { agentTool, created } = await buildAgentTool();
|
|
57
|
+
await agentTool.execute({ description: 'audit', prompt: 'do a thing' }, toolContext());
|
|
58
|
+
expect(created[0]).not.toHaveProperty('parentSpan');
|
|
59
|
+
});
|
|
60
|
+
it('parents a dynamically defined specialist too', async () => {
|
|
61
|
+
// The `role` branch registers a fresh agent before delegating, and it
|
|
62
|
+
// is a second path to the same `createTask`. One of two paths carrying
|
|
63
|
+
// a signal is how this class of defect survives a green suite.
|
|
64
|
+
const { agentTool, created } = await buildAgentTool();
|
|
65
|
+
await agentTool.execute({ description: 'audit', prompt: 'do a thing', role: 'You are an auditor' }, toolContext(fakeSpan));
|
|
66
|
+
expect(created[0]?.parentSpan).toBe(fakeSpan);
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
//# sourceMappingURL=delegation-trace.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delegation-trace.test.js","sourceRoot":"","sources":["../../../../src/integrations/subagents/__tests__/delegation-trace.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/integrations/subagents/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAYN,KAAK,WAAW,EAIhB,KAAK,QAAQ,EAIb,KAAK,WAAW,EAGhB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EAEzB,KAAK,sBAAsB,EAI3B,MAAM,YAAY,CAAA;AAEnB,eAAO,MAAM,wBAAwB,oBAAoB,CAAA;AAczD,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,yEAAyE;IACzE,QAAQ,CAAC,aAAa,EAAE,MAAM,WAAW,CAAA;IACzC,iEAAiE;IACjE,QAAQ,CAAC,UAAU,EAAE,MAAM,oBAAoB,CAAA;IAC/C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,sBAAsB,CAAA;IAClD,4EAA4E;IAC5E,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAA;CAC5C;AAED,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAA;IAC7B,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAA;IAClC,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAA;CAC3C;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAC1C,IAAI,EAAE,sBAAsB,GAC1B,OAAO,CAAC,eAAe,CAAC,
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/integrations/subagents/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAYN,KAAK,WAAW,EAIhB,KAAK,QAAQ,EAIb,KAAK,WAAW,EAGhB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EAEzB,KAAK,sBAAsB,EAI3B,MAAM,YAAY,CAAA;AAEnB,eAAO,MAAM,wBAAwB,oBAAoB,CAAA;AAczD,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,yEAAyE;IACzE,QAAQ,CAAC,aAAa,EAAE,MAAM,WAAW,CAAA;IACzC,iEAAiE;IACjE,QAAQ,CAAC,UAAU,EAAE,MAAM,oBAAoB,CAAA;IAC/C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,sBAAsB,CAAA;IAClD,4EAA4E;IAC5E,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAA;CAC5C;AAED,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAA;IAC7B,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAA;IAClC,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAA;CAC3C;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAC1C,IAAI,EAAE,sBAAsB,GAC1B,OAAO,CAAC,eAAe,CAAC,CA+I1B"}
|
|
@@ -100,7 +100,7 @@ export async function createSubagentRuntime(opts) {
|
|
|
100
100
|
readOnly: false,
|
|
101
101
|
destructive: false,
|
|
102
102
|
concurrencySafe: true,
|
|
103
|
-
async execute(input) {
|
|
103
|
+
async execute(input, context) {
|
|
104
104
|
const { prompt, role } = input;
|
|
105
105
|
let agentId = GENERAL_PURPOSE_SUBAGENT;
|
|
106
106
|
const persona = typeof role === 'string' ? role.trim() : '';
|
|
@@ -110,7 +110,17 @@ export async function createSubagentRuntime(opts) {
|
|
|
110
110
|
registry.register(buildDefinition(agentId, `Dynamic specialist: ${agentId}`, persona, opts));
|
|
111
111
|
}
|
|
112
112
|
try {
|
|
113
|
-
const handle = await gateway.createTask({
|
|
113
|
+
const handle = await gateway.createTask({
|
|
114
|
+
agentId,
|
|
115
|
+
prompt,
|
|
116
|
+
workingDirectory: opts.cwd,
|
|
117
|
+
// Hang the child run off THIS tool's span, so the delegation
|
|
118
|
+
// shows up inside the turn that asked for it. Without it a
|
|
119
|
+
// sub-agent opens its OWN root trace, and the one structure
|
|
120
|
+
// a delegation trace exists to record — who dispatched whom
|
|
121
|
+
// — is the thing that goes missing.
|
|
122
|
+
...(context.parentSpan ? { parentSpan: context.parentSpan } : {}),
|
|
123
|
+
});
|
|
114
124
|
const completed = await gateway.waitForTask(handle.taskId);
|
|
115
125
|
const runStatus = completed.result?.status;
|
|
116
126
|
const succeeded = completed.state === 'completed' && (runStatus === undefined || runStatus === 'completed');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/integrations/subagents/runtime.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/integrations/subagents/runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Update
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* yields `null`, never an error or a hang.
|
|
2
|
+
* Update check for namzu (npm), surfaced in the TUI so the user knows when a
|
|
3
|
+
* newer version is out. Best-effort with a short timeout: offline or
|
|
4
|
+
* unpublished yields `null`, never an error or a hang.
|
|
6
5
|
*/
|
|
7
6
|
export interface UpdateInfo {
|
|
8
7
|
readonly name: string;
|
|
@@ -15,13 +14,6 @@ export interface UpdateInfo {
|
|
|
15
14
|
export declare function compareVersions(a: string, b: string): number;
|
|
16
15
|
/** Newer @namzu/cli on npm, or null when up to date / unreachable. */
|
|
17
16
|
export declare function checkNamzuUpdate(current: string): Promise<UpdateInfo | null>;
|
|
18
|
-
/**
|
|
19
|
-
* Newer clawtool, or null. Prefers the machine-readable
|
|
20
|
-
* `upgrade --check --json` (newer binaries); falls back to parsing the
|
|
21
|
-
* `current -> latest` line in the plain `upgrade --check` output (older
|
|
22
|
-
* binaries that predate `--json`).
|
|
23
|
-
*/
|
|
24
|
-
export declare function checkClawtoolUpdate(): Promise<UpdateInfo | null>;
|
|
25
|
-
/** Run both checks in parallel; returns whichever have an update available. */
|
|
17
|
+
/** Returns an update when one is available. */
|
|
26
18
|
export declare function checkUpdates(namzuVersion: string): Promise<readonly UpdateInfo[]>;
|
|
27
19
|
//# sourceMappingURL=updates.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updates.d.ts","sourceRoot":"","sources":["../../src/integrations/updates.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"updates.d.ts","sourceRoot":"","sources":["../../src/integrations/updates.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,yCAAyC;IACzC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CACpB;AAID,yEAAyE;AACzE,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAc5D;AAED,sEAAsE;AACtE,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAkBlF;AAED,+CAA+C;AAC/C,wBAAsB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,UAAU,EAAE,CAAC,CAGvF"}
|
|
@@ -1,13 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Update
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* yields `null`, never an error or a hang.
|
|
2
|
+
* Update check for namzu (npm), surfaced in the TUI so the user knows when a
|
|
3
|
+
* newer version is out. Best-effort with a short timeout: offline or
|
|
4
|
+
* unpublished yields `null`, never an error or a hang.
|
|
6
5
|
*/
|
|
7
|
-
import { execFile } from 'node:child_process';
|
|
8
|
-
import { findBinary } from './clawtool/binary.js';
|
|
9
6
|
const NPM_TIMEOUT_MS = 2_500;
|
|
10
|
-
const CLAWTOOL_TIMEOUT_MS = 5_000;
|
|
11
7
|
/** Compare dotted numeric versions; >0 if a>b, <0 if a<b, 0 if equal. */
|
|
12
8
|
export function compareVersions(a, b) {
|
|
13
9
|
const parse = (v) => v
|
|
@@ -48,52 +44,9 @@ export async function checkNamzuUpdate(current) {
|
|
|
48
44
|
clearTimeout(timer);
|
|
49
45
|
}
|
|
50
46
|
}
|
|
51
|
-
|
|
52
|
-
return new Promise((resolve) => {
|
|
53
|
-
execFile(bin, args, { timeout: CLAWTOOL_TIMEOUT_MS }, (_err, stdout) => resolve(stdout ?? ''));
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Newer clawtool, or null. Prefers the machine-readable
|
|
58
|
-
* `upgrade --check --json` (newer binaries); falls back to parsing the
|
|
59
|
-
* `current -> latest` line in the plain `upgrade --check` output (older
|
|
60
|
-
* binaries that predate `--json`).
|
|
61
|
-
*/
|
|
62
|
-
export async function checkClawtoolUpdate() {
|
|
63
|
-
let bin;
|
|
64
|
-
try {
|
|
65
|
-
bin = findBinary();
|
|
66
|
-
}
|
|
67
|
-
catch {
|
|
68
|
-
return null;
|
|
69
|
-
}
|
|
70
|
-
const how = 'clawtool upgrade';
|
|
71
|
-
// JSON path (preferred).
|
|
72
|
-
try {
|
|
73
|
-
const data = JSON.parse(await run(bin, ['upgrade', '--check', '--json']));
|
|
74
|
-
if (data.update_available && data.current && data.latest) {
|
|
75
|
-
return { name: 'clawtool', current: data.current, latest: data.latest, how };
|
|
76
|
-
}
|
|
77
|
-
if (data.current)
|
|
78
|
-
return null; // valid JSON, no update
|
|
79
|
-
}
|
|
80
|
-
catch {
|
|
81
|
-
// fall through to plain parsing
|
|
82
|
-
}
|
|
83
|
-
// Plain-output fallback: a line like `0.22.159 -> 0.22.160`.
|
|
84
|
-
const plain = await run(bin, ['upgrade', '--check']);
|
|
85
|
-
const m = plain.match(/(\d+\.\d+\.\d+)\s*->\s*(\d+\.\d+\.\d+)/);
|
|
86
|
-
if (m?.[1] && m[2] && compareVersions(m[2], m[1]) > 0) {
|
|
87
|
-
return { name: 'clawtool', current: m[1], latest: m[2], how };
|
|
88
|
-
}
|
|
89
|
-
return null;
|
|
90
|
-
}
|
|
91
|
-
/** Run both checks in parallel; returns whichever have an update available. */
|
|
47
|
+
/** Returns an update when one is available. */
|
|
92
48
|
export async function checkUpdates(namzuVersion) {
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
checkClawtoolUpdate(),
|
|
96
|
-
]);
|
|
97
|
-
return [namzu, clawtool].filter((u) => u !== null);
|
|
49
|
+
const namzu = await checkNamzuUpdate(namzuVersion);
|
|
50
|
+
return namzu ? [namzu] : [];
|
|
98
51
|
}
|
|
99
52
|
//# sourceMappingURL=updates.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updates.js","sourceRoot":"","sources":["../../src/integrations/updates.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"updates.js","sourceRoot":"","sources":["../../src/integrations/updates.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH,MAAM,cAAc,GAAG,KAAK,CAAA;AAE5B,yEAAyE;AACzE,MAAM,UAAU,eAAe,CAAC,CAAS,EAAE,CAAS;IACnD,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAC3B,CAAC;SACC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;SACjB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,0BAA0B;QACzC,EAAE,KAAK,CAAC,GAAG,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAA;IAChD,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;IACnB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACzD,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;QACrC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,CAAC,CAAA;IACtB,CAAC;IACD,OAAO,CAAC,CAAA;AACT,CAAC;AAED,sEAAsE;AACtE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAe;IACrD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IACxC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,cAAc,CAAC,CAAA;IAClE,IAAI,CAAC;QACJ,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,8CAA8C,EAAE;YACvE,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;SACvC,CAAC,CAAA;QACF,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,IAAI,CAAA;QACxB,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA0B,CAAA;QACxD,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAA;QACrE,IAAI,CAAC,MAAM,IAAI,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAA;QACjE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,qBAAqB,EAAE,CAAA;IACtE,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAA;IACZ,CAAC;YAAS,CAAC;QACV,YAAY,CAAC,KAAK,CAAC,CAAA;IACpB,CAAC;AACF,CAAC;AAED,+CAA+C;AAC/C,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,YAAoB;IACtD,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,YAAY,CAAC,CAAA;IAClD,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AAC5B,CAAC"}
|
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;
|
|
1
|
+
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/tui/App.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAqDH,OAAO,KAAK,EAAqB,UAAU,EAAE,MAAM,YAAY,CAAA;AAE/D,MAAM,WAAW,QAAQ;IACxB,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAA;CACxB;AAWD,wBAAgB,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,QAAQ,2CA2uBpC"}
|
package/dist/tui/App.js
CHANGED
|
@@ -5,7 +5,6 @@ import { writePreferences, } from '../integrations/providers/index.js';
|
|
|
5
5
|
import { isTrusted, trustDir } from '../integrations/trust/store.js';
|
|
6
6
|
import { appendMemory, composeMemoryPrompt, readMemory } from '../memory/store.js';
|
|
7
7
|
import { composeSkillsPrompt, discoverSkills, loadSkillBody } from '../skills/store.js';
|
|
8
|
-
import { deregisterPeer, drainInbox, heartbeatPeer, listPeers, registerPeer, sendPeerMessage, } from '../integrations/clawtool/peers.js';
|
|
9
8
|
import { checkUpdates } from '../integrations/updates.js';
|
|
10
9
|
import { LiveActivity, formatElapsed } from './LiveActivity.js';
|
|
11
10
|
import { expandFileMentions } from './mentions.js';
|
|
@@ -34,6 +33,10 @@ export function App({ ctx }) {
|
|
|
34
33
|
const [permission, setPermission] = useState(null);
|
|
35
34
|
const [activeSkills, setActiveSkills] = useState([]);
|
|
36
35
|
const [usage, setUsage] = useState(null);
|
|
36
|
+
// Context fill, straight from the kernel and held apart from `usage` —
|
|
37
|
+
// they are different quantities and conflating them is what made the
|
|
38
|
+
// gauge climb with turn count instead of with context.
|
|
39
|
+
const [context, setContext] = useState(null);
|
|
37
40
|
// Tools currently executing — rendered live (spinner + elapsed) below the
|
|
38
41
|
// transcript, then committed as static lines on completion.
|
|
39
42
|
const [activeTools, setActiveTools] = useState([]);
|
|
@@ -60,12 +63,6 @@ export function App({ ctx }) {
|
|
|
60
63
|
const sessionsRef = useRef(null);
|
|
61
64
|
const scopeRef = useRef(null);
|
|
62
65
|
const idRef = useRef(0);
|
|
63
|
-
// This session's clawtool BIAM peer id (null when no clawtool daemon).
|
|
64
|
-
// Registering as a peer lets other terminals/agents see + message us.
|
|
65
|
-
const peerIdRef = useRef(null);
|
|
66
|
-
// Mirror of `state` for callbacks/pollers that need the current value
|
|
67
|
-
// without re-subscribing (the inbox poller decides whether namzu is free).
|
|
68
|
-
const stateRef = useRef(state);
|
|
69
66
|
const nextId = useCallback(() => {
|
|
70
67
|
idRef.current += 1;
|
|
71
68
|
return `m${idRef.current}`;
|
|
@@ -114,19 +111,23 @@ export function App({ ctx }) {
|
|
|
114
111
|
}, [ctx.cwd]);
|
|
115
112
|
const hydrateSession = useCallback(async (prefs, detectedNow) => {
|
|
116
113
|
const scope = await ensureSessions();
|
|
117
|
-
const s = await createAgentSession(prefs, detectedNow, {
|
|
114
|
+
const s = await createAgentSession(prefs, detectedNow, {
|
|
115
|
+
scope,
|
|
116
|
+
cwd: ctx.cwd,
|
|
117
|
+
rules: ctx.rules,
|
|
118
|
+
});
|
|
118
119
|
setSession(s);
|
|
119
120
|
setCurrentProvider(prefs.provider);
|
|
120
121
|
if (s.hasProvider) {
|
|
121
122
|
setPhase('ready');
|
|
122
|
-
pushMessage('system', `Connected to ${s.providerSummary}${s.modelSummary ? ` · ${s.modelSummary}` : ''} · ${s.toolNames.length} tools
|
|
123
|
+
pushMessage('system', `Connected to ${s.providerSummary}${s.modelSummary ? ` · ${s.modelSummary}` : ''} · ${s.toolNames.length} tools`);
|
|
123
124
|
}
|
|
124
125
|
else {
|
|
125
126
|
setPhase('unhealthy');
|
|
126
127
|
if (s.errorHint)
|
|
127
128
|
pushMessage('system', s.errorHint);
|
|
128
129
|
}
|
|
129
|
-
}, [ctx.cwd, pushMessage]);
|
|
130
|
+
}, [ctx.cwd, ctx.rules, pushMessage]);
|
|
130
131
|
const runProbe = useCallback(async () => {
|
|
131
132
|
try {
|
|
132
133
|
const probe = await probeAgentSession();
|
|
@@ -194,22 +195,6 @@ export function App({ ctx }) {
|
|
|
194
195
|
pushMessage('system', `Could not list conversations: ${err instanceof Error ? err.message : String(err)}`);
|
|
195
196
|
}
|
|
196
197
|
}, [ensureSessions, pushMessage]);
|
|
197
|
-
// `/agents`: list every agent peer clawtool knows about — across terminals
|
|
198
|
-
// and (via clawtool's mDNS) the LAN. clawtool's BIAM registry is the single
|
|
199
|
-
// source of truth; namzu just renders it.
|
|
200
|
-
const doListAgents = useCallback(async () => {
|
|
201
|
-
const peers = await listPeers();
|
|
202
|
-
if (peers.length === 0) {
|
|
203
|
-
pushMessage('system', 'No agent peers found. Is clawtool running? Other namzu / claude / codex / gemini windows register here automatically.');
|
|
204
|
-
return;
|
|
205
|
-
}
|
|
206
|
-
const lines = peers.map((p) => {
|
|
207
|
-
const mine = p.peer_id === peerIdRef.current ? ' (this one)' : '';
|
|
208
|
-
const where = p.path ? ` · ${p.path}` : '';
|
|
209
|
-
return `● ${p.display_name} [${p.backend}]${where}${mine}`;
|
|
210
|
-
});
|
|
211
|
-
pushMessage('system', `agent peers (${peers.length}):\n${lines.join('\n')}`);
|
|
212
|
-
}, [pushMessage]);
|
|
213
198
|
// Load the chosen conversation into the transcript and continue in it.
|
|
214
199
|
const resumeConversation = useCallback(async (conv) => {
|
|
215
200
|
const sessions = sessionsRef.current;
|
|
@@ -308,10 +293,32 @@ export function App({ ctx }) {
|
|
|
308
293
|
}
|
|
309
294
|
case 'usage':
|
|
310
295
|
setUsage({ totalTokens: event.totalTokens, costUsd: event.costUsd });
|
|
296
|
+
// Mirrored verbatim, absences included. A run that reports no
|
|
297
|
+
// window clears the gauge rather than leaving the last one up:
|
|
298
|
+
// a stale bar is read as current, and this bar's whole defect
|
|
299
|
+
// was being read as something it was not.
|
|
300
|
+
setContext({
|
|
301
|
+
...(event.contextTokens !== undefined ? { tokens: event.contextTokens } : {}),
|
|
302
|
+
...(event.contextWindowTokens !== undefined
|
|
303
|
+
? { windowTokens: event.contextWindowTokens }
|
|
304
|
+
: {}),
|
|
305
|
+
...(event.contextMeasuredBy !== undefined
|
|
306
|
+
? { measuredBy: event.contextMeasuredBy }
|
|
307
|
+
: {}),
|
|
308
|
+
...(event.windowSource !== undefined ? { windowSource: event.windowSource } : {}),
|
|
309
|
+
});
|
|
311
310
|
break;
|
|
312
311
|
case 'task':
|
|
313
312
|
pushMessage('tool', event.subject, false, event.status === 'completed' ? '☑' : '☐');
|
|
314
313
|
break;
|
|
314
|
+
case 'context':
|
|
315
|
+
// Into the TRANSCRIPT, not a status line. A status indicator is
|
|
316
|
+
// present while nothing is happening and gone afterwards, so
|
|
317
|
+
// someone reading back could not tell whether the gap they are
|
|
318
|
+
// looking at was compacted. The event is a fact about the
|
|
319
|
+
// conversation and belongs in its record.
|
|
320
|
+
pushMessage('system', event.text, false, event.shed ? '⌫' : '⌦');
|
|
321
|
+
break;
|
|
315
322
|
case 'done':
|
|
316
323
|
closeAssistant();
|
|
317
324
|
break;
|
|
@@ -322,7 +329,7 @@ export function App({ ctx }) {
|
|
|
322
329
|
break;
|
|
323
330
|
}
|
|
324
331
|
}, [appendToMessage, finalizeMessage, pushMessage]);
|
|
325
|
-
const runTurn = useCallback(async (text, images
|
|
332
|
+
const runTurn = useCallback(async (text, images) => {
|
|
326
333
|
if (!session || !session.hasProvider) {
|
|
327
334
|
pushMessage('system', session?.errorHint ?? 'Agent is not ready yet — give it a moment.');
|
|
328
335
|
return;
|
|
@@ -351,7 +358,7 @@ export function App({ ctx }) {
|
|
|
351
358
|
pushMessage('user', text, false, undefined, undefined, undefined, metaParts.length > 0 ? metaParts.join(' · ') : undefined);
|
|
352
359
|
setState('thinking');
|
|
353
360
|
// The model interleaves text → tool → text across iterations; `applyEvent`
|
|
354
|
-
//
|
|
361
|
+
// renders each one in order.
|
|
355
362
|
const st = { assistantId: null, text: '' };
|
|
356
363
|
const ac = new AbortController();
|
|
357
364
|
abortRef.current = ac;
|
|
@@ -387,30 +394,8 @@ export function App({ ctx }) {
|
|
|
387
394
|
turn.push(createAssistantMessage(st.text));
|
|
388
395
|
void appendMessages(sessions, scope.sessionId, turn).catch(() => { });
|
|
389
396
|
}
|
|
390
|
-
// If this turn answered an inbound peer message, send the reply back
|
|
391
|
-
// to that peer's inbox — closing the BIAM loop (agent↔agent).
|
|
392
|
-
if (replyTo && st.text.trim().length > 0) {
|
|
393
|
-
void sendPeerMessage(replyTo, st.text.trim(), { from: peerIdRef.current ?? undefined });
|
|
394
|
-
}
|
|
395
397
|
}
|
|
396
398
|
}, [activeSkills, applyEvent, ctx.cwd, ctx.skipPermissions, finalizeMessage, messages, onPermission, pushMessage, session]);
|
|
397
|
-
// Send a message to another agent peer's BIAM inbox (cross-terminal /
|
|
398
|
-
// cross-agent). Pick the peer by a substring of its display name or id.
|
|
399
|
-
const doSendPeer = useCallback(async (query, text) => {
|
|
400
|
-
const peers = await listPeers();
|
|
401
|
-
const match = peers.find((p) => p.peer_id !== peerIdRef.current &&
|
|
402
|
-
(p.peer_id === query ||
|
|
403
|
-
p.display_name.toLowerCase().includes(query.toLowerCase()) ||
|
|
404
|
-
p.backend.toLowerCase() === query.toLowerCase()));
|
|
405
|
-
if (!match) {
|
|
406
|
-
pushMessage('system', `No peer matching "${query}". See /agents.`);
|
|
407
|
-
return;
|
|
408
|
-
}
|
|
409
|
-
const ok = await sendPeerMessage(match.peer_id, text, { from: peerIdRef.current ?? undefined });
|
|
410
|
-
pushMessage('system', ok
|
|
411
|
-
? `Sent to ${match.display_name} [${match.backend}]: ${text}`
|
|
412
|
-
: `Could not reach ${match.display_name}.`);
|
|
413
|
-
}, [pushMessage]);
|
|
414
399
|
const handleSubmit = useCallback((value, images) => {
|
|
415
400
|
setHistory((prev) => [...prev, value]);
|
|
416
401
|
const slash = runSlash(value, slashCtx);
|
|
@@ -480,12 +465,6 @@ export function App({ ctx }) {
|
|
|
480
465
|
case 'resume':
|
|
481
466
|
void doResume();
|
|
482
467
|
return;
|
|
483
|
-
case 'list-agents':
|
|
484
|
-
void doListAgents();
|
|
485
|
-
return;
|
|
486
|
-
case 'send-peer':
|
|
487
|
-
void doSendPeer(slash.peer, slash.text);
|
|
488
|
-
return;
|
|
489
468
|
case 'none':
|
|
490
469
|
return;
|
|
491
470
|
}
|
|
@@ -497,7 +476,7 @@ export function App({ ctx }) {
|
|
|
497
476
|
return;
|
|
498
477
|
}
|
|
499
478
|
void runTurn(value, images);
|
|
500
|
-
}, [activeSkills,
|
|
479
|
+
}, [activeSkills, doResume, exit, pushMessage, runTurn, slashCtx, state]);
|
|
501
480
|
// Drain the queue: when a turn settles (idle) and nothing is running,
|
|
502
481
|
// send the next queued message automatically.
|
|
503
482
|
useEffect(() => {
|
|
@@ -508,33 +487,7 @@ export function App({ ctx }) {
|
|
|
508
487
|
if (next !== undefined)
|
|
509
488
|
void runTurn(next);
|
|
510
489
|
}, [state, phase, queued, runTurn]);
|
|
511
|
-
//
|
|
512
|
-
// as a peer in clawtool's registry, heartbeat, and deregister on unmount.
|
|
513
|
-
// `registerPeer` ensures clawtool's daemon, so the user never starts it by
|
|
514
|
-
// hand. clawtool also prunes stale peers, so a missed deregister self-heals.
|
|
515
|
-
useEffect(() => {
|
|
516
|
-
if (phase !== 'ready' || peerIdRef.current)
|
|
517
|
-
return;
|
|
518
|
-
const home = process.env.HOME;
|
|
519
|
-
const title = home && ctx.cwd.startsWith(home) ? `~${ctx.cwd.slice(home.length)}` : ctx.cwd;
|
|
520
|
-
let cancelled = false;
|
|
521
|
-
void registerPeer({
|
|
522
|
-
display_name: `namzu ${title}`,
|
|
523
|
-
backend: 'namzu',
|
|
524
|
-
path: ctx.cwd,
|
|
525
|
-
pid: process.pid,
|
|
526
|
-
}).then((id) => {
|
|
527
|
-
if (!cancelled)
|
|
528
|
-
peerIdRef.current = id;
|
|
529
|
-
});
|
|
530
|
-
return () => {
|
|
531
|
-
cancelled = true;
|
|
532
|
-
};
|
|
533
|
-
}, [phase, ctx.cwd]);
|
|
534
|
-
useEffect(() => {
|
|
535
|
-
stateRef.current = state;
|
|
536
|
-
}, [state]);
|
|
537
|
-
// One-shot update check on launch: namzu (npm) + clawtool (`upgrade --check`).
|
|
490
|
+
// One-shot update check on launch.
|
|
538
491
|
// Best-effort; surfaces a single notice when something newer is out.
|
|
539
492
|
const updateCheckedRef = useRef(false);
|
|
540
493
|
useEffect(() => {
|
|
@@ -548,47 +501,6 @@ export function App({ ctx }) {
|
|
|
548
501
|
pushMessage('system', `⬆ Update available:\n${lines.join('\n')}`);
|
|
549
502
|
});
|
|
550
503
|
}, [phase, ctx.version, pushMessage]);
|
|
551
|
-
useEffect(() => {
|
|
552
|
-
const id = peerIdRef.current;
|
|
553
|
-
if (id)
|
|
554
|
-
void heartbeatPeer(id);
|
|
555
|
-
}, [state]);
|
|
556
|
-
// Inbound BIAM: drain our peer inbox so clawtool / another agent can talk
|
|
557
|
-
// TO namzu. Each message is surfaced; when namzu is free it answers and the
|
|
558
|
-
// reply goes back to the sender (closing the agent↔agent loop).
|
|
559
|
-
useEffect(() => {
|
|
560
|
-
if (phase !== 'ready')
|
|
561
|
-
return;
|
|
562
|
-
let stopped = false;
|
|
563
|
-
const tick = async () => {
|
|
564
|
-
const id = peerIdRef.current;
|
|
565
|
-
if (stopped || !id)
|
|
566
|
-
return;
|
|
567
|
-
const msgs = await drainInbox(id);
|
|
568
|
-
let answered = stateRef.current !== 'idle' || Boolean(abortRef.current);
|
|
569
|
-
for (const m of msgs) {
|
|
570
|
-
const text = m.text?.trim();
|
|
571
|
-
if (!text)
|
|
572
|
-
continue;
|
|
573
|
-
pushMessage('system', `📨 ${m.from_peer}: ${text}`);
|
|
574
|
-
// Answer the first message while free; reply routes back via replyTo.
|
|
575
|
-
if (!answered) {
|
|
576
|
-
answered = true;
|
|
577
|
-
void runTurn(text, undefined, m.from_peer);
|
|
578
|
-
}
|
|
579
|
-
}
|
|
580
|
-
};
|
|
581
|
-
const timer = setInterval(() => void tick(), 2000);
|
|
582
|
-
return () => {
|
|
583
|
-
stopped = true;
|
|
584
|
-
clearInterval(timer);
|
|
585
|
-
};
|
|
586
|
-
}, [phase, pushMessage, runTurn]);
|
|
587
|
-
useEffect(() => () => {
|
|
588
|
-
const id = peerIdRef.current;
|
|
589
|
-
if (id)
|
|
590
|
-
void deregisterPeer(id);
|
|
591
|
-
}, []);
|
|
592
504
|
const handlePickerSubmit = useCallback((selection) => {
|
|
593
505
|
const prefs = {
|
|
594
506
|
version: 2,
|
|
@@ -690,7 +602,7 @@ export function App({ ctx }) {
|
|
|
690
602
|
// Background is left natural — we inherit the terminal's own background
|
|
691
603
|
// and only theme the foreground. Forcing
|
|
692
604
|
// a filled bg left mismatched patches around bordered areas, so we don't.
|
|
693
|
-
return (_jsxs(Box, { flexDirection: "column", children: [phase !== 'ready' ? (_jsx(Banner, { version: ctx.version, session: session, bypass: ctx.skipPermissions === true, cwd: ctx.cwd })) : null, _jsxs(Box, { flexDirection: "column", paddingX: 1, children: [phase === 'trust' ? (_jsx(TrustPrompt, { cwd: ctx.cwd })) : phase === 'resume' ? (_jsx(ResumePicker, { conversations: resumeList, selected: selectedResume })) : phase === 'picker' ? (_jsx(Picker, { detected: detected, currentProvider: currentProvider, onSubmit: handlePickerSubmit, onCancel: handlePickerCancel })) : (_jsxs(_Fragment, { children: [_jsx(TranscriptFrame, { children: _jsx(Transcript, { messages: messages.filter((m) => !m.pending), pending: messages.find((m) => m.pending) ?? null, state: state, expanded: expanded, resetKey: resetKey, header: phase === 'ready' ? (_jsx(Banner, { version: ctx.version, session: session, bypass: ctx.skipPermissions === true, cwd: ctx.cwd })) : undefined }) }), _jsx(LiveActivity, { activeTools: activeTools, thinking: state === 'thinking' && !messages.some((m) => m.pending) }), permission ? (_jsx(PermissionOverlay, { toolCalls: permission.toolCalls })) : (_jsxs(ComposerFrame, { focus: state === 'idle' && phase === 'ready', children: [queued.length > 0 ? (_jsx(Box, { paddingX: 1, children: _jsxs(Text, { color: theme.text.muted, children: ["\u23CE ", queued.length, " message", queued.length > 1 ? 's' : '', " queued \u2014 sending when ready"] }) })) : null, _jsx(Composer, { disabled: phase !== 'ready' || state === 'awaiting-permission', onSubmit: handleSubmit, history: history })] }))] })), _jsx(Box, { paddingTop: 1, children: _jsx(StatusBar, { cwd: ctx.cwd, provider: session?.providerSummary ?? null, model: session?.modelSummary ?? null, state: state, hint: hintForPhase(phase, state), usage: usage,
|
|
605
|
+
return (_jsxs(Box, { flexDirection: "column", children: [phase !== 'ready' ? (_jsx(Banner, { version: ctx.version, session: session, bypass: ctx.skipPermissions === true, cwd: ctx.cwd })) : null, _jsxs(Box, { flexDirection: "column", paddingX: 1, children: [phase === 'trust' ? (_jsx(TrustPrompt, { cwd: ctx.cwd })) : phase === 'resume' ? (_jsx(ResumePicker, { conversations: resumeList, selected: selectedResume })) : phase === 'picker' ? (_jsx(Picker, { detected: detected, currentProvider: currentProvider, onSubmit: handlePickerSubmit, onCancel: handlePickerCancel })) : (_jsxs(_Fragment, { children: [_jsx(TranscriptFrame, { children: _jsx(Transcript, { messages: messages.filter((m) => !m.pending), pending: messages.find((m) => m.pending) ?? null, state: state, expanded: expanded, resetKey: resetKey, header: phase === 'ready' ? (_jsx(Banner, { version: ctx.version, session: session, bypass: ctx.skipPermissions === true, cwd: ctx.cwd })) : undefined }) }), _jsx(LiveActivity, { activeTools: activeTools, thinking: state === 'thinking' && !messages.some((m) => m.pending) }), permission ? (_jsx(PermissionOverlay, { toolCalls: permission.toolCalls })) : (_jsxs(ComposerFrame, { focus: state === 'idle' && phase === 'ready', children: [queued.length > 0 ? (_jsx(Box, { paddingX: 1, children: _jsxs(Text, { color: theme.text.muted, children: ["\u23CE ", queued.length, " message", queued.length > 1 ? 's' : '', " queued \u2014 sending when ready"] }) })) : null, _jsx(Composer, { disabled: phase !== 'ready' || state === 'awaiting-permission', onSubmit: handleSubmit, history: history })] }))] })), _jsx(Box, { paddingTop: 1, children: _jsx(StatusBar, { cwd: ctx.cwd, provider: session?.providerSummary ?? null, model: session?.modelSummary ?? null, state: state, hint: hintForPhase(phase, state), usage: usage, context: context }) })] })] }));
|
|
694
606
|
}
|
|
695
607
|
function Banner({ version, session, bypass, cwd, }) {
|
|
696
608
|
const cols = process.stdout.columns ?? 80;
|
|
@@ -705,27 +617,16 @@ function TranscriptFrame({ children }) {
|
|
|
705
617
|
// Borderless, edge-to-edge — the message glyph gutter provides structure.
|
|
706
618
|
return _jsx(Box, { flexDirection: "column", children: children });
|
|
707
619
|
}
|
|
708
|
-
/** Approximate context window (tokens) per model, for the status gauge. The
|
|
709
|
-
* `[1m]` long-context variants get 1M; everything else defaults to 200k. */
|
|
710
|
-
function contextWindowFor(model) {
|
|
711
|
-
if (!model)
|
|
712
|
-
return 200_000;
|
|
713
|
-
if (model.includes('[1m]') || model.includes('-1m'))
|
|
714
|
-
return 1_000_000;
|
|
715
|
-
return 200_000;
|
|
716
|
-
}
|
|
717
620
|
function ComposerFrame({ focus, children, }) {
|
|
718
621
|
// Input-field look: a rounded rule above and below the composer, no side
|
|
719
622
|
// borders, so the input reads as a field rather than a heavy box.
|
|
720
623
|
return (_jsx(Box, { flexDirection: "column", borderStyle: "round", borderTop: true, borderBottom: true, borderLeft: false, borderRight: false, borderColor: focus ? theme.border.focus : theme.border.default, marginTop: 1, children: children }));
|
|
721
624
|
}
|
|
722
|
-
// Tool call label: the tool name, then its most identifying
|
|
723
|
-
// `Bash(ls -la)`, `Read(file.ts)`. A bare tool name in a transcript
|
|
724
|
-
// forty calls says nothing about which one this was.
|
|
725
|
-
// The `clawtool_` prefix is stripped and the name title-cased.
|
|
625
|
+
// Tool call label: the tool name title-cased, then its most identifying
|
|
626
|
+
// argument — `Bash(ls -la)`, `Read(file.ts)`. A bare tool name in a transcript
|
|
627
|
+
// of forty calls says nothing about which one this was.
|
|
726
628
|
function formatToolCall(toolName, summary) {
|
|
727
|
-
const
|
|
728
|
-
const display = base.length > 0 ? base[0]?.toUpperCase() + base.slice(1) : base;
|
|
629
|
+
const display = toolName.length > 0 ? toolName[0]?.toUpperCase() + toolName.slice(1) : toolName;
|
|
729
630
|
return summary.length > 0 ? `${display}(${summary})` : display;
|
|
730
631
|
}
|
|
731
632
|
function hintForPhase(phase, state) {
|