@namzu/cli 0.5.1 → 0.7.0
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__/resume.test.d.ts +15 -0
- package/dist/commands/__tests__/resume.test.d.ts.map +1 -0
- package/dist/commands/__tests__/resume.test.js +116 -0
- package/dist/commands/__tests__/resume.test.js.map +1 -0
- package/dist/commands/__tests__/run-flags.test.d.ts +11 -0
- package/dist/commands/__tests__/run-flags.test.d.ts.map +1 -0
- package/dist/commands/__tests__/run-flags.test.js +189 -0
- package/dist/commands/__tests__/run-flags.test.js.map +1 -0
- package/dist/commands/__tests__/run-stream-flags.test.js +160 -11
- package/dist/commands/__tests__/run-stream-flags.test.js.map +1 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/resume.d.ts +60 -0
- package/dist/commands/resume.d.ts.map +1 -0
- package/dist/commands/resume.js +107 -0
- package/dist/commands/resume.js.map +1 -0
- package/dist/commands/run-flags.d.ts +76 -0
- package/dist/commands/run-flags.d.ts.map +1 -0
- package/dist/commands/run-flags.js +163 -0
- package/dist/commands/run-flags.js.map +1 -0
- package/dist/commands/run-stream.d.ts +3 -39
- package/dist/commands/run-stream.d.ts.map +1 -1
- package/dist/commands/run-stream.js +74 -101
- package/dist/commands/run-stream.js.map +1 -1
- package/dist/commands/run.d.ts +25 -0
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +189 -16
- 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 +9 -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/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/permissions/__tests__/mode.test.d.ts +10 -0
- package/dist/permissions/__tests__/mode.test.d.ts.map +1 -0
- package/dist/permissions/__tests__/mode.test.js +115 -0
- package/dist/permissions/__tests__/mode.test.js.map +1 -0
- package/dist/permissions/__tests__/rules.test.d.ts +10 -0
- package/dist/permissions/__tests__/rules.test.d.ts.map +1 -0
- package/dist/permissions/__tests__/rules.test.js +196 -0
- package/dist/permissions/__tests__/rules.test.js.map +1 -0
- package/dist/permissions/mode.d.ts +64 -0
- package/dist/permissions/mode.d.ts.map +1 -0
- package/dist/permissions/mode.js +32 -0
- package/dist/permissions/mode.js.map +1 -0
- package/dist/permissions/rules.d.ts +105 -0
- package/dist/permissions/rules.d.ts.map +1 -0
- package/dist/permissions/rules.js +163 -0
- package/dist/permissions/rules.js.map +1 -0
- package/dist/tui/App.d.ts.map +1 -1
- package/dist/tui/App.js +29 -133
- 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/__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 +88 -0
- package/dist/tui/__tests__/to-agent-event.test.js.map +1 -1
- package/dist/tui/__tests__/working-directory.test.d.ts +13 -0
- package/dist/tui/__tests__/working-directory.test.d.ts.map +1 -0
- package/dist/tui/__tests__/working-directory.test.js +109 -0
- package/dist/tui/__tests__/working-directory.test.js.map +1 -0
- package/dist/tui/agent.d.ts +46 -5
- package/dist/tui/agent.d.ts.map +1 -1
- package/dist/tui/agent.js +140 -43
- 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 +4 -5
- 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
package/dist/commands/tools.js
DELETED
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `namzu tools` — real implementation, replacing the M0 stub.
|
|
3
|
-
*
|
|
4
|
-
* Subcommands:
|
|
5
|
-
* - `ls` List tools clawtool exposes (auto-spawns daemon).
|
|
6
|
-
* - `run <name>` Invoke a tool by name with JSON arguments.
|
|
7
|
-
* - `sync-types` Generate local TS stubs via `clawtool tools export-typescript`.
|
|
8
|
-
*
|
|
9
|
-
* The command runs in passThrough mode — its own Commander instance parses
|
|
10
|
-
* the subcommand args. This keeps the top-level shell free of vendor-tool
|
|
11
|
-
* coupling and lets us expand the surface later (e.g. `tools search`)
|
|
12
|
-
* without touching the outer registry.
|
|
13
|
-
*/
|
|
14
|
-
import { execFileSync } from 'node:child_process';
|
|
15
|
-
import { Command, CommanderError } from 'commander';
|
|
16
|
-
import { createClawtoolPlugin, findBinary, } from '../integrations/clawtool/index.js';
|
|
17
|
-
import { isExcludedClawtoolTool } from '../integrations/clawtool/tooling.js';
|
|
18
|
-
let cachedPlugin = null;
|
|
19
|
-
async function getPlugin(ctx) {
|
|
20
|
-
if (cachedPlugin)
|
|
21
|
-
return cachedPlugin;
|
|
22
|
-
const cfg = ctx.config.clawtool ?? {};
|
|
23
|
-
const opts = {
|
|
24
|
-
binary: cfg.binary,
|
|
25
|
-
endpoint: cfg.endpoint,
|
|
26
|
-
token: cfg.token,
|
|
27
|
-
autoStart: cfg.autoStart,
|
|
28
|
-
clientInfo: { name: 'namzu-cli', version: '0.0.0' },
|
|
29
|
-
};
|
|
30
|
-
cachedPlugin = await createClawtoolPlugin(opts);
|
|
31
|
-
return cachedPlugin;
|
|
32
|
-
}
|
|
33
|
-
async function runLs(ctx) {
|
|
34
|
-
const plugin = await getPlugin(ctx);
|
|
35
|
-
// Mirror what the agent actually gets: drop the tools namzu excludes from
|
|
36
|
-
// the bridged catalog (the vendor tool bridge excludes its own
|
|
37
|
-
// `tools ls` doesn't advertise tools the model can't call.
|
|
38
|
-
const tools = plugin.tools.filter((t) => !isExcludedClawtoolTool(t.name));
|
|
39
|
-
ctx.formatter.print({
|
|
40
|
-
source: 'clawtool',
|
|
41
|
-
endpoint: plugin.endpoint.baseUrl,
|
|
42
|
-
count: tools.length,
|
|
43
|
-
tools: tools.map((t) => ({
|
|
44
|
-
name: t.name,
|
|
45
|
-
source: t.source,
|
|
46
|
-
description: t.description,
|
|
47
|
-
})),
|
|
48
|
-
});
|
|
49
|
-
return 0;
|
|
50
|
-
}
|
|
51
|
-
async function runRun(ctx, name, inputJson) {
|
|
52
|
-
let args;
|
|
53
|
-
try {
|
|
54
|
-
args = JSON.parse(inputJson);
|
|
55
|
-
if (typeof args !== 'object' || args === null || Array.isArray(args)) {
|
|
56
|
-
throw new Error('--input must be a JSON object');
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
catch (err) {
|
|
60
|
-
ctx.formatter.error({
|
|
61
|
-
message: `invalid --input JSON: ${err instanceof Error ? err.message : String(err)}`,
|
|
62
|
-
});
|
|
63
|
-
return 64;
|
|
64
|
-
}
|
|
65
|
-
const plugin = await getPlugin(ctx);
|
|
66
|
-
const tool = plugin.tools.find((t) => t.name === name);
|
|
67
|
-
if (!tool) {
|
|
68
|
-
ctx.formatter.error({
|
|
69
|
-
message: `no tool named "${name}"; run \`namzu tools ls\` for the catalog`,
|
|
70
|
-
});
|
|
71
|
-
return 64;
|
|
72
|
-
}
|
|
73
|
-
const result = await tool.call(args);
|
|
74
|
-
ctx.formatter.print({
|
|
75
|
-
tool: name,
|
|
76
|
-
isError: Boolean(result.isError),
|
|
77
|
-
content: result.content,
|
|
78
|
-
});
|
|
79
|
-
return result.isError ? 1 : 0;
|
|
80
|
-
}
|
|
81
|
-
async function runSyncTypes(ctx, output) {
|
|
82
|
-
const cfg = ctx.config.clawtool ?? {};
|
|
83
|
-
let binary;
|
|
84
|
-
try {
|
|
85
|
-
binary = findBinary({ override: cfg.binary });
|
|
86
|
-
}
|
|
87
|
-
catch (err) {
|
|
88
|
-
ctx.formatter.error({
|
|
89
|
-
message: err instanceof Error ? err.message : String(err),
|
|
90
|
-
});
|
|
91
|
-
return 70;
|
|
92
|
-
}
|
|
93
|
-
try {
|
|
94
|
-
execFileSync(binary, ['tools', 'export-typescript', '--output', output], {
|
|
95
|
-
stdio: 'inherit',
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
catch (err) {
|
|
99
|
-
ctx.formatter.error({
|
|
100
|
-
message: `clawtool export-typescript failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
101
|
-
});
|
|
102
|
-
return 70;
|
|
103
|
-
}
|
|
104
|
-
ctx.formatter.info(`clawtool tool types exported to ${output}`);
|
|
105
|
-
return 0;
|
|
106
|
-
}
|
|
107
|
-
export const toolsCommand = {
|
|
108
|
-
name: 'tools',
|
|
109
|
-
description: 'Inspect and run tools via the clawtool tool layer',
|
|
110
|
-
passThrough: true,
|
|
111
|
-
async handler({ ctx, rawArgs }) {
|
|
112
|
-
let exitCode = 0;
|
|
113
|
-
const program = new Command('tools')
|
|
114
|
-
.description('Inspect and run tools via the clawtool tool layer')
|
|
115
|
-
.exitOverride()
|
|
116
|
-
.helpOption('-h, --help', 'Show this help');
|
|
117
|
-
program
|
|
118
|
-
.command('ls')
|
|
119
|
-
.description('List all tools clawtool exposes (auto-spawns the daemon)')
|
|
120
|
-
.action(async () => {
|
|
121
|
-
exitCode = await runLs(ctx);
|
|
122
|
-
});
|
|
123
|
-
program
|
|
124
|
-
.command('run <name>')
|
|
125
|
-
.description('Invoke a tool by name with JSON arguments')
|
|
126
|
-
.option('--input <json>', 'JSON arguments object', '{}')
|
|
127
|
-
.action(async (name, opts) => {
|
|
128
|
-
exitCode = await runRun(ctx, name, opts.input);
|
|
129
|
-
});
|
|
130
|
-
program
|
|
131
|
-
.command('sync-types')
|
|
132
|
-
.description('Generate TS stubs from `clawtool tools export-typescript`')
|
|
133
|
-
.option('--output <dir>', 'Output directory', './.namzu/clawtool-types')
|
|
134
|
-
.action(async (opts) => {
|
|
135
|
-
exitCode = await runSyncTypes(ctx, opts.output);
|
|
136
|
-
});
|
|
137
|
-
if (rawArgs.length === 0) {
|
|
138
|
-
program.outputHelp();
|
|
139
|
-
return 0;
|
|
140
|
-
}
|
|
141
|
-
try {
|
|
142
|
-
await program.parseAsync(rawArgs, { from: 'user' });
|
|
143
|
-
return exitCode;
|
|
144
|
-
}
|
|
145
|
-
catch (err) {
|
|
146
|
-
if (err instanceof CommanderError) {
|
|
147
|
-
if (err.code === 'commander.help' ||
|
|
148
|
-
err.code === 'commander.helpDisplayed' ||
|
|
149
|
-
err.code === 'commander.version') {
|
|
150
|
-
return 0;
|
|
151
|
-
}
|
|
152
|
-
return 64;
|
|
153
|
-
}
|
|
154
|
-
ctx.formatter.error({
|
|
155
|
-
message: err instanceof Error ? err.message : String(err),
|
|
156
|
-
});
|
|
157
|
-
return 70;
|
|
158
|
-
}
|
|
159
|
-
},
|
|
160
|
-
};
|
|
161
|
-
//# sourceMappingURL=tools.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/commands/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Client for clawtool's `GET /v1/agents` — the authoritative registry of
|
|
3
|
-
* which AI-coding-agent instances clawtool can dispatch to on this host.
|
|
4
|
-
*
|
|
5
|
-
* Namzu does NOT reimplement credential detection, OAuth scanning, or
|
|
6
|
-
* bridge wiring. Clawtool already owns all of that. The TUI just renders
|
|
7
|
-
* what this endpoint returns.
|
|
8
|
-
*/
|
|
9
|
-
import { type EnsureDaemonOptions } from './daemon.js';
|
|
10
|
-
export interface Agent {
|
|
11
|
-
readonly instance: string;
|
|
12
|
-
readonly family: string;
|
|
13
|
-
readonly bridge?: string;
|
|
14
|
-
/** `"callable" | "bridge-missing" | "binary-missing" | "disabled"` per clawtool's supervisor. */
|
|
15
|
-
readonly status: string;
|
|
16
|
-
readonly callable: boolean;
|
|
17
|
-
readonly auth_scope?: string;
|
|
18
|
-
readonly tags?: readonly string[];
|
|
19
|
-
readonly failover_to?: readonly string[];
|
|
20
|
-
readonly sandbox?: string;
|
|
21
|
-
}
|
|
22
|
-
export interface ListAgentsOptions extends EnsureDaemonOptions {
|
|
23
|
-
/** When true, server-side filter to `status=callable`. */
|
|
24
|
-
readonly callableOnly?: boolean;
|
|
25
|
-
}
|
|
26
|
-
export interface AgentsResponse {
|
|
27
|
-
readonly agents: readonly Agent[];
|
|
28
|
-
readonly count: number;
|
|
29
|
-
}
|
|
30
|
-
export declare function listAgents(opts?: ListAgentsOptions): Promise<readonly Agent[]>;
|
|
31
|
-
//# sourceMappingURL=agents.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../../src/integrations/clawtool/agents.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,mBAAmB,EAAgB,MAAM,aAAa,CAAA;AAEpE,MAAM,WAAW,KAAK;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,iGAAiG;IACjG,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACjC,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACxC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,iBAAkB,SAAQ,mBAAmB;IAC7D,0DAA0D;IAC1D,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAC/B;AAED,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAA;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACtB;AAED,wBAAsB,UAAU,CAAC,IAAI,GAAE,iBAAsB,GAAG,OAAO,CAAC,SAAS,KAAK,EAAE,CAAC,CAoBxF"}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Client for clawtool's `GET /v1/agents` — the authoritative registry of
|
|
3
|
-
* which AI-coding-agent instances clawtool can dispatch to on this host.
|
|
4
|
-
*
|
|
5
|
-
* Namzu does NOT reimplement credential detection, OAuth scanning, or
|
|
6
|
-
* bridge wiring. Clawtool already owns all of that. The TUI just renders
|
|
7
|
-
* what this endpoint returns.
|
|
8
|
-
*/
|
|
9
|
-
import { ensureDaemon } from './daemon.js';
|
|
10
|
-
export async function listAgents(opts = {}) {
|
|
11
|
-
const endpoint = await ensureDaemon(opts);
|
|
12
|
-
const fetchFn = opts.fetch ?? globalThis.fetch;
|
|
13
|
-
const url = new URL('/v1/agents', endpoint.baseUrl);
|
|
14
|
-
if (opts.callableOnly)
|
|
15
|
-
url.searchParams.set('status', 'callable');
|
|
16
|
-
const headers = {};
|
|
17
|
-
if (endpoint.token.length > 0) {
|
|
18
|
-
headers.Authorization = `Bearer ${endpoint.token}`;
|
|
19
|
-
}
|
|
20
|
-
const res = await fetchFn(url.toString(), { method: 'GET', headers });
|
|
21
|
-
if (!res.ok) {
|
|
22
|
-
throw new Error(`clawtool GET /v1/agents failed: HTTP ${res.status}`);
|
|
23
|
-
}
|
|
24
|
-
const data = (await res.json());
|
|
25
|
-
if (!data || !Array.isArray(data.agents)) {
|
|
26
|
-
throw new Error('clawtool /v1/agents returned an unexpected shape');
|
|
27
|
-
}
|
|
28
|
-
return data.agents;
|
|
29
|
-
}
|
|
30
|
-
//# sourceMappingURL=agents.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../../../src/integrations/clawtool/agents.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAA4B,YAAY,EAAE,MAAM,aAAa,CAAA;AAyBpE,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAA0B,EAAE;IAC5D,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAA;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAA;IAC9C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,YAAY,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;IACnD,IAAI,IAAI,CAAC,YAAY;QAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;IAEjE,MAAM,OAAO,GAA2B,EAAE,CAAA;IAC1C,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,aAAa,GAAG,UAAU,QAAQ,CAAC,KAAK,EAAE,CAAA;IACnD,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA;IACrE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,wCAAwC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAA;IACtE,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA4B,CAAA;IAC1D,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAA;IACpE,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAA;AACnB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agents.test.d.ts","sourceRoot":"","sources":["../../../src/integrations/clawtool/agents.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
-
import { listAgents } from './agents.js';
|
|
3
|
-
function makeAgentsResponse(agents) {
|
|
4
|
-
return new Response(JSON.stringify({ agents, count: agents.length }), {
|
|
5
|
-
status: 200,
|
|
6
|
-
headers: { 'content-type': 'application/json' },
|
|
7
|
-
});
|
|
8
|
-
}
|
|
9
|
-
describe('listAgents', () => {
|
|
10
|
-
it('hits /v1/agents and returns the agents array', async () => {
|
|
11
|
-
const fetchMock = vi.fn().mockResolvedValue(makeAgentsResponse([
|
|
12
|
-
{ instance: 'claude', family: 'claude', status: 'callable', callable: true },
|
|
13
|
-
{
|
|
14
|
-
instance: 'codex',
|
|
15
|
-
family: 'codex',
|
|
16
|
-
bridge: 'codex-bridge',
|
|
17
|
-
status: 'callable',
|
|
18
|
-
callable: true,
|
|
19
|
-
},
|
|
20
|
-
]));
|
|
21
|
-
const agents = await listAgents({
|
|
22
|
-
endpoint: 'http://localhost:9999',
|
|
23
|
-
token: 'tok',
|
|
24
|
-
fetch: fetchMock,
|
|
25
|
-
});
|
|
26
|
-
expect(agents.length).toBe(2);
|
|
27
|
-
expect(agents[0]?.instance).toBe('claude');
|
|
28
|
-
// Without callableOnly the URL has no query string.
|
|
29
|
-
const url = fetchMock.mock.calls[0]?.[0];
|
|
30
|
-
expect(url).toBe('http://localhost:9999/v1/agents');
|
|
31
|
-
});
|
|
32
|
-
it('passes ?status=callable when callableOnly is set', async () => {
|
|
33
|
-
const fetchMock = vi.fn().mockResolvedValue(makeAgentsResponse([]));
|
|
34
|
-
await listAgents({
|
|
35
|
-
endpoint: 'http://localhost:9999',
|
|
36
|
-
token: 'tok',
|
|
37
|
-
fetch: fetchMock,
|
|
38
|
-
callableOnly: true,
|
|
39
|
-
});
|
|
40
|
-
const url = fetchMock.mock.calls[0]?.[0];
|
|
41
|
-
expect(url).toBe('http://localhost:9999/v1/agents?status=callable');
|
|
42
|
-
});
|
|
43
|
-
it('includes the Bearer header when a token is provided', async () => {
|
|
44
|
-
const fetchMock = vi.fn().mockResolvedValue(makeAgentsResponse([]));
|
|
45
|
-
await listAgents({
|
|
46
|
-
endpoint: 'http://localhost:9999',
|
|
47
|
-
token: 'tok-abc',
|
|
48
|
-
fetch: fetchMock,
|
|
49
|
-
});
|
|
50
|
-
const headers = fetchMock.mock.calls[0]?.[1]?.headers;
|
|
51
|
-
expect(headers.Authorization).toBe('Bearer tok-abc');
|
|
52
|
-
});
|
|
53
|
-
it('omits the Bearer header when the token is empty (no-auth daemon)', async () => {
|
|
54
|
-
const fetchMock = vi.fn().mockResolvedValue(makeAgentsResponse([]));
|
|
55
|
-
await listAgents({
|
|
56
|
-
endpoint: 'http://localhost:9999',
|
|
57
|
-
token: '',
|
|
58
|
-
fetch: fetchMock,
|
|
59
|
-
});
|
|
60
|
-
const headers = fetchMock.mock.calls[0]?.[1]?.headers;
|
|
61
|
-
expect(headers.Authorization).toBeUndefined();
|
|
62
|
-
});
|
|
63
|
-
it('throws when the response is non-2xx', async () => {
|
|
64
|
-
const fetchMock = vi.fn().mockResolvedValue(new Response('', { status: 500 }));
|
|
65
|
-
await expect(listAgents({
|
|
66
|
-
endpoint: 'http://localhost:9999',
|
|
67
|
-
token: '',
|
|
68
|
-
fetch: fetchMock,
|
|
69
|
-
})).rejects.toThrow(/HTTP 500/);
|
|
70
|
-
});
|
|
71
|
-
it('throws when the response body shape is unexpected', async () => {
|
|
72
|
-
const fetchMock = vi.fn().mockResolvedValue(new Response(JSON.stringify({ not: 'agents' }), {
|
|
73
|
-
status: 200,
|
|
74
|
-
headers: { 'content-type': 'application/json' },
|
|
75
|
-
}));
|
|
76
|
-
await expect(listAgents({ endpoint: 'http://localhost:9999', token: '', fetch: fetchMock })).rejects.toThrow(/unexpected shape/);
|
|
77
|
-
});
|
|
78
|
-
});
|
|
79
|
-
//# sourceMappingURL=agents.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agents.test.js","sourceRoot":"","sources":["../../../src/integrations/clawtool/agents.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Read and trim the bearer token clawtool writes for HTTP auth.
|
|
3
|
-
*
|
|
4
|
-
* Token format: 64 hex characters (32 bytes of `crypto/rand`), newline-
|
|
5
|
-
* terminated, mode 0600 — generated by `internal/server/http.go:362-366`.
|
|
6
|
-
* `strings.TrimSpace` is applied server-side at parse time, so leading /
|
|
7
|
-
* trailing whitespace is tolerated. We mirror that here for parity.
|
|
8
|
-
*
|
|
9
|
-
* Throws `ClawtoolAuthError` if the file is missing or empty; callers
|
|
10
|
-
* should surface an actionable message ("daemon not running? run
|
|
11
|
-
* `clawtool daemon start`"). Override `path` for tests.
|
|
12
|
-
*/
|
|
13
|
-
export declare class ClawtoolAuthError extends Error {
|
|
14
|
-
readonly cause?: unknown | undefined;
|
|
15
|
-
constructor(message: string, cause?: unknown | undefined);
|
|
16
|
-
}
|
|
17
|
-
export declare function readToken(path?: string): string;
|
|
18
|
-
/**
|
|
19
|
-
* Non-throwing variant. Returns `null` if the token file is missing or
|
|
20
|
-
* empty — which is the expected case when the daemon is running in
|
|
21
|
-
* `--no-auth` mode (single-user loopback). Callers in that path should
|
|
22
|
-
* proceed with no bearer header; clawtool ignores `Authorization` when
|
|
23
|
-
* no-auth is on.
|
|
24
|
-
*/
|
|
25
|
-
export declare function tryReadToken(path?: string): string | null;
|
|
26
|
-
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/integrations/clawtool/auth.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;GAWG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;IAG1C,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO;gBADxB,OAAO,EAAE,MAAM,EACN,KAAK,CAAC,EAAE,OAAO,YAAA;CAKzB;AAED,wBAAgB,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAgB/C;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CASzD"}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import { readFileSync } from 'node:fs';
|
|
2
|
-
import { listenerTokenPath } from './paths.js';
|
|
3
|
-
/**
|
|
4
|
-
* Read and trim the bearer token clawtool writes for HTTP auth.
|
|
5
|
-
*
|
|
6
|
-
* Token format: 64 hex characters (32 bytes of `crypto/rand`), newline-
|
|
7
|
-
* terminated, mode 0600 — generated by `internal/server/http.go:362-366`.
|
|
8
|
-
* `strings.TrimSpace` is applied server-side at parse time, so leading /
|
|
9
|
-
* trailing whitespace is tolerated. We mirror that here for parity.
|
|
10
|
-
*
|
|
11
|
-
* Throws `ClawtoolAuthError` if the file is missing or empty; callers
|
|
12
|
-
* should surface an actionable message ("daemon not running? run
|
|
13
|
-
* `clawtool daemon start`"). Override `path` for tests.
|
|
14
|
-
*/
|
|
15
|
-
export class ClawtoolAuthError extends Error {
|
|
16
|
-
cause;
|
|
17
|
-
constructor(message, cause) {
|
|
18
|
-
super(message);
|
|
19
|
-
this.cause = cause;
|
|
20
|
-
this.name = 'ClawtoolAuthError';
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
export function readToken(path) {
|
|
24
|
-
const target = path ?? listenerTokenPath();
|
|
25
|
-
let raw;
|
|
26
|
-
try {
|
|
27
|
-
raw = readFileSync(target, 'utf8');
|
|
28
|
-
}
|
|
29
|
-
catch (err) {
|
|
30
|
-
throw new ClawtoolAuthError(`clawtool listener token not found at ${target} — is the daemon running?`, err);
|
|
31
|
-
}
|
|
32
|
-
const token = raw.trim();
|
|
33
|
-
if (token.length === 0) {
|
|
34
|
-
throw new ClawtoolAuthError(`clawtool listener token at ${target} is empty`);
|
|
35
|
-
}
|
|
36
|
-
return token;
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Non-throwing variant. Returns `null` if the token file is missing or
|
|
40
|
-
* empty — which is the expected case when the daemon is running in
|
|
41
|
-
* `--no-auth` mode (single-user loopback). Callers in that path should
|
|
42
|
-
* proceed with no bearer header; clawtool ignores `Authorization` when
|
|
43
|
-
* no-auth is on.
|
|
44
|
-
*/
|
|
45
|
-
export function tryReadToken(path) {
|
|
46
|
-
const target = path ?? listenerTokenPath();
|
|
47
|
-
try {
|
|
48
|
-
const raw = readFileSync(target, 'utf8');
|
|
49
|
-
const token = raw.trim();
|
|
50
|
-
return token.length > 0 ? token : null;
|
|
51
|
-
}
|
|
52
|
-
catch {
|
|
53
|
-
return null;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
//# sourceMappingURL=auth.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/integrations/clawtool/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAEtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAE9C;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAGjC;IAFV,YACC,OAAe,EACN,KAAe;QAExB,KAAK,CAAC,OAAO,CAAC,CAAA;QAFL,UAAK,GAAL,KAAK,CAAU;QAGxB,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAA;IAChC,CAAC;CACD;AAED,MAAM,UAAU,SAAS,CAAC,IAAa;IACtC,MAAM,MAAM,GAAG,IAAI,IAAI,iBAAiB,EAAE,CAAA;IAC1C,IAAI,GAAW,CAAA;IACf,IAAI,CAAC;QACJ,GAAG,GAAG,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,MAAM,IAAI,iBAAiB,CAC1B,wCAAwC,MAAM,2BAA2B,EACzE,GAAG,CACH,CAAA;IACF,CAAC;IACD,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAA;IACxB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,iBAAiB,CAAC,8BAA8B,MAAM,WAAW,CAAC,CAAA;IAC7E,CAAC;IACD,OAAO,KAAK,CAAA;AACb,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,IAAa;IACzC,MAAM,MAAM,GAAG,IAAI,IAAI,iBAAiB,EAAE,CAAA;IAC1C,IAAI,CAAC;QACJ,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QACxC,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAA;QACxB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA;IACvC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAA;IACZ,CAAC;AACF,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth.test.d.ts","sourceRoot":"","sources":["../../../src/integrations/clawtool/auth.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { mkdtempSync, writeFileSync } from 'node:fs';
|
|
2
|
-
import { tmpdir } from 'node:os';
|
|
3
|
-
import { join } from 'node:path';
|
|
4
|
-
import { describe, expect, it } from 'vitest';
|
|
5
|
-
import { ClawtoolAuthError, readToken, tryReadToken } from './auth.js';
|
|
6
|
-
describe('readToken (strict)', () => {
|
|
7
|
-
it('returns the trimmed token from a present file', () => {
|
|
8
|
-
const dir = mkdtempSync(join(tmpdir(), 'namzu-auth-'));
|
|
9
|
-
const path = join(dir, 'token');
|
|
10
|
-
writeFileSync(path, ' abc123\n');
|
|
11
|
-
expect(readToken(path)).toBe('abc123');
|
|
12
|
-
});
|
|
13
|
-
it('throws ClawtoolAuthError when the file is missing', () => {
|
|
14
|
-
expect(() => readToken('/no/such/path/token')).toThrow(ClawtoolAuthError);
|
|
15
|
-
});
|
|
16
|
-
it('throws ClawtoolAuthError when the file is empty', () => {
|
|
17
|
-
const dir = mkdtempSync(join(tmpdir(), 'namzu-auth-'));
|
|
18
|
-
const path = join(dir, 'empty-token');
|
|
19
|
-
writeFileSync(path, ' \n \n');
|
|
20
|
-
expect(() => readToken(path)).toThrow(ClawtoolAuthError);
|
|
21
|
-
});
|
|
22
|
-
});
|
|
23
|
-
describe('tryReadToken (lenient)', () => {
|
|
24
|
-
it('returns the token when present', () => {
|
|
25
|
-
const dir = mkdtempSync(join(tmpdir(), 'namzu-auth-'));
|
|
26
|
-
const path = join(dir, 'token');
|
|
27
|
-
writeFileSync(path, 'deadbeef\n');
|
|
28
|
-
expect(tryReadToken(path)).toBe('deadbeef');
|
|
29
|
-
});
|
|
30
|
-
it('returns null for a missing file (no-auth daemon case)', () => {
|
|
31
|
-
expect(tryReadToken('/no/such/path/token')).toBeNull();
|
|
32
|
-
});
|
|
33
|
-
it('returns null for an empty file', () => {
|
|
34
|
-
const dir = mkdtempSync(join(tmpdir(), 'namzu-auth-'));
|
|
35
|
-
const path = join(dir, 'empty-token');
|
|
36
|
-
writeFileSync(path, '');
|
|
37
|
-
expect(tryReadToken(path)).toBeNull();
|
|
38
|
-
});
|
|
39
|
-
});
|
|
40
|
-
//# sourceMappingURL=auth.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth.test.js","sourceRoot":"","sources":["../../../src/integrations/clawtool/auth.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAEtE,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACxD,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,CAAC,CAAA;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;QAC/B,aAAa,CAAC,IAAI,EAAE,YAAY,CAAC,CAAA;QACjC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC5D,MAAM,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAA;IAC1E,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QAC1D,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,CAAC,CAAA;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAA;QACrC,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;QAChC,MAAM,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAA;IACzD,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACzC,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,CAAC,CAAA;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;QAC/B,aAAa,CAAC,IAAI,EAAE,YAAY,CAAC,CAAA;QACjC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAChE,MAAM,CAAC,YAAY,CAAC,qBAAqB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;IACvD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACzC,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,CAAC,CAAA;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAA;QACrC,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;QACvB,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;IACtC,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
export declare class ClawtoolBinaryError extends Error {
|
|
2
|
-
constructor(message: string);
|
|
3
|
-
}
|
|
4
|
-
export interface FindBinaryOptions {
|
|
5
|
-
/** Explicit absolute path; if set, skips PATH search and returns this. */
|
|
6
|
-
readonly override?: string;
|
|
7
|
-
/** PATH-like string for tests; defaults to `process.env.PATH`. */
|
|
8
|
-
readonly path?: string;
|
|
9
|
-
/** Binary name; default `clawtool`. Configurable for win32 `.exe` testing. */
|
|
10
|
-
readonly name?: string;
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Locate the `clawtool` executable.
|
|
14
|
-
*
|
|
15
|
-
* Resolution order:
|
|
16
|
-
* 1. Explicit `override` (config: `clawtool.binary`).
|
|
17
|
-
* 2. First `<dir>/clawtool` in `$PATH` that is executable by the
|
|
18
|
-
* current user.
|
|
19
|
-
*
|
|
20
|
-
* Throws `ClawtoolBinaryError` with an actionable message when neither
|
|
21
|
-
* yields a hit. We deliberately do not auto-build from source — that would
|
|
22
|
-
* mask install errors in production deployments (see plan §M1 decision 2).
|
|
23
|
-
*/
|
|
24
|
-
export declare function findBinary(opts?: FindBinaryOptions): string;
|
|
25
|
-
//# sourceMappingURL=binary.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"binary.d.ts","sourceRoot":"","sources":["../../../src/integrations/clawtool/binary.ts"],"names":[],"mappings":"AAGA,qBAAa,mBAAoB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;CAI3B;AAED,MAAM,WAAW,iBAAiB;IACjC,0EAA0E;IAC1E,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,kEAAkE;IAClE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,8EAA8E;IAC9E,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CACtB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CAAC,IAAI,GAAE,iBAAsB,GAAG,MAAM,CAe/D"}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { constants, accessSync } from 'node:fs';
|
|
2
|
-
import { delimiter, join } from 'node:path';
|
|
3
|
-
export class ClawtoolBinaryError extends Error {
|
|
4
|
-
constructor(message) {
|
|
5
|
-
super(message);
|
|
6
|
-
this.name = 'ClawtoolBinaryError';
|
|
7
|
-
}
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* Locate the `clawtool` executable.
|
|
11
|
-
*
|
|
12
|
-
* Resolution order:
|
|
13
|
-
* 1. Explicit `override` (config: `clawtool.binary`).
|
|
14
|
-
* 2. First `<dir>/clawtool` in `$PATH` that is executable by the
|
|
15
|
-
* current user.
|
|
16
|
-
*
|
|
17
|
-
* Throws `ClawtoolBinaryError` with an actionable message when neither
|
|
18
|
-
* yields a hit. We deliberately do not auto-build from source — that would
|
|
19
|
-
* mask install errors in production deployments (see plan §M1 decision 2).
|
|
20
|
-
*/
|
|
21
|
-
export function findBinary(opts = {}) {
|
|
22
|
-
const name = opts.name ?? 'clawtool';
|
|
23
|
-
if (opts.override) {
|
|
24
|
-
assertExecutable(opts.override, name);
|
|
25
|
-
return opts.override;
|
|
26
|
-
}
|
|
27
|
-
const pathStr = opts.path ?? process.env.PATH ?? '';
|
|
28
|
-
const dirs = pathStr.split(delimiter).filter((d) => d.length > 0);
|
|
29
|
-
for (const dir of dirs) {
|
|
30
|
-
const candidate = join(dir, name);
|
|
31
|
-
if (isExecutable(candidate))
|
|
32
|
-
return candidate;
|
|
33
|
-
}
|
|
34
|
-
throw new ClawtoolBinaryError('clawtool binary not found in PATH. Install via `go install github.com/cogitave/clawtool/cmd/clawtool@latest` or set `clawtool.binary` in your namzu config.');
|
|
35
|
-
}
|
|
36
|
-
function assertExecutable(path, name) {
|
|
37
|
-
if (!isExecutable(path)) {
|
|
38
|
-
throw new ClawtoolBinaryError(`configured \`clawtool.binary\` path is not executable: ${path} (looking for \`${name}\`)`);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
function isExecutable(path) {
|
|
42
|
-
try {
|
|
43
|
-
accessSync(path, constants.X_OK);
|
|
44
|
-
return true;
|
|
45
|
-
}
|
|
46
|
-
catch {
|
|
47
|
-
return false;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
//# sourceMappingURL=binary.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"binary.js","sourceRoot":"","sources":["../../../src/integrations/clawtool/binary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAE3C,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC7C,YAAY,OAAe;QAC1B,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAA;IAClC,CAAC;CACD;AAWD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,UAAU,CAAC,OAA0B,EAAE;IACtD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,UAAU,CAAA;IACpC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnB,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;QACrC,OAAO,IAAI,CAAC,QAAQ,CAAA;IACrB,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAA;IACnD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IACjE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QACjC,IAAI,YAAY,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAA;IAC9C,CAAC;IACD,MAAM,IAAI,mBAAmB,CAC5B,6JAA6J,CAC7J,CAAA;AACF,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY,EAAE,IAAY;IACnD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,mBAAmB,CAC5B,0DAA0D,IAAI,mBAAmB,IAAI,KAAK,CAC1F,CAAA;IACF,CAAC;AACF,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IACjC,IAAI,CAAC;QACJ,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAA;QAChC,OAAO,IAAI,CAAA;IACZ,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,KAAK,CAAA;IACb,CAAC;AACF,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"binary.test.d.ts","sourceRoot":"","sources":["../../../src/integrations/clawtool/binary.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { chmodSync, mkdtempSync, writeFileSync } from 'node:fs';
|
|
2
|
-
import { tmpdir } from 'node:os';
|
|
3
|
-
import { delimiter, join } from 'node:path';
|
|
4
|
-
import { describe, expect, it } from 'vitest';
|
|
5
|
-
import { ClawtoolBinaryError, findBinary } from './binary.js';
|
|
6
|
-
/**
|
|
7
|
-
* POSIX file modes do not exist on Windows: `chmod` is a no-op there and
|
|
8
|
-
* `fs.stat().mode` reports a fixed value, so these cases assert a
|
|
9
|
-
* permission the platform cannot enforce. Skipping keeps the suite
|
|
10
|
-
* meaningful on Windows instead of permanently red — the behavior itself
|
|
11
|
-
* is still covered on Linux and macOS, where it actually matters.
|
|
12
|
-
*/
|
|
13
|
-
const IS_WINDOWS = process.platform === 'win32';
|
|
14
|
-
function execBin(dir, name) {
|
|
15
|
-
const path = join(dir, name);
|
|
16
|
-
writeFileSync(path, '#!/bin/sh\nexit 0\n');
|
|
17
|
-
chmodSync(path, 0o755);
|
|
18
|
-
return path;
|
|
19
|
-
}
|
|
20
|
-
describe('findBinary', () => {
|
|
21
|
-
it('returns the override when it is executable', () => {
|
|
22
|
-
const dir = mkdtempSync(join(tmpdir(), 'namzu-bin-'));
|
|
23
|
-
const path = execBin(dir, 'clawtool');
|
|
24
|
-
expect(findBinary({ override: path })).toBe(path);
|
|
25
|
-
});
|
|
26
|
-
it.skipIf(IS_WINDOWS)('throws when the override is not executable', () => {
|
|
27
|
-
const dir = mkdtempSync(join(tmpdir(), 'namzu-bin-'));
|
|
28
|
-
const path = join(dir, 'clawtool');
|
|
29
|
-
writeFileSync(path, '#!/bin/sh\nexit 0\n');
|
|
30
|
-
// no chmod +x
|
|
31
|
-
expect(() => findBinary({ override: path })).toThrow(ClawtoolBinaryError);
|
|
32
|
-
});
|
|
33
|
-
it('finds an executable in the provided PATH', () => {
|
|
34
|
-
const dir = mkdtempSync(join(tmpdir(), 'namzu-bin-'));
|
|
35
|
-
const path = execBin(dir, 'clawtool');
|
|
36
|
-
const otherDir = mkdtempSync(join(tmpdir(), 'namzu-bin-other-'));
|
|
37
|
-
const result = findBinary({ path: [otherDir, dir].join(delimiter) });
|
|
38
|
-
expect(result).toBe(path);
|
|
39
|
-
});
|
|
40
|
-
it('throws an actionable error when the binary is nowhere on PATH', () => {
|
|
41
|
-
const otherDir = mkdtempSync(join(tmpdir(), 'namzu-bin-other-'));
|
|
42
|
-
expect(() => findBinary({ path: otherDir })).toThrowError(/clawtool binary not found/);
|
|
43
|
-
});
|
|
44
|
-
it('respects a custom binary name override', () => {
|
|
45
|
-
const dir = mkdtempSync(join(tmpdir(), 'namzu-bin-'));
|
|
46
|
-
const path = execBin(dir, 'clawtool-dev');
|
|
47
|
-
expect(findBinary({ path: dir, name: 'clawtool-dev' })).toBe(path);
|
|
48
|
-
});
|
|
49
|
-
});
|
|
50
|
-
//# sourceMappingURL=binary.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"binary.test.js","sourceRoot":"","sources":["../../../src/integrations/clawtool/binary.test.ts"],"names":[],"mappings":"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"}
|