@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.
Files changed (197) hide show
  1. package/dist/__tests__/permission-rules-reach-the-turn.test.d.ts +31 -0
  2. package/dist/__tests__/permission-rules-reach-the-turn.test.d.ts.map +1 -0
  3. package/dist/__tests__/permission-rules-reach-the-turn.test.js +132 -0
  4. package/dist/__tests__/permission-rules-reach-the-turn.test.js.map +1 -0
  5. package/dist/cli.d.ts.map +1 -1
  6. package/dist/cli.js +16 -3
  7. package/dist/cli.js.map +1 -1
  8. package/dist/cli.test.js +7 -1
  9. package/dist/cli.test.js.map +1 -1
  10. package/dist/commands/__tests__/run-flags.test.js +0 -1
  11. package/dist/commands/__tests__/run-flags.test.js.map +1 -1
  12. package/dist/commands/__tests__/run-stream-flags.test.js +0 -1
  13. package/dist/commands/__tests__/run-stream-flags.test.js.map +1 -1
  14. package/dist/commands/run-stream.d.ts +3 -3
  15. package/dist/commands/run-stream.js +3 -3
  16. package/dist/commands/run.d.ts.map +1 -1
  17. package/dist/commands/run.js +4 -0
  18. package/dist/commands/run.js.map +1 -1
  19. package/dist/commands/stubs.d.ts +10 -0
  20. package/dist/commands/stubs.d.ts.map +1 -1
  21. package/dist/commands/stubs.js +12 -2
  22. package/dist/commands/stubs.js.map +1 -1
  23. package/dist/config/load.d.ts.map +1 -1
  24. package/dist/config/load.js +20 -4
  25. package/dist/config/load.js.map +1 -1
  26. package/dist/config/schema.d.ts +0 -12
  27. package/dist/config/schema.d.ts.map +1 -1
  28. package/dist/config/schema.js.map +1 -1
  29. package/dist/doctor/checks/credentials.d.ts +20 -0
  30. package/dist/doctor/checks/credentials.d.ts.map +1 -0
  31. package/dist/doctor/checks/credentials.js +58 -0
  32. package/dist/doctor/checks/credentials.js.map +1 -0
  33. package/dist/doctor/checks/credentials.test.d.ts +10 -0
  34. package/dist/doctor/checks/credentials.test.d.ts.map +1 -0
  35. package/dist/doctor/checks/credentials.test.js +47 -0
  36. package/dist/doctor/checks/credentials.test.js.map +1 -0
  37. package/dist/doctor/checks/index.d.ts +2 -1
  38. package/dist/doctor/checks/index.d.ts.map +1 -1
  39. package/dist/doctor/checks/index.js +3 -1
  40. package/dist/doctor/checks/index.js.map +1 -1
  41. package/dist/index.d.ts +1 -1
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +1 -1
  44. package/dist/index.js.map +1 -1
  45. package/dist/integrations/providers/discover.d.ts +3 -8
  46. package/dist/integrations/providers/discover.d.ts.map +1 -1
  47. package/dist/integrations/providers/discover.js +2 -12
  48. package/dist/integrations/providers/discover.js.map +1 -1
  49. package/dist/integrations/providers/discover.test.js +1 -28
  50. package/dist/integrations/providers/discover.test.js.map +1 -1
  51. package/dist/integrations/providers/index.d.ts +0 -1
  52. package/dist/integrations/providers/index.d.ts.map +1 -1
  53. package/dist/integrations/providers/index.js +0 -1
  54. package/dist/integrations/providers/index.js.map +1 -1
  55. package/dist/integrations/providers/oauth.d.ts +1 -1
  56. package/dist/integrations/providers/oauth.js +1 -1
  57. package/dist/integrations/providers/preferences.d.ts +2 -2
  58. package/dist/integrations/providers/preferences.js +2 -2
  59. package/dist/integrations/sessions/store.js +1 -1
  60. package/dist/integrations/sessions/store.js.map +1 -1
  61. package/dist/integrations/subagents/__tests__/delegation-trace.test.d.ts +2 -0
  62. package/dist/integrations/subagents/__tests__/delegation-trace.test.d.ts.map +1 -0
  63. package/dist/integrations/subagents/__tests__/delegation-trace.test.js +69 -0
  64. package/dist/integrations/subagents/__tests__/delegation-trace.test.js.map +1 -0
  65. package/dist/integrations/subagents/runtime.d.ts.map +1 -1
  66. package/dist/integrations/subagents/runtime.js +12 -2
  67. package/dist/integrations/subagents/runtime.js.map +1 -1
  68. package/dist/integrations/updates.d.ts +4 -12
  69. package/dist/integrations/updates.d.ts.map +1 -1
  70. package/dist/integrations/updates.js +6 -53
  71. package/dist/integrations/updates.js.map +1 -1
  72. package/dist/tui/App.d.ts.map +1 -1
  73. package/dist/tui/App.js +42 -141
  74. package/dist/tui/App.js.map +1 -1
  75. package/dist/tui/Picker.d.ts +4 -4
  76. package/dist/tui/Picker.d.ts.map +1 -1
  77. package/dist/tui/Picker.js +6 -8
  78. package/dist/tui/Picker.js.map +1 -1
  79. package/dist/tui/StatusBar.d.ts +39 -3
  80. package/dist/tui/StatusBar.d.ts.map +1 -1
  81. package/dist/tui/StatusBar.js +33 -9
  82. package/dist/tui/StatusBar.js.map +1 -1
  83. package/dist/tui/__tests__/context-gauge.test.d.ts +2 -0
  84. package/dist/tui/__tests__/context-gauge.test.d.ts.map +1 -0
  85. package/dist/tui/__tests__/context-gauge.test.js +83 -0
  86. package/dist/tui/__tests__/context-gauge.test.js.map +1 -0
  87. package/dist/tui/__tests__/deferred-tool-discovery.test.d.ts +24 -0
  88. package/dist/tui/__tests__/deferred-tool-discovery.test.d.ts.map +1 -0
  89. package/dist/tui/__tests__/deferred-tool-discovery.test.js +111 -0
  90. package/dist/tui/__tests__/deferred-tool-discovery.test.js.map +1 -0
  91. package/dist/tui/__tests__/to-agent-event.test.js +181 -0
  92. package/dist/tui/__tests__/to-agent-event.test.js.map +1 -1
  93. package/dist/tui/__tests__/working-directory.test.js +0 -6
  94. package/dist/tui/__tests__/working-directory.test.js.map +1 -1
  95. package/dist/tui/agent.d.ts +38 -2
  96. package/dist/tui/agent.d.ts.map +1 -1
  97. package/dist/tui/agent.js +110 -31
  98. package/dist/tui/agent.js.map +1 -1
  99. package/dist/tui/slashCommands.d.ts +0 -6
  100. package/dist/tui/slashCommands.d.ts.map +1 -1
  101. package/dist/tui/slashCommands.js +1 -21
  102. package/dist/tui/slashCommands.js.map +1 -1
  103. package/dist/tui/types.d.ts +12 -0
  104. package/dist/tui/types.d.ts.map +1 -1
  105. package/package.json +5 -6
  106. package/dist/commands/tools.d.ts +0 -16
  107. package/dist/commands/tools.d.ts.map +0 -1
  108. package/dist/commands/tools.js +0 -161
  109. package/dist/commands/tools.js.map +0 -1
  110. package/dist/integrations/clawtool/agents.d.ts +0 -31
  111. package/dist/integrations/clawtool/agents.d.ts.map +0 -1
  112. package/dist/integrations/clawtool/agents.js +0 -30
  113. package/dist/integrations/clawtool/agents.js.map +0 -1
  114. package/dist/integrations/clawtool/agents.test.d.ts +0 -2
  115. package/dist/integrations/clawtool/agents.test.d.ts.map +0 -1
  116. package/dist/integrations/clawtool/agents.test.js +0 -79
  117. package/dist/integrations/clawtool/agents.test.js.map +0 -1
  118. package/dist/integrations/clawtool/auth.d.ts +0 -26
  119. package/dist/integrations/clawtool/auth.d.ts.map +0 -1
  120. package/dist/integrations/clawtool/auth.js +0 -56
  121. package/dist/integrations/clawtool/auth.js.map +0 -1
  122. package/dist/integrations/clawtool/auth.test.d.ts +0 -2
  123. package/dist/integrations/clawtool/auth.test.d.ts.map +0 -1
  124. package/dist/integrations/clawtool/auth.test.js +0 -40
  125. package/dist/integrations/clawtool/auth.test.js.map +0 -1
  126. package/dist/integrations/clawtool/binary.d.ts +0 -25
  127. package/dist/integrations/clawtool/binary.d.ts.map +0 -1
  128. package/dist/integrations/clawtool/binary.js +0 -50
  129. package/dist/integrations/clawtool/binary.js.map +0 -1
  130. package/dist/integrations/clawtool/binary.test.d.ts +0 -2
  131. package/dist/integrations/clawtool/binary.test.d.ts.map +0 -1
  132. package/dist/integrations/clawtool/binary.test.js +0 -50
  133. package/dist/integrations/clawtool/binary.test.js.map +0 -1
  134. package/dist/integrations/clawtool/daemon.d.ts +0 -37
  135. package/dist/integrations/clawtool/daemon.d.ts.map +0 -1
  136. package/dist/integrations/clawtool/daemon.js +0 -109
  137. package/dist/integrations/clawtool/daemon.js.map +0 -1
  138. package/dist/integrations/clawtool/daemon.test.d.ts +0 -11
  139. package/dist/integrations/clawtool/daemon.test.d.ts.map +0 -1
  140. package/dist/integrations/clawtool/daemon.test.js +0 -118
  141. package/dist/integrations/clawtool/daemon.test.js.map +0 -1
  142. package/dist/integrations/clawtool/dispatch.d.ts +0 -33
  143. package/dist/integrations/clawtool/dispatch.d.ts.map +0 -1
  144. package/dist/integrations/clawtool/dispatch.js +0 -155
  145. package/dist/integrations/clawtool/dispatch.js.map +0 -1
  146. package/dist/integrations/clawtool/dispatch.test.d.ts +0 -2
  147. package/dist/integrations/clawtool/dispatch.test.d.ts.map +0 -1
  148. package/dist/integrations/clawtool/dispatch.test.js +0 -138
  149. package/dist/integrations/clawtool/dispatch.test.js.map +0 -1
  150. package/dist/integrations/clawtool/index.d.ts +0 -11
  151. package/dist/integrations/clawtool/index.d.ts.map +0 -1
  152. package/dist/integrations/clawtool/index.js +0 -10
  153. package/dist/integrations/clawtool/index.js.map +0 -1
  154. package/dist/integrations/clawtool/mcp.d.ts +0 -51
  155. package/dist/integrations/clawtool/mcp.d.ts.map +0 -1
  156. package/dist/integrations/clawtool/mcp.js +0 -174
  157. package/dist/integrations/clawtool/mcp.js.map +0 -1
  158. package/dist/integrations/clawtool/mcp.test.d.ts +0 -2
  159. package/dist/integrations/clawtool/mcp.test.d.ts.map +0 -1
  160. package/dist/integrations/clawtool/mcp.test.js +0 -126
  161. package/dist/integrations/clawtool/mcp.test.js.map +0 -1
  162. package/dist/integrations/clawtool/paths.d.ts +0 -8
  163. package/dist/integrations/clawtool/paths.d.ts.map +0 -1
  164. package/dist/integrations/clawtool/paths.js +0 -19
  165. package/dist/integrations/clawtool/paths.js.map +0 -1
  166. package/dist/integrations/clawtool/peers.d.ts +0 -67
  167. package/dist/integrations/clawtool/peers.d.ts.map +0 -1
  168. package/dist/integrations/clawtool/peers.js +0 -150
  169. package/dist/integrations/clawtool/peers.js.map +0 -1
  170. package/dist/integrations/clawtool/plugin.d.ts +0 -42
  171. package/dist/integrations/clawtool/plugin.d.ts.map +0 -1
  172. package/dist/integrations/clawtool/plugin.js +0 -38
  173. package/dist/integrations/clawtool/plugin.js.map +0 -1
  174. package/dist/integrations/clawtool/state.d.ts +0 -11
  175. package/dist/integrations/clawtool/state.d.ts.map +0 -1
  176. package/dist/integrations/clawtool/state.js +0 -41
  177. package/dist/integrations/clawtool/state.js.map +0 -1
  178. package/dist/integrations/clawtool/state.test.d.ts +0 -2
  179. package/dist/integrations/clawtool/state.test.d.ts.map +0 -1
  180. package/dist/integrations/clawtool/state.test.js +0 -38
  181. package/dist/integrations/clawtool/state.test.js.map +0 -1
  182. package/dist/integrations/clawtool/tooling.d.ts +0 -52
  183. package/dist/integrations/clawtool/tooling.d.ts.map +0 -1
  184. package/dist/integrations/clawtool/tooling.js +0 -91
  185. package/dist/integrations/clawtool/tooling.js.map +0 -1
  186. package/dist/integrations/clawtool/tooling.test.d.ts +0 -2
  187. package/dist/integrations/clawtool/tooling.test.d.ts.map +0 -1
  188. package/dist/integrations/clawtool/tooling.test.js +0 -58
  189. package/dist/integrations/clawtool/tooling.test.js.map +0 -1
  190. package/dist/integrations/clawtool/types.d.ts +0 -41
  191. package/dist/integrations/clawtool/types.d.ts.map +0 -1
  192. package/dist/integrations/clawtool/types.js +0 -9
  193. package/dist/integrations/clawtool/types.js.map +0 -1
  194. package/dist/integrations/providers/secrets.d.ts +0 -37
  195. package/dist/integrations/providers/secrets.d.ts.map +0 -1
  196. package/dist/integrations/providers/secrets.js +0 -69
  197. 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,CAqI1B"}
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({ agentId, prompt, workingDirectory: opts.cwd });
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 checks for namzu (npm) and clawtool (`clawtool upgrade --check`),
3
- * surfaced in the TUI so the user knows when a newer version is out. Both are
4
- * best-effort with short timeouts: offline / unpublished / no-clawtool just
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;;;;;GAKG;AAMH,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;AAKD,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;AAQD;;;;;GAKG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CA+BtE;AAED,+EAA+E;AAC/E,wBAAsB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,UAAU,EAAE,CAAC,CAMvF"}
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 checks for namzu (npm) and clawtool (`clawtool upgrade --check`),
3
- * surfaced in the TUI so the user knows when a newer version is out. Both are
4
- * best-effort with short timeouts: offline / unpublished / no-clawtool just
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
- function run(bin, args) {
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 [namzu, clawtool] = await Promise.all([
94
- checkNamzuUpdate(namzuVersion),
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":"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"}
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"}
@@ -1 +1 @@
1
- {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/tui/App.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA6DH,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,2CAi1BpC"}
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, { scope, cwd: ctx.cwd });
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${s.deferredToolCount > 0 ? ` (+${s.deferredToolCount} on demand)` : ''}`);
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, replyTo) => {
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
- // (shared with the daemon-attach poller) renders each one in order.
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, doListAgents, doResume, doSendPeer, exit, pushMessage, runTurn, slashCtx, state]);
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
- // BIAM presence (best-effort, no-op without clawtool): register once ready
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, contextWindow: contextWindowFor(session?.modelSummary ?? null) }) })] })] }));
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 argument —
723
- // `Bash(ls -la)`, `Read(file.ts)`. A bare tool name in a transcript of
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 base = toolName.replace(/^clawtool_/, '');
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) {