@namzu/cli 0.0.3 → 0.1.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/bin.js +4 -32
- package/dist/bin.js.map +1 -1
- package/dist/cli.d.ts +14 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +124 -0
- package/dist/cli.js.map +1 -0
- package/dist/cli.test.d.ts +2 -0
- package/dist/cli.test.d.ts.map +1 -0
- package/dist/cli.test.js +94 -0
- package/dist/cli.test.js.map +1 -0
- package/dist/commands/doctor.d.ts +6 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +10 -0
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/providers.d.ts +17 -0
- package/dist/commands/providers.d.ts.map +1 -0
- package/dist/commands/providers.js +274 -0
- package/dist/commands/providers.js.map +1 -0
- package/dist/commands/registry.d.ts +11 -0
- package/dist/commands/registry.d.ts.map +1 -0
- package/dist/commands/registry.js +28 -0
- package/dist/commands/registry.js.map +1 -0
- package/dist/commands/run.d.ts +14 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +73 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/stubs.d.ts +12 -0
- package/dist/commands/stubs.d.ts.map +1 -0
- package/dist/commands/stubs.js +32 -0
- package/dist/commands/stubs.js.map +1 -0
- package/dist/commands/tools.d.ts +16 -0
- package/dist/commands/tools.d.ts.map +1 -0
- package/dist/commands/tools.js +161 -0
- package/dist/commands/tools.js.map +1 -0
- package/dist/commands/types.d.ts +25 -0
- package/dist/commands/types.d.ts.map +1 -0
- package/dist/commands/types.js +2 -0
- package/dist/commands/types.js.map +1 -0
- package/dist/config/load.d.ts +25 -0
- package/dist/config/load.d.ts.map +1 -0
- package/dist/config/load.js +92 -0
- package/dist/config/load.js.map +1 -0
- package/dist/config/load.test.d.ts +2 -0
- package/dist/config/load.test.d.ts.map +1 -0
- package/dist/config/load.test.js +57 -0
- package/dist/config/load.test.js.map +1 -0
- package/dist/config/schema.d.ts +29 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +13 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/doctor/registry.d.ts.map +1 -1
- package/dist/doctor/registry.js +3 -1
- package/dist/doctor/registry.js.map +1 -1
- package/dist/doctor/registry.test.js +4 -1
- package/dist/doctor/registry.test.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/integrations/clawtool/agents.d.ts +31 -0
- package/dist/integrations/clawtool/agents.d.ts.map +1 -0
- package/dist/integrations/clawtool/agents.js +30 -0
- package/dist/integrations/clawtool/agents.js.map +1 -0
- package/dist/integrations/clawtool/agents.test.d.ts +2 -0
- package/dist/integrations/clawtool/agents.test.d.ts.map +1 -0
- package/dist/integrations/clawtool/agents.test.js +79 -0
- package/dist/integrations/clawtool/agents.test.js.map +1 -0
- package/dist/integrations/clawtool/auth.d.ts +26 -0
- package/dist/integrations/clawtool/auth.d.ts.map +1 -0
- package/dist/integrations/clawtool/auth.js +56 -0
- package/dist/integrations/clawtool/auth.js.map +1 -0
- package/dist/integrations/clawtool/auth.test.d.ts +2 -0
- package/dist/integrations/clawtool/auth.test.d.ts.map +1 -0
- package/dist/integrations/clawtool/auth.test.js +40 -0
- package/dist/integrations/clawtool/auth.test.js.map +1 -0
- package/dist/integrations/clawtool/binary.d.ts +25 -0
- package/dist/integrations/clawtool/binary.d.ts.map +1 -0
- package/dist/integrations/clawtool/binary.js +50 -0
- package/dist/integrations/clawtool/binary.js.map +1 -0
- package/dist/integrations/clawtool/binary.test.d.ts +2 -0
- package/dist/integrations/clawtool/binary.test.d.ts.map +1 -0
- package/dist/integrations/clawtool/binary.test.js +42 -0
- package/dist/integrations/clawtool/binary.test.js.map +1 -0
- package/dist/integrations/clawtool/daemon.d.ts +37 -0
- package/dist/integrations/clawtool/daemon.d.ts.map +1 -0
- package/dist/integrations/clawtool/daemon.js +109 -0
- package/dist/integrations/clawtool/daemon.js.map +1 -0
- package/dist/integrations/clawtool/daemon.test.d.ts +11 -0
- package/dist/integrations/clawtool/daemon.test.d.ts.map +1 -0
- package/dist/integrations/clawtool/daemon.test.js +118 -0
- package/dist/integrations/clawtool/daemon.test.js.map +1 -0
- package/dist/integrations/clawtool/dispatch.d.ts +33 -0
- package/dist/integrations/clawtool/dispatch.d.ts.map +1 -0
- package/dist/integrations/clawtool/dispatch.js +155 -0
- package/dist/integrations/clawtool/dispatch.js.map +1 -0
- package/dist/integrations/clawtool/dispatch.test.d.ts +2 -0
- package/dist/integrations/clawtool/dispatch.test.d.ts.map +1 -0
- package/dist/integrations/clawtool/dispatch.test.js +138 -0
- package/dist/integrations/clawtool/dispatch.test.js.map +1 -0
- package/dist/integrations/clawtool/index.d.ts +11 -0
- package/dist/integrations/clawtool/index.d.ts.map +1 -0
- package/dist/integrations/clawtool/index.js +10 -0
- package/dist/integrations/clawtool/index.js.map +1 -0
- package/dist/integrations/clawtool/mcp.d.ts +51 -0
- package/dist/integrations/clawtool/mcp.d.ts.map +1 -0
- package/dist/integrations/clawtool/mcp.js +156 -0
- package/dist/integrations/clawtool/mcp.js.map +1 -0
- package/dist/integrations/clawtool/mcp.test.d.ts +2 -0
- package/dist/integrations/clawtool/mcp.test.d.ts.map +1 -0
- package/dist/integrations/clawtool/mcp.test.js +126 -0
- package/dist/integrations/clawtool/mcp.test.js.map +1 -0
- package/dist/integrations/clawtool/paths.d.ts +8 -0
- package/dist/integrations/clawtool/paths.d.ts.map +1 -0
- package/dist/integrations/clawtool/paths.js +19 -0
- package/dist/integrations/clawtool/paths.js.map +1 -0
- package/dist/integrations/clawtool/peers.d.ts +67 -0
- package/dist/integrations/clawtool/peers.d.ts.map +1 -0
- package/dist/integrations/clawtool/peers.js +150 -0
- package/dist/integrations/clawtool/peers.js.map +1 -0
- package/dist/integrations/clawtool/plugin.d.ts +42 -0
- package/dist/integrations/clawtool/plugin.d.ts.map +1 -0
- package/dist/integrations/clawtool/plugin.js +38 -0
- package/dist/integrations/clawtool/plugin.js.map +1 -0
- package/dist/integrations/clawtool/state.d.ts +11 -0
- package/dist/integrations/clawtool/state.d.ts.map +1 -0
- package/dist/integrations/clawtool/state.js +41 -0
- package/dist/integrations/clawtool/state.js.map +1 -0
- package/dist/integrations/clawtool/state.test.d.ts +2 -0
- package/dist/integrations/clawtool/state.test.d.ts.map +1 -0
- package/dist/integrations/clawtool/state.test.js +38 -0
- package/dist/integrations/clawtool/state.test.js.map +1 -0
- package/dist/integrations/clawtool/tooling.d.ts +50 -0
- package/dist/integrations/clawtool/tooling.d.ts.map +1 -0
- package/dist/integrations/clawtool/tooling.js +89 -0
- package/dist/integrations/clawtool/tooling.js.map +1 -0
- package/dist/integrations/clawtool/tooling.test.d.ts +2 -0
- package/dist/integrations/clawtool/tooling.test.d.ts.map +1 -0
- package/dist/integrations/clawtool/tooling.test.js +58 -0
- package/dist/integrations/clawtool/tooling.test.js.map +1 -0
- package/dist/integrations/clawtool/types.d.ts +41 -0
- package/dist/integrations/clawtool/types.d.ts.map +1 -0
- package/dist/integrations/clawtool/types.js +9 -0
- package/dist/integrations/clawtool/types.js.map +1 -0
- package/dist/integrations/clipboard/image.d.ts +18 -0
- package/dist/integrations/clipboard/image.d.ts.map +1 -0
- package/dist/integrations/clipboard/image.js +88 -0
- package/dist/integrations/clipboard/image.js.map +1 -0
- package/dist/integrations/providers/discover.d.ts +68 -0
- package/dist/integrations/providers/discover.d.ts.map +1 -0
- package/dist/integrations/providers/discover.js +108 -0
- package/dist/integrations/providers/discover.js.map +1 -0
- package/dist/integrations/providers/discover.test.d.ts +2 -0
- package/dist/integrations/providers/discover.test.d.ts.map +1 -0
- package/dist/integrations/providers/discover.test.js +120 -0
- package/dist/integrations/providers/discover.test.js.map +1 -0
- package/dist/integrations/providers/index.d.ts +10 -0
- package/dist/integrations/providers/index.d.ts.map +1 -0
- package/dist/integrations/providers/index.js +12 -0
- package/dist/integrations/providers/index.js.map +1 -0
- package/dist/integrations/providers/keychain.d.ts +44 -0
- package/dist/integrations/providers/keychain.d.ts.map +1 -0
- package/dist/integrations/providers/keychain.js +154 -0
- package/dist/integrations/providers/keychain.js.map +1 -0
- package/dist/integrations/providers/keychain.test.d.ts +2 -0
- package/dist/integrations/providers/keychain.test.d.ts.map +1 -0
- package/dist/integrations/providers/keychain.test.js +21 -0
- package/dist/integrations/providers/keychain.test.js.map +1 -0
- package/dist/integrations/providers/mask.d.ts +7 -0
- package/dist/integrations/providers/mask.d.ts.map +1 -0
- package/dist/integrations/providers/mask.js +14 -0
- package/dist/integrations/providers/mask.js.map +1 -0
- package/dist/integrations/providers/mask.test.d.ts +2 -0
- package/dist/integrations/providers/mask.test.d.ts.map +1 -0
- package/dist/integrations/providers/mask.test.js +20 -0
- package/dist/integrations/providers/mask.test.js.map +1 -0
- package/dist/integrations/providers/oauth.d.ts +28 -0
- package/dist/integrations/providers/oauth.d.ts.map +1 -0
- package/dist/integrations/providers/oauth.js +65 -0
- package/dist/integrations/providers/oauth.js.map +1 -0
- package/dist/integrations/providers/oauth.test.d.ts +2 -0
- package/dist/integrations/providers/oauth.test.d.ts.map +1 -0
- package/dist/integrations/providers/oauth.test.js +86 -0
- package/dist/integrations/providers/oauth.test.js.map +1 -0
- package/dist/integrations/providers/preferences.d.ts +43 -0
- package/dist/integrations/providers/preferences.d.ts.map +1 -0
- package/dist/integrations/providers/preferences.js +111 -0
- package/dist/integrations/providers/preferences.js.map +1 -0
- package/dist/integrations/providers/preferences.test.d.ts +2 -0
- package/dist/integrations/providers/preferences.test.d.ts.map +1 -0
- package/dist/integrations/providers/preferences.test.js +68 -0
- package/dist/integrations/providers/preferences.test.js.map +1 -0
- package/dist/integrations/providers/registry.d.ts +31 -0
- package/dist/integrations/providers/registry.d.ts.map +1 -0
- package/dist/integrations/providers/registry.js +79 -0
- package/dist/integrations/providers/registry.js.map +1 -0
- package/dist/integrations/providers/schema.d.ts +73 -0
- package/dist/integrations/providers/schema.d.ts.map +1 -0
- package/dist/integrations/providers/schema.js +70 -0
- package/dist/integrations/providers/schema.js.map +1 -0
- package/dist/integrations/providers/schema.test.d.ts +2 -0
- package/dist/integrations/providers/schema.test.d.ts.map +1 -0
- package/dist/integrations/providers/schema.test.js +43 -0
- package/dist/integrations/providers/schema.test.js.map +1 -0
- package/dist/integrations/providers/secrets.d.ts +37 -0
- package/dist/integrations/providers/secrets.d.ts.map +1 -0
- package/dist/integrations/providers/secrets.js +69 -0
- package/dist/integrations/providers/secrets.js.map +1 -0
- package/dist/integrations/providers/store.d.ts +32 -0
- package/dist/integrations/providers/store.d.ts.map +1 -0
- package/dist/integrations/providers/store.js +133 -0
- package/dist/integrations/providers/store.js.map +1 -0
- package/dist/integrations/providers/store.test.d.ts +2 -0
- package/dist/integrations/providers/store.test.d.ts.map +1 -0
- package/dist/integrations/providers/store.test.js +127 -0
- package/dist/integrations/providers/store.test.js.map +1 -0
- package/dist/integrations/sessions/store.d.ts +40 -0
- package/dist/integrations/sessions/store.d.ts.map +1 -0
- package/dist/integrations/sessions/store.js +90 -0
- package/dist/integrations/sessions/store.js.map +1 -0
- package/dist/integrations/subagents/runtime.d.ts +37 -0
- package/dist/integrations/subagents/runtime.d.ts.map +1 -0
- package/dist/integrations/subagents/runtime.js +183 -0
- package/dist/integrations/subagents/runtime.js.map +1 -0
- package/dist/integrations/trust/store.d.ts +16 -0
- package/dist/integrations/trust/store.d.ts.map +1 -0
- package/dist/integrations/trust/store.js +59 -0
- package/dist/integrations/trust/store.js.map +1 -0
- package/dist/integrations/trust/store.test.d.ts +2 -0
- package/dist/integrations/trust/store.test.d.ts.map +1 -0
- package/dist/integrations/trust/store.test.js +50 -0
- package/dist/integrations/trust/store.test.js.map +1 -0
- package/dist/integrations/updates.d.ts +27 -0
- package/dist/integrations/updates.d.ts.map +1 -0
- package/dist/integrations/updates.js +99 -0
- package/dist/integrations/updates.js.map +1 -0
- package/dist/memory/store.d.ts +29 -0
- package/dist/memory/store.d.ts.map +1 -0
- package/dist/memory/store.js +74 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/memory/store.test.d.ts +2 -0
- package/dist/memory/store.test.d.ts.map +1 -0
- package/dist/memory/store.test.js +63 -0
- package/dist/memory/store.test.js.map +1 -0
- package/dist/output/formatter.d.ts +30 -0
- package/dist/output/formatter.d.ts.map +1 -0
- package/dist/output/formatter.js +16 -0
- package/dist/output/formatter.js.map +1 -0
- package/dist/output/formatter.test.d.ts +2 -0
- package/dist/output/formatter.test.d.ts.map +1 -0
- package/dist/output/formatter.test.js +88 -0
- package/dist/output/formatter.test.js.map +1 -0
- package/dist/output/index.d.ts +5 -0
- package/dist/output/index.d.ts.map +1 -0
- package/dist/output/index.js +22 -0
- package/dist/output/index.js.map +1 -0
- package/dist/output/json.d.ts +13 -0
- package/dist/output/json.d.ts.map +1 -0
- package/dist/output/json.js +51 -0
- package/dist/output/json.js.map +1 -0
- package/dist/output/text.d.ts +13 -0
- package/dist/output/text.d.ts.map +1 -0
- package/dist/output/text.js +36 -0
- package/dist/output/text.js.map +1 -0
- package/dist/output/yaml.d.ts +13 -0
- package/dist/output/yaml.d.ts.map +1 -0
- package/dist/output/yaml.js +26 -0
- package/dist/output/yaml.js.map +1 -0
- package/dist/skills/store.d.ts +49 -0
- package/dist/skills/store.d.ts.map +1 -0
- package/dist/skills/store.js +109 -0
- package/dist/skills/store.js.map +1 -0
- package/dist/skills/store.test.d.ts +2 -0
- package/dist/skills/store.test.d.ts.map +1 -0
- package/dist/skills/store.test.js +80 -0
- package/dist/skills/store.test.js.map +1 -0
- package/dist/tui/App.d.ts +18 -0
- package/dist/tui/App.d.ts.map +1 -0
- package/dist/tui/App.js +742 -0
- package/dist/tui/App.js.map +1 -0
- package/dist/tui/Composer.d.ts +17 -0
- package/dist/tui/Composer.d.ts.map +1 -0
- package/dist/tui/Composer.js +123 -0
- package/dist/tui/Composer.js.map +1 -0
- package/dist/tui/LiveActivity.d.ts +22 -0
- package/dist/tui/LiveActivity.d.ts.map +1 -0
- package/dist/tui/LiveActivity.js +46 -0
- package/dist/tui/LiveActivity.js.map +1 -0
- package/dist/tui/Markdown.d.ts +18 -0
- package/dist/tui/Markdown.d.ts.map +1 -0
- package/dist/tui/Markdown.js +68 -0
- package/dist/tui/Markdown.js.map +1 -0
- package/dist/tui/PermissionOverlay.d.ts +14 -0
- package/dist/tui/PermissionOverlay.d.ts.map +1 -0
- package/dist/tui/PermissionOverlay.js +22 -0
- package/dist/tui/PermissionOverlay.js.map +1 -0
- package/dist/tui/Picker.d.ts +20 -0
- package/dist/tui/Picker.d.ts.map +1 -0
- package/dist/tui/Picker.js +72 -0
- package/dist/tui/Picker.js.map +1 -0
- package/dist/tui/ResumePicker.d.ts +12 -0
- package/dist/tui/ResumePicker.d.ts.map +1 -0
- package/dist/tui/ResumePicker.js +26 -0
- package/dist/tui/ResumePicker.js.map +1 -0
- package/dist/tui/StatusBar.d.ts +22 -0
- package/dist/tui/StatusBar.d.ts.map +1 -0
- package/dist/tui/StatusBar.js +73 -0
- package/dist/tui/StatusBar.js.map +1 -0
- package/dist/tui/Transcript.d.ts +29 -0
- package/dist/tui/Transcript.d.ts.map +1 -0
- package/dist/tui/Transcript.js +105 -0
- package/dist/tui/Transcript.js.map +1 -0
- package/dist/tui/TrustPrompt.d.ts +11 -0
- package/dist/tui/TrustPrompt.d.ts.map +1 -0
- package/dist/tui/TrustPrompt.js +13 -0
- package/dist/tui/TrustPrompt.js.map +1 -0
- package/dist/tui/agent.d.ts +163 -0
- package/dist/tui/agent.d.ts.map +1 -0
- package/dist/tui/agent.js +684 -0
- package/dist/tui/agent.js.map +1 -0
- package/dist/tui/agent.test.d.ts +2 -0
- package/dist/tui/agent.test.d.ts.map +1 -0
- package/dist/tui/agent.test.js +225 -0
- package/dist/tui/agent.test.js.map +1 -0
- package/dist/tui/index.d.ts +7 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +29 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/logo.d.ts +23 -0
- package/dist/tui/logo.d.ts.map +1 -0
- package/dist/tui/logo.js +35 -0
- package/dist/tui/logo.js.map +1 -0
- package/dist/tui/markdownParser.d.ts +45 -0
- package/dist/tui/markdownParser.d.ts.map +1 -0
- package/dist/tui/markdownParser.js +127 -0
- package/dist/tui/markdownParser.js.map +1 -0
- package/dist/tui/markdownParser.test.d.ts +2 -0
- package/dist/tui/markdownParser.test.d.ts.map +1 -0
- package/dist/tui/markdownParser.test.js +90 -0
- package/dist/tui/markdownParser.test.js.map +1 -0
- package/dist/tui/mentions.d.ts +22 -0
- package/dist/tui/mentions.d.ts.map +1 -0
- package/dist/tui/mentions.js +59 -0
- package/dist/tui/mentions.js.map +1 -0
- package/dist/tui/mentions.test.d.ts +2 -0
- package/dist/tui/mentions.test.d.ts.map +1 -0
- package/dist/tui/mentions.test.js +35 -0
- package/dist/tui/mentions.test.js.map +1 -0
- package/dist/tui/slashCommands.d.ts +64 -0
- package/dist/tui/slashCommands.d.ts.map +1 -0
- package/dist/tui/slashCommands.js +153 -0
- package/dist/tui/slashCommands.js.map +1 -0
- package/dist/tui/slashCommands.test.d.ts +2 -0
- package/dist/tui/slashCommands.test.d.ts.map +1 -0
- package/dist/tui/slashCommands.test.js +114 -0
- package/dist/tui/slashCommands.test.js.map +1 -0
- package/dist/tui/theme.d.ts +34 -0
- package/dist/tui/theme.d.ts.map +1 -0
- package/dist/tui/theme.js +32 -0
- package/dist/tui/theme.js.map +1 -0
- package/dist/tui/types.d.ts +27 -0
- package/dist/tui/types.d.ts.map +1 -0
- package/dist/tui/types.js +7 -0
- package/dist/tui/types.js.map +1 -0
- package/package.json +13 -3
package/dist/index.d.ts
CHANGED
|
@@ -7,4 +7,10 @@ export { createDoctorRegistry, doctor, DoctorRegistry, registerDoctorCheck, runD
|
|
|
7
7
|
export type { RunDoctorOptions } from './doctor/registry.js';
|
|
8
8
|
export { builtInDoctorChecks, cwdWritableCheck, providersRegisteredCheck, sandboxPlatformCheck, telemetryInstalledCheck, tmpdirWritableCheck, vaultRegisteredCheck, } from './doctor/checks/index.js';
|
|
9
9
|
export { runDoctorCommand } from './commands/doctor.js';
|
|
10
|
+
export { runCli, type RunCliOptions } from './cli.js';
|
|
11
|
+
export type { CommandContext, CommandDef, CommandHandler, CommandHandlerArgs, } from './commands/types.js';
|
|
12
|
+
export { registerAll, registerCommand, type RegisterOptions, } from './commands/registry.js';
|
|
13
|
+
export { createFormatter, type FormatName, type Formatter, type FormatterOptions, isFormatName, } from './output/index.js';
|
|
14
|
+
export { loadConfig, type LoadConfigOptions } from './config/load.js';
|
|
15
|
+
export { DEFAULT_CONFIG, type NamzuCliConfig } from './config/schema.js';
|
|
10
16
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACN,oBAAoB,EACpB,MAAM,EACN,cAAc,EACd,mBAAmB,EACnB,SAAS,GACT,MAAM,sBAAsB,CAAA;AAC7B,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAE5D,OAAO,EACN,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,EACxB,oBAAoB,EACpB,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,GACpB,MAAM,0BAA0B,CAAA;AAEjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAGvD,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAA;AACrD,YAAY,EACX,cAAc,EACd,UAAU,EACV,cAAc,EACd,kBAAkB,GAClB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACN,WAAW,EACX,eAAe,EACf,KAAK,eAAe,GACpB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EACN,eAAe,EACf,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,YAAY,GACZ,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACrE,OAAO,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -3,7 +3,14 @@
|
|
|
3
3
|
* invoke runDoctor() in their own process so app-registered checks are
|
|
4
4
|
* visible. The standalone CLI binary lives at ./bin.ts.
|
|
5
5
|
*/
|
|
6
|
+
// Doctor library API (pre-M0; preserved for embedded consumers).
|
|
6
7
|
export { createDoctorRegistry, doctor, DoctorRegistry, registerDoctorCheck, runDoctor, } from './doctor/registry.js';
|
|
7
8
|
export { builtInDoctorChecks, cwdWritableCheck, providersRegisteredCheck, sandboxPlatformCheck, telemetryInstalledCheck, tmpdirWritableCheck, vaultRegisteredCheck, } from './doctor/checks/index.js';
|
|
8
9
|
export { runDoctorCommand } from './commands/doctor.js';
|
|
10
|
+
// Shell + extension surface for the CLI.
|
|
11
|
+
export { runCli } from './cli.js';
|
|
12
|
+
export { registerAll, registerCommand, } from './commands/registry.js';
|
|
13
|
+
export { createFormatter, isFormatName, } from './output/index.js';
|
|
14
|
+
export { loadConfig } from './config/load.js';
|
|
15
|
+
export { DEFAULT_CONFIG } from './config/schema.js';
|
|
9
16
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACN,oBAAoB,EACpB,MAAM,EACN,cAAc,EACd,mBAAmB,EACnB,SAAS,GACT,MAAM,sBAAsB,CAAA;AAG7B,OAAO,EACN,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,EACxB,oBAAoB,EACpB,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,GACpB,MAAM,0BAA0B,CAAA;AAEjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,iEAAiE;AACjE,OAAO,EACN,oBAAoB,EACpB,MAAM,EACN,cAAc,EACd,mBAAmB,EACnB,SAAS,GACT,MAAM,sBAAsB,CAAA;AAG7B,OAAO,EACN,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,EACxB,oBAAoB,EACpB,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,GACpB,MAAM,0BAA0B,CAAA;AAEjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAEvD,yCAAyC;AACzC,OAAO,EAAE,MAAM,EAAsB,MAAM,UAAU,CAAA;AAOrD,OAAO,EACN,WAAW,EACX,eAAe,GAEf,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EACN,eAAe,EAIf,YAAY,GACZ,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,UAAU,EAA0B,MAAM,kBAAkB,CAAA;AACrE,OAAO,EAAE,cAAc,EAAuB,MAAM,oBAAoB,CAAA"}
|
|
@@ -0,0 +1,31 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents.test.d.ts","sourceRoot":"","sources":["../../../src/integrations/clawtool/agents.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,79 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents.test.js","sourceRoot":"","sources":["../../../src/integrations/clawtool/agents.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.test.d.ts","sourceRoot":"","sources":["../../../src/integrations/clawtool/auth.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,40 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binary.test.d.ts","sourceRoot":"","sources":["../../../src/integrations/clawtool/binary.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,42 @@
|
|
|
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
|
+
function execBin(dir, name) {
|
|
7
|
+
const path = join(dir, name);
|
|
8
|
+
writeFileSync(path, '#!/bin/sh\nexit 0\n');
|
|
9
|
+
chmodSync(path, 0o755);
|
|
10
|
+
return path;
|
|
11
|
+
}
|
|
12
|
+
describe('findBinary', () => {
|
|
13
|
+
it('returns the override when it is executable', () => {
|
|
14
|
+
const dir = mkdtempSync(join(tmpdir(), 'namzu-bin-'));
|
|
15
|
+
const path = execBin(dir, 'clawtool');
|
|
16
|
+
expect(findBinary({ override: path })).toBe(path);
|
|
17
|
+
});
|
|
18
|
+
it('throws when the override is not executable', () => {
|
|
19
|
+
const dir = mkdtempSync(join(tmpdir(), 'namzu-bin-'));
|
|
20
|
+
const path = join(dir, 'clawtool');
|
|
21
|
+
writeFileSync(path, '#!/bin/sh\nexit 0\n');
|
|
22
|
+
// no chmod +x
|
|
23
|
+
expect(() => findBinary({ override: path })).toThrow(ClawtoolBinaryError);
|
|
24
|
+
});
|
|
25
|
+
it('finds an executable in the provided PATH', () => {
|
|
26
|
+
const dir = mkdtempSync(join(tmpdir(), 'namzu-bin-'));
|
|
27
|
+
const path = execBin(dir, 'clawtool');
|
|
28
|
+
const otherDir = mkdtempSync(join(tmpdir(), 'namzu-bin-other-'));
|
|
29
|
+
const result = findBinary({ path: [otherDir, dir].join(delimiter) });
|
|
30
|
+
expect(result).toBe(path);
|
|
31
|
+
});
|
|
32
|
+
it('throws an actionable error when the binary is nowhere on PATH', () => {
|
|
33
|
+
const otherDir = mkdtempSync(join(tmpdir(), 'namzu-bin-other-'));
|
|
34
|
+
expect(() => findBinary({ path: otherDir })).toThrowError(/clawtool binary not found/);
|
|
35
|
+
});
|
|
36
|
+
it('respects a custom binary name override', () => {
|
|
37
|
+
const dir = mkdtempSync(join(tmpdir(), 'namzu-bin-'));
|
|
38
|
+
const path = execBin(dir, 'clawtool-dev');
|
|
39
|
+
expect(findBinary({ path: dir, name: 'clawtool-dev' })).toBe(path);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
//# sourceMappingURL=binary.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binary.test.js","sourceRoot":"","sources":["../../../src/integrations/clawtool/binary.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ensureDaemon` — TS port of clawtool's Go `daemon.Ensure(ctx)`.
|
|
3
|
+
*
|
|
4
|
+
* Contract:
|
|
5
|
+
* 1. Read the state file. If healthy (`/v1/health` returns 200), return
|
|
6
|
+
* its endpoint + token verbatim.
|
|
7
|
+
* 2. If missing OR unhealthy, spawn `clawtool daemon start` (detached,
|
|
8
|
+
* `cmd.unref()`), wait briefly for the state file + listener, then
|
|
9
|
+
* re-probe. Return on success or throw with the underlying reason.
|
|
10
|
+
*
|
|
11
|
+
* The spawn path requires `findBinary` to return a real executable. If
|
|
12
|
+
* `autoStart` is disabled in config and the daemon isn't running, throw
|
|
13
|
+
* without spawning — surface "daemon not running" to the user instead.
|
|
14
|
+
*/
|
|
15
|
+
import type { DaemonEndpoint } from './types.js';
|
|
16
|
+
export declare class ClawtoolDaemonError extends Error {
|
|
17
|
+
readonly cause?: unknown | undefined;
|
|
18
|
+
constructor(message: string, cause?: unknown | undefined);
|
|
19
|
+
}
|
|
20
|
+
export interface EnsureDaemonOptions {
|
|
21
|
+
/** Disable auto-spawn (config: `clawtool.autoStart: false`). Default: true. */
|
|
22
|
+
readonly autoStart?: boolean;
|
|
23
|
+
/** Override binary path (config: `clawtool.binary`). */
|
|
24
|
+
readonly binary?: string;
|
|
25
|
+
/** Override endpoint base URL (config: `clawtool.endpoint`). */
|
|
26
|
+
readonly endpoint?: string;
|
|
27
|
+
/** Override token (config: `clawtool.token`). */
|
|
28
|
+
readonly token?: string;
|
|
29
|
+
/** Total deadline for the spawn → ready transition, default 10s. */
|
|
30
|
+
readonly readyTimeoutMs?: number;
|
|
31
|
+
/** Poll interval while waiting for health, default 200ms. */
|
|
32
|
+
readonly pollIntervalMs?: number;
|
|
33
|
+
/** Inject `fetch` for tests. */
|
|
34
|
+
readonly fetch?: typeof fetch;
|
|
35
|
+
}
|
|
36
|
+
export declare function ensureDaemon(opts?: EnsureDaemonOptions): Promise<DaemonEndpoint>;
|
|
37
|
+
//# sourceMappingURL=daemon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../../src/integrations/clawtool/daemon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAOH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAEhD,qBAAa,mBAAoB,SAAQ,KAAK;IAG5C,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO;gBADxB,OAAO,EAAE,MAAM,EACN,KAAK,CAAC,EAAE,OAAO,YAAA;CAKzB;AAED,MAAM,WAAW,mBAAmB;IACnC,+EAA+E;IAC/E,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;IAC5B,wDAAwD;IACxD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,gEAAgE;IAChE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,iDAAiD;IACjD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,oEAAoE;IACpE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC,6DAA6D;IAC7D,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC,gCAAgC;IAChC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;CAC7B;AAKD,wBAAsB,YAAY,CAAC,IAAI,GAAE,mBAAwB,GAAG,OAAO,CAAC,cAAc,CAAC,CAoC1F"}
|