@malmhq/intermesh-cli 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.
Files changed (95) hide show
  1. package/LICENSE +198 -0
  2. package/README.md +77 -0
  3. package/dist/generation/.opencode/AGENTS.md +38 -0
  4. package/dist/generation/.opencode/agents/generation-builder.md +9 -0
  5. package/dist/generation/.opencode/agents/generation-fidelity.md +9 -0
  6. package/dist/generation/.opencode/agents/generation-source.md +13 -0
  7. package/dist/generation/.opencode/prompts/analyze-capabilities.md +61 -0
  8. package/dist/generation/.opencode/prompts/analyze-source.md +41 -0
  9. package/dist/generation/.opencode/prompts/generate.md +9 -0
  10. package/dist/generation/.opencode/prompts/repair-capability-proposal.md +5 -0
  11. package/dist/generation/.opencode/skills/generation-building/SKILL.md +32 -0
  12. package/dist/generation/.opencode/skills/generation-package-review/SKILL.md +36 -0
  13. package/dist/generation/.opencode/skills/generation-source-analysis/SKILL.md +36 -0
  14. package/dist/generation/AGENTS.md +38 -0
  15. package/dist/generation/agent-skill-installer/index.ts +4 -0
  16. package/dist/generation/agent-skill-installer/install.ts +503 -0
  17. package/dist/generation/agent-skill-installer/lock.ts +128 -0
  18. package/dist/generation/agent-skill-installer/manifest.ts +271 -0
  19. package/dist/generation/agent-skill-installer/targets.ts +169 -0
  20. package/dist/generation/runtime-entrypoint.js +39980 -0
  21. package/dist/generation/scripts/check-package.mjs +45 -0
  22. package/dist/generation/scripts/installed-help.mjs +98 -0
  23. package/dist/generation/scripts/lead-input.mjs +584 -0
  24. package/dist/generation/scripts/prepare-opencode.mjs +33 -0
  25. package/dist/generation/scripts/prepared-work.mjs +197 -0
  26. package/dist/generation/scripts/repair-loop.mjs +519 -0
  27. package/dist/generation/scripts/run-reviewers.mjs +306 -0
  28. package/dist/generation/scripts/runtime-capture.mjs +119 -0
  29. package/dist/generation/scripts/stage-timings.mjs +53 -0
  30. package/dist/generation/scripts/validate-source-brief.mjs +220 -0
  31. package/dist/generation/scripts/verify-package.mjs +365 -0
  32. package/dist/generation/templates/npm-cli/CONTRIBUTING.md +20 -0
  33. package/dist/generation/templates/npm-cli/GENERATION-PATTERNS.md +143 -0
  34. package/dist/generation/templates/npm-cli/README.md +67 -0
  35. package/dist/generation/templates/npm-cli/capabilities.json +1 -0
  36. package/dist/generation/templates/npm-cli/mock/routes.ts +3 -0
  37. package/dist/generation/templates/npm-cli/mock/server.ts +15 -0
  38. package/dist/generation/templates/npm-cli/mock/types.ts +7 -0
  39. package/dist/generation/templates/npm-cli/package.json +36 -0
  40. package/dist/generation/templates/npm-cli/pnpm-lock.yaml +495 -0
  41. package/dist/generation/templates/npm-cli/pnpm-workspace.yaml +2 -0
  42. package/dist/generation/templates/npm-cli/skills/customer-cli-management/SKILL.md +22 -0
  43. package/dist/generation/templates/npm-cli/skills/customer-workflow/SKILL.md +22 -0
  44. package/dist/generation/templates/npm-cli/src/auth/commands.ts +77 -0
  45. package/dist/generation/templates/npm-cli/src/auth/credentials.ts +66 -0
  46. package/dist/generation/templates/npm-cli/src/auth/prompt.ts +27 -0
  47. package/dist/generation/templates/npm-cli/src/cli.ts +53 -0
  48. package/dist/generation/templates/npm-cli/src/commands.ts +6 -0
  49. package/dist/generation/templates/npm-cli/src/customer.ts +16 -0
  50. package/dist/generation/templates/npm-cli/src/index.ts +11 -0
  51. package/dist/generation/templates/npm-cli/src/lifecycle/commands.ts +344 -0
  52. package/dist/generation/templates/npm-cli/src/lifecycle/config.ts +32 -0
  53. package/dist/generation/templates/npm-cli/src/shared/dry-run.ts +32 -0
  54. package/dist/generation/templates/npm-cli/src/shared/errors.ts +162 -0
  55. package/dist/generation/templates/npm-cli/src/shared/files.ts +45 -0
  56. package/dist/generation/templates/npm-cli/src/shared/http.ts +125 -0
  57. package/dist/generation/templates/npm-cli/src/shared/output.ts +33 -0
  58. package/dist/generation/templates/npm-cli/test/auth.test.ts +113 -0
  59. package/dist/generation/templates/npm-cli/test/fixture-cli.ts +51 -0
  60. package/dist/generation/templates/npm-cli/test/foundation.test.ts +316 -0
  61. package/dist/generation/templates/npm-cli/test/helpers.ts +34 -0
  62. package/dist/generation/templates/npm-cli/test/mock-lifecycle.test.ts +86 -0
  63. package/dist/generation/templates/npm-cli/test/run-with-mock.ts +142 -0
  64. package/dist/generation/templates/npm-cli/tsconfig.build.json +5 -0
  65. package/dist/generation/templates/npm-cli/tsconfig.json +11 -0
  66. package/dist/generation/templates/opencode-bootstrap/package-lock.json +402 -0
  67. package/dist/generation/templates/opencode-bootstrap/package.json +7 -0
  68. package/dist/index.js +51965 -0
  69. package/dist/runtime/candidate-inspection/inspect.Dockerfile +4 -0
  70. package/dist/runtime/candidate-inspection/install.Dockerfile +5 -0
  71. package/dist/runtime/candidate-inspection/registry-proxy.mjs +37 -0
  72. package/dist/runtime/harbor/bootstrap/package-lock.json +402 -0
  73. package/dist/runtime/harbor/bootstrap/package.json +7 -0
  74. package/dist/runtime/harbor/evaluation.Dockerfile +31 -0
  75. package/dist/runtime/harbor/harbor_launcher.py +62 -0
  76. package/dist/runtime/harbor/intermesh_opencode.py +44 -0
  77. package/dist/runtime/harbor/model-forwarder.mjs +52 -0
  78. package/dist/runtime/live-task.md +13 -0
  79. package/package.json +44 -0
  80. package/skills/inter-cli-management/SKILL.md +38 -0
  81. package/skills/inter-cli-management/evals/evals.json +40 -0
  82. package/skills/inter-context/SKILL.md +72 -0
  83. package/skills/inter-context/evals/cases.json +82 -0
  84. package/skills/inter-eval-authoring/SKILL.md +70 -0
  85. package/skills/inter-eval-authoring/evals/evals.json +69 -0
  86. package/skills/inter-eval-authoring/evals/trigger-queries.json +34 -0
  87. package/skills/inter-eval-authoring/references/authoring-guide.md +70 -0
  88. package/skills/inter-eval-authoring/references/eval-plan.example.json +92 -0
  89. package/skills/inter-eval-authoring/references/eval-plan.schema.json +304 -0
  90. package/skills/inter-evaluation/SKILL.md +51 -0
  91. package/skills/inter-evaluation/evals/evals.json +49 -0
  92. package/skills/inter-evaluation/evals/trigger-queries.json +30 -0
  93. package/skills/inter-generation/SKILL.md +42 -0
  94. package/skills/inter-generation/evals/evals.json +81 -0
  95. package/skills/inter-generation/evals/trigger-queries.json +58 -0
@@ -0,0 +1,34 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { createServer, type RequestListener } from 'node:http';
3
+
4
+ export function runCli(args: string[], entry = 'test/fixture-cli.ts') {
5
+ return new Promise<{ code: number; stdout: string; stderr: string }>((resolve) => {
6
+ execFile(
7
+ process.execPath,
8
+ ['--import', 'tsx', entry, ...args],
9
+ { timeout: 10_000 },
10
+ (error, stdout, stderr) => {
11
+ resolve({
12
+ code: error ? (typeof error.code === 'number' ? error.code : 1) : 0,
13
+ stdout,
14
+ stderr,
15
+ });
16
+ },
17
+ );
18
+ });
19
+ }
20
+
21
+ export async function mockServer(handler: RequestListener) {
22
+ const server = createServer(handler);
23
+ await new Promise<void>((resolve) => server.listen(0, '127.0.0.1', resolve));
24
+ const address = server.address();
25
+ if (!address || typeof address === 'string') throw new Error('Mock did not bind a port');
26
+ return {
27
+ url: `http://127.0.0.1:${address.port}`,
28
+ close: () =>
29
+ new Promise<void>((resolve, reject) => {
30
+ server.closeAllConnections();
31
+ server.close((error) => (error ? reject(error) : resolve()));
32
+ }),
33
+ };
34
+ }
@@ -0,0 +1,86 @@
1
+ import assert from 'node:assert/strict';
2
+ import { execFile, spawn } from 'node:child_process';
3
+ import { access } from 'node:fs/promises';
4
+ import { createServer } from 'node:http';
5
+ import { test } from 'node:test';
6
+ import { promisify } from 'node:util';
7
+
8
+ const execFileAsync = promisify(execFile);
9
+ const runDirectory = '.mock-run';
10
+
11
+ async function runWithMock(args: string[]) {
12
+ try {
13
+ const result = await execFileAsync(
14
+ process.execPath,
15
+ ['--import', 'tsx', 'test/run-with-mock.ts', '--', ...args],
16
+ { timeout: 15_000 },
17
+ );
18
+ return { code: 0, stdout: result.stdout, stderr: result.stderr };
19
+ } catch (error) {
20
+ const result = error as { code?: number; stdout?: string; stderr?: string };
21
+ return { code: result.code ?? 1, stdout: result.stdout ?? '', stderr: result.stderr ?? '' };
22
+ }
23
+ }
24
+
25
+ async function assertCleanedUp() {
26
+ await assert.rejects(access(runDirectory));
27
+ await assert.rejects(fetch('http://127.0.0.1:8787'));
28
+ }
29
+
30
+ void test('runs one command against the mock and cleans up', async () => {
31
+ const result = await runWithMock([
32
+ process.execPath,
33
+ '-e',
34
+ "fetch('http://127.0.0.1:8787').then(r => { if (r.status !== 404) process.exit(1); console.log('mock-ok') })",
35
+ ]);
36
+
37
+ assert.equal(result.code, 0, result.stderr);
38
+ assert.equal(result.stdout, 'mock-ok\n');
39
+ await assertCleanedUp();
40
+ });
41
+
42
+ void test('preserves command failure and still cleans up', async () => {
43
+ const result = await runWithMock([process.execPath, '-e', 'process.exit(7)']);
44
+
45
+ assert.equal(result.code, 7);
46
+ await assertCleanedUp();
47
+ });
48
+
49
+ void test('does not disturb a process already using the mock port', async () => {
50
+ const existing = createServer((_request, response) => response.end('existing'));
51
+ await new Promise<void>((resolve) => existing.listen(8787, '127.0.0.1', resolve));
52
+ try {
53
+ const result = await runWithMock([process.execPath, '-e', 'process.exit(0)']);
54
+ assert.notEqual(result.code, 0);
55
+ assert.match(result.stderr, /8787.*already in use/i);
56
+ assert.equal(
57
+ await fetch('http://127.0.0.1:8787').then((response) => response.text()),
58
+ 'existing',
59
+ );
60
+ } finally {
61
+ await new Promise<void>((resolve, reject) =>
62
+ existing.close((error) => (error ? reject(error) : resolve())),
63
+ );
64
+ }
65
+ await assert.rejects(access(runDirectory));
66
+ });
67
+
68
+ void test('times out the command and cleans up', async () => {
69
+ const child = spawn(
70
+ process.execPath,
71
+ [
72
+ '--import',
73
+ 'tsx',
74
+ 'test/run-with-mock.ts',
75
+ '--',
76
+ process.execPath,
77
+ '-e',
78
+ 'setTimeout(() => {}, 20_000)',
79
+ ],
80
+ { stdio: 'ignore' },
81
+ );
82
+ const code = await new Promise<number | null>((resolve) => child.once('exit', resolve));
83
+
84
+ assert.equal(code, 124);
85
+ await assertCleanedUp();
86
+ });
@@ -0,0 +1,142 @@
1
+ import { spawn, type ChildProcess } from 'node:child_process';
2
+ import { mkdir, mkdtemp, open, readFile, rm, rmdir, writeFile } from 'node:fs/promises';
3
+ import { createServer } from 'node:http';
4
+ import { join } from 'node:path';
5
+
6
+ import { customer } from '../src/customer.js';
7
+
8
+ const host = '127.0.0.1';
9
+ const port = 8787;
10
+ const startupTimeoutMs = 5_000;
11
+ const commandTimeoutMs = 10_000;
12
+ const shutdownTimeoutMs = 1_000;
13
+
14
+ function wait(ms: number) {
15
+ return new Promise<void>((resolve) => setTimeout(resolve, ms));
16
+ }
17
+
18
+ async function requireFreePort() {
19
+ const probe = createServer();
20
+ await new Promise<void>((resolve, reject) => {
21
+ probe.once('error', reject);
22
+ probe.listen(port, host, resolve);
23
+ }).catch((error: NodeJS.ErrnoException) => {
24
+ if (error.code === 'EADDRINUSE') throw new Error(`Port ${port} is already in use.`);
25
+ throw error;
26
+ });
27
+ await new Promise<void>((resolve, reject) =>
28
+ probe.close((error) => (error ? reject(error) : resolve())),
29
+ );
30
+ }
31
+
32
+ async function waitForMock(child: ChildProcess) {
33
+ const deadline = Date.now() + startupTimeoutMs;
34
+ while (Date.now() < deadline) {
35
+ if (child.exitCode !== null) throw new Error('Mock server exited before it was ready.');
36
+ try {
37
+ await fetch(`http://${host}:${port}`, { signal: AbortSignal.timeout(250) });
38
+ return;
39
+ } catch {
40
+ await wait(50);
41
+ }
42
+ }
43
+ throw new Error(`Mock server did not become ready within ${startupTimeoutMs}ms.`);
44
+ }
45
+
46
+ async function stop(child: ChildProcess | undefined) {
47
+ if (!child || child.exitCode !== null) return;
48
+ const exited = new Promise<void>((resolve) => child.once('exit', () => resolve()));
49
+ child.kill('SIGTERM');
50
+ if (await Promise.race([exited.then(() => true), wait(shutdownTimeoutMs).then(() => false)]))
51
+ return;
52
+ child.kill('SIGKILL');
53
+ await exited;
54
+ }
55
+
56
+ async function runCommand(args: string[], setActive: (child?: ChildProcess) => void) {
57
+ const child = spawn(args[0]!, args.slice(1), {
58
+ env: {
59
+ ...process.env,
60
+ [customer.api.auth.environment_variable]: 'intermesh-mock-token',
61
+ },
62
+ stdio: 'inherit',
63
+ });
64
+ setActive(child);
65
+ let timedOut = false;
66
+ const timer = setTimeout(() => {
67
+ timedOut = true;
68
+ child.kill('SIGTERM');
69
+ }, commandTimeoutMs);
70
+ const code = await new Promise<number>((resolve) => {
71
+ child.once('error', () => resolve(1));
72
+ child.once('exit', (exitCode) => resolve(timedOut ? 124 : (exitCode ?? 1)));
73
+ });
74
+ clearTimeout(timer);
75
+ setActive();
76
+ return code;
77
+ }
78
+
79
+ async function main() {
80
+ const args = process.argv.slice(2);
81
+ if (args[0] === '--') args.shift();
82
+ if (args.length === 0) throw new Error('Provide a command after `pnpm mock:run --`.');
83
+
84
+ let mock: ChildProcess | undefined;
85
+ let command: ChildProcess | undefined;
86
+ let interruptedCode: number | undefined;
87
+ const interrupt = (signal: NodeJS.Signals) => {
88
+ interruptedCode = signal === 'SIGINT' ? 130 : 143;
89
+ command?.kill('SIGTERM');
90
+ mock?.kill('SIGTERM');
91
+ };
92
+ process.once('SIGINT', interrupt);
93
+ process.once('SIGTERM', interrupt);
94
+
95
+ const runRoot = join(process.cwd(), '.mock-run');
96
+ await mkdir(runRoot, { recursive: true });
97
+ const runDirectory = await mkdtemp(join(runRoot, 'run-'));
98
+ try {
99
+ await requireFreePort();
100
+ const log = await open(join(runDirectory, 'mock.log'), 'wx');
101
+ mock = spawn(process.execPath, ['--import', 'tsx', 'mock/server.ts'], {
102
+ stdio: ['ignore', log.fd, log.fd],
103
+ });
104
+ await log.close();
105
+
106
+ const pidFile = join(runDirectory, 'mock.pid.json');
107
+ await writeFile(
108
+ pidFile,
109
+ JSON.stringify({ pid: mock.pid, startedAt: new Date().toISOString() }),
110
+ );
111
+ const recorded: unknown = JSON.parse(await readFile(pidFile, 'utf8'));
112
+ if (
113
+ !recorded ||
114
+ typeof recorded !== 'object' ||
115
+ !('pid' in recorded) ||
116
+ recorded.pid !== mock.pid
117
+ )
118
+ throw new Error('Mock PID record did not match the started process.');
119
+
120
+ await waitForMock(mock);
121
+ const code = await runCommand(args, (child) => {
122
+ command = child;
123
+ });
124
+ return interruptedCode ?? code;
125
+ } finally {
126
+ await stop(command);
127
+ await stop(mock);
128
+ await rm(runDirectory, { recursive: true, force: true });
129
+ await rmdir(runRoot).catch(() => undefined);
130
+ process.removeListener('SIGINT', interrupt);
131
+ process.removeListener('SIGTERM', interrupt);
132
+ }
133
+ }
134
+
135
+ main()
136
+ .then((code) => {
137
+ process.exitCode = code;
138
+ })
139
+ .catch((error: unknown) => {
140
+ process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
141
+ process.exitCode = 1;
142
+ });
@@ -0,0 +1,5 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": { "rootDir": "src", "outDir": "dist" },
4
+ "include": ["src/**/*.ts"]
5
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2024",
4
+ "module": "NodeNext",
5
+ "moduleResolution": "NodeNext",
6
+ "strict": true,
7
+ "skipLibCheck": true,
8
+ "types": ["node"]
9
+ },
10
+ "include": ["src/**/*.ts", "test/**/*.ts", "mock/**/*.ts"]
11
+ }
@@ -0,0 +1,402 @@
1
+ {
2
+ "name": "intermesh-opencode-bootstrap",
3
+ "lockfileVersion": 3,
4
+ "requires": true,
5
+ "packages": {
6
+ "": {
7
+ "name": "intermesh-opencode-bootstrap",
8
+ "dependencies": {
9
+ "@opencode-ai/plugin": "1.18.25"
10
+ }
11
+ },
12
+ "node_modules/@ai-sdk/provider": {
13
+ "version": "3.0.8",
14
+ "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.8.tgz",
15
+ "integrity": "sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ==",
16
+ "license": "Apache-2.0",
17
+ "dependencies": {
18
+ "json-schema": "^0.4.0"
19
+ },
20
+ "engines": {
21
+ "node": ">=18"
22
+ }
23
+ },
24
+ "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": {
25
+ "version": "3.0.4",
26
+ "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.4.tgz",
27
+ "integrity": "sha512-LCkGo6JDfaBhgST7UpPWgNgLINpcpabaHfyz5OBx75nUYxBsaEPxjnyNjWpeb/xBup/682QnBfRBy2/LvPutZQ==",
28
+ "cpu": [
29
+ "arm64"
30
+ ],
31
+ "license": "MIT",
32
+ "optional": true,
33
+ "os": [
34
+ "darwin"
35
+ ]
36
+ },
37
+ "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": {
38
+ "version": "3.0.4",
39
+ "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.4.tgz",
40
+ "integrity": "sha512-zExlW9zUJKZH/tOtVMttwjKa4Xm/3KcNjnE3dPN92uCktwavMxpgCA3MoJK/DOnTWsQgo224OaST27/mPNAf+w==",
41
+ "cpu": [
42
+ "x64"
43
+ ],
44
+ "license": "MIT",
45
+ "optional": true,
46
+ "os": [
47
+ "darwin"
48
+ ]
49
+ },
50
+ "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": {
51
+ "version": "3.0.4",
52
+ "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.4.tgz",
53
+ "integrity": "sha512-Tg3yX65f5GbtXLkrYEHE5oibZG9epyYWas7FogTTEJeDEF9JlXJzKgXaNhT3UXlTOeA+AfZpYZYZ0uPj7Cfquw==",
54
+ "cpu": [
55
+ "arm"
56
+ ],
57
+ "license": "MIT",
58
+ "optional": true,
59
+ "os": [
60
+ "linux"
61
+ ]
62
+ },
63
+ "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": {
64
+ "version": "3.0.4",
65
+ "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.4.tgz",
66
+ "integrity": "sha512-dgX0P/9wGPJeHFBG+ZmhgE6bmtMt7NP5CRBGyyktpopdk/mW4POnrpQsSLtKI1dwpc+pPLuXHDh6vvskyQE/sw==",
67
+ "cpu": [
68
+ "arm64"
69
+ ],
70
+ "license": "MIT",
71
+ "optional": true,
72
+ "os": [
73
+ "linux"
74
+ ]
75
+ },
76
+ "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": {
77
+ "version": "3.0.4",
78
+ "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.4.tgz",
79
+ "integrity": "sha512-8TNXMEjJc3QEy7R/x1INhgiU+XakDAFUzBhaz7+Rbrs8NH5UQeHQxxmzsSBJGyV6I1jW79undiQm8tOI+D+8FQ==",
80
+ "cpu": [
81
+ "x64"
82
+ ],
83
+ "license": "MIT",
84
+ "optional": true,
85
+ "os": [
86
+ "linux"
87
+ ]
88
+ },
89
+ "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": {
90
+ "version": "3.0.4",
91
+ "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.4.tgz",
92
+ "integrity": "sha512-CmCXPQrkbwExx3j946/PtHWHbYJiCRBRDl4BlkRQcJB/YOwQxJRTpoo7aTsortjgoJ1x7opzTSxn7C+ASSLVjQ==",
93
+ "cpu": [
94
+ "x64"
95
+ ],
96
+ "license": "MIT",
97
+ "optional": true,
98
+ "os": [
99
+ "win32"
100
+ ]
101
+ },
102
+ "node_modules/@opencode-ai/plugin": {
103
+ "version": "1.18.25",
104
+ "resolved": "https://registry.npmjs.org/@opencode-ai/plugin/-/plugin-1.18.25.tgz",
105
+ "integrity": "sha512-Kb34zFqYosFNiMd1IuYiZGjX17z+18Srm7tHZMCz+uMVRTYNkEw1FTrfAK2FLbggwYdgzifGwKMNF1slLT8eLw==",
106
+ "license": "MIT",
107
+ "dependencies": {
108
+ "@ai-sdk/provider": "3.0.8",
109
+ "@opencode-ai/sdk": "1.18.25",
110
+ "effect": "4.0.0-beta.83",
111
+ "zod": "4.1.8"
112
+ },
113
+ "peerDependencies": {
114
+ "@opentui/core": ">=0.4.5",
115
+ "@opentui/keymap": ">=0.4.5",
116
+ "@opentui/solid": ">=0.4.5"
117
+ },
118
+ "peerDependenciesMeta": {
119
+ "@opentui/core": {
120
+ "optional": true
121
+ },
122
+ "@opentui/keymap": {
123
+ "optional": true
124
+ },
125
+ "@opentui/solid": {
126
+ "optional": true
127
+ }
128
+ }
129
+ },
130
+ "node_modules/@opencode-ai/sdk": {
131
+ "version": "1.18.25",
132
+ "resolved": "https://registry.npmjs.org/@opencode-ai/sdk/-/sdk-1.18.25.tgz",
133
+ "integrity": "sha512-GwgwhW+vE8FWSDw730SjzqNhsWXB0uJjbFOiqFkmM+USFuG13HuTlGe6SR2ixt+WXxoD6FV1hILWqsXyqej9hQ==",
134
+ "license": "MIT",
135
+ "dependencies": {
136
+ "cross-spawn": "7.0.6"
137
+ }
138
+ },
139
+ "node_modules/@standard-schema/spec": {
140
+ "version": "1.1.0",
141
+ "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz",
142
+ "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==",
143
+ "license": "MIT"
144
+ },
145
+ "node_modules/cross-spawn": {
146
+ "version": "7.0.6",
147
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
148
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
149
+ "license": "MIT",
150
+ "dependencies": {
151
+ "path-key": "^3.1.0",
152
+ "shebang-command": "^2.0.0",
153
+ "which": "^2.0.1"
154
+ },
155
+ "engines": {
156
+ "node": ">= 8"
157
+ }
158
+ },
159
+ "node_modules/detect-libc": {
160
+ "version": "2.1.2",
161
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
162
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
163
+ "license": "Apache-2.0",
164
+ "optional": true,
165
+ "engines": {
166
+ "node": ">=8"
167
+ }
168
+ },
169
+ "node_modules/effect": {
170
+ "version": "4.0.0-beta.83",
171
+ "resolved": "https://registry.npmjs.org/effect/-/effect-4.0.0-beta.83.tgz",
172
+ "integrity": "sha512-0wsak8RtgGAr9UWSbVDgJHZcUqMSvicHcvaZv1MbMM7MCGgW4Rn/137J1MHQbwYPcwYGxT/IqehFd+UbYuj78w==",
173
+ "license": "MIT",
174
+ "dependencies": {
175
+ "@standard-schema/spec": "^1.1.0",
176
+ "fast-check": "^4.8.0",
177
+ "find-my-way-ts": "^0.1.6",
178
+ "ini": "^7.0.0",
179
+ "kubernetes-types": "^1.30.0",
180
+ "msgpackr": "^2.0.1",
181
+ "multipasta": "^0.2.7",
182
+ "toml": "^4.1.1",
183
+ "uuid": "^14.0.0",
184
+ "yaml": "^2.9.0"
185
+ }
186
+ },
187
+ "node_modules/fast-check": {
188
+ "version": "4.9.0",
189
+ "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-4.9.0.tgz",
190
+ "integrity": "sha512-7ms6T7SybUev/PQITciI0yLM2pOSFy5zpG8Ty7tQofcVaQUvrMXp6CBwqF6fThLCLOrfBtuHAtwq6Yu4XPCllg==",
191
+ "funding": [
192
+ {
193
+ "type": "individual",
194
+ "url": "https://github.com/sponsors/dubzzz"
195
+ },
196
+ {
197
+ "type": "opencollective",
198
+ "url": "https://opencollective.com/fast-check"
199
+ }
200
+ ],
201
+ "license": "MIT",
202
+ "dependencies": {
203
+ "pure-rand": "^8.0.0"
204
+ },
205
+ "engines": {
206
+ "node": ">=12.17.0"
207
+ }
208
+ },
209
+ "node_modules/find-my-way-ts": {
210
+ "version": "0.1.6",
211
+ "resolved": "https://registry.npmjs.org/find-my-way-ts/-/find-my-way-ts-0.1.6.tgz",
212
+ "integrity": "sha512-a85L9ZoXtNAey3Y6Z+eBWW658kO/MwR7zIafkIUPUMf3isZG0NCs2pjW2wtjxAKuJPxMAsHUIP4ZPGv0o5gyTA==",
213
+ "license": "MIT"
214
+ },
215
+ "node_modules/ini": {
216
+ "version": "7.0.0",
217
+ "resolved": "https://registry.npmjs.org/ini/-/ini-7.0.0.tgz",
218
+ "integrity": "sha512-ifK0CgjALofS5bkrcTy4RaQ9Vx2Knf/eLeIO+NaswQEpH1UblrtTSCIvN71qQDMq0PeQ/SSPojvEJp9vvvfr+w==",
219
+ "license": "ISC",
220
+ "engines": {
221
+ "node": "^22.22.2 || ^24.15.0 || >=26.0.0"
222
+ }
223
+ },
224
+ "node_modules/isexe": {
225
+ "version": "2.0.0",
226
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
227
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
228
+ "license": "ISC"
229
+ },
230
+ "node_modules/json-schema": {
231
+ "version": "0.4.0",
232
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
233
+ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
234
+ "license": "(AFL-2.1 OR BSD-3-Clause)"
235
+ },
236
+ "node_modules/kubernetes-types": {
237
+ "version": "1.30.0",
238
+ "resolved": "https://registry.npmjs.org/kubernetes-types/-/kubernetes-types-1.30.0.tgz",
239
+ "integrity": "sha512-Dew1okvhM/SQcIa2rcgujNndZwU8VnSapDgdxlYoB84ZlpAD43U6KLAFqYo17ykSFGHNPrg0qry0bP+GJd9v7Q==",
240
+ "license": "Apache-2.0"
241
+ },
242
+ "node_modules/msgpackr": {
243
+ "version": "2.1.0",
244
+ "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-2.1.0.tgz",
245
+ "integrity": "sha512-p/pBCVO63CsvvpkomUnNNag6+n38rULuDA6HHe70o2gtC8ODI52foF/4ko2qQcp6OiErJXTmrZeXmsGGHsIQNQ==",
246
+ "license": "MIT",
247
+ "optionalDependencies": {
248
+ "msgpackr-extract": "^3.0.4"
249
+ }
250
+ },
251
+ "node_modules/msgpackr-extract": {
252
+ "version": "3.0.4",
253
+ "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.4.tgz",
254
+ "integrity": "sha512-4kmO/MdyUIkLIvTPr8VHLil4AtoKIoniWPIEk5+CDy0xnWC84azhSFmuJ7PxZdsYtiP5kEeQsORAVIeMgxT+Hw==",
255
+ "hasInstallScript": true,
256
+ "license": "MIT",
257
+ "optional": true,
258
+ "dependencies": {
259
+ "node-gyp-build-optional-packages": "5.2.2"
260
+ },
261
+ "bin": {
262
+ "download-msgpackr-prebuilds": "bin/download-prebuilds.js"
263
+ },
264
+ "optionalDependencies": {
265
+ "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.4",
266
+ "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.4",
267
+ "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.4",
268
+ "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.4",
269
+ "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.4",
270
+ "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.4"
271
+ }
272
+ },
273
+ "node_modules/multipasta": {
274
+ "version": "0.2.8",
275
+ "resolved": "https://registry.npmjs.org/multipasta/-/multipasta-0.2.8.tgz",
276
+ "integrity": "sha512-ZPWuMKyv0cSO29f7hozp+k6+crZbQijV8ipMvxNxRf2SwtYGTX1ZX89Kd20VV4H9Znonx+EQn+iy1wGQsJ+b+Q==",
277
+ "license": "MIT"
278
+ },
279
+ "node_modules/node-gyp-build-optional-packages": {
280
+ "version": "5.2.2",
281
+ "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz",
282
+ "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==",
283
+ "license": "MIT",
284
+ "optional": true,
285
+ "dependencies": {
286
+ "detect-libc": "^2.0.1"
287
+ },
288
+ "bin": {
289
+ "node-gyp-build-optional-packages": "bin.js",
290
+ "node-gyp-build-optional-packages-optional": "optional.js",
291
+ "node-gyp-build-optional-packages-test": "build-test.js"
292
+ }
293
+ },
294
+ "node_modules/path-key": {
295
+ "version": "3.1.1",
296
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
297
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
298
+ "license": "MIT",
299
+ "engines": {
300
+ "node": ">=8"
301
+ }
302
+ },
303
+ "node_modules/pure-rand": {
304
+ "version": "8.4.2",
305
+ "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-8.4.2.tgz",
306
+ "integrity": "sha512-vvuOGgcuPJAirlHvuQw1TrOiw7ptaIXXmIbNuiNOY6lNGJJH49PQ1Kj4nd783nPdQhQdicgOjVI2yI/9BD6/Ng==",
307
+ "funding": [
308
+ {
309
+ "type": "individual",
310
+ "url": "https://github.com/sponsors/dubzzz"
311
+ },
312
+ {
313
+ "type": "opencollective",
314
+ "url": "https://opencollective.com/fast-check"
315
+ }
316
+ ],
317
+ "license": "MIT"
318
+ },
319
+ "node_modules/shebang-command": {
320
+ "version": "2.0.0",
321
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
322
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
323
+ "license": "MIT",
324
+ "dependencies": {
325
+ "shebang-regex": "^3.0.0"
326
+ },
327
+ "engines": {
328
+ "node": ">=8"
329
+ }
330
+ },
331
+ "node_modules/shebang-regex": {
332
+ "version": "3.0.0",
333
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
334
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
335
+ "license": "MIT",
336
+ "engines": {
337
+ "node": ">=8"
338
+ }
339
+ },
340
+ "node_modules/toml": {
341
+ "version": "4.3.0",
342
+ "resolved": "https://registry.npmjs.org/toml/-/toml-4.3.0.tgz",
343
+ "integrity": "sha512-lVb8X9BsPVuH0M4BKeS91tXAmJvCjQ5UIyAbQFaxkKGyUFK2RPkhwaFSQH8vbpl1d23eu/IBH+dwVMHWaq9A5A==",
344
+ "license": "MIT",
345
+ "engines": {
346
+ "node": ">=20"
347
+ }
348
+ },
349
+ "node_modules/uuid": {
350
+ "version": "14.0.2",
351
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.2.tgz",
352
+ "integrity": "sha512-xZe/16rV4aa+HGSOCiY2YeLT1OybRLrrkL/Rqaq7p7GMVXjFh+6wN4oMYgjFmnSnhY8t6Xpdl2l9qmnHYuMHwQ==",
353
+ "funding": [
354
+ "https://github.com/sponsors/broofa",
355
+ "https://github.com/sponsors/ctavan"
356
+ ],
357
+ "license": "MIT",
358
+ "bin": {
359
+ "uuid": "dist-node/bin/uuid"
360
+ }
361
+ },
362
+ "node_modules/which": {
363
+ "version": "2.0.2",
364
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
365
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
366
+ "license": "ISC",
367
+ "dependencies": {
368
+ "isexe": "^2.0.0"
369
+ },
370
+ "bin": {
371
+ "node-which": "bin/node-which"
372
+ },
373
+ "engines": {
374
+ "node": ">= 8"
375
+ }
376
+ },
377
+ "node_modules/yaml": {
378
+ "version": "2.9.0",
379
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz",
380
+ "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==",
381
+ "license": "ISC",
382
+ "bin": {
383
+ "yaml": "bin.mjs"
384
+ },
385
+ "engines": {
386
+ "node": ">= 14.6"
387
+ },
388
+ "funding": {
389
+ "url": "https://github.com/sponsors/eemeli"
390
+ }
391
+ },
392
+ "node_modules/zod": {
393
+ "version": "4.1.8",
394
+ "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.8.tgz",
395
+ "integrity": "sha512-5R1P+WwQqmmMIEACyzSvo4JXHY5WiAFHRMg+zBZKgKS+Q1viRa0C1hmUKtHltoIFKtIdki3pRxkmpP74jnNYHQ==",
396
+ "license": "MIT",
397
+ "funding": {
398
+ "url": "https://github.com/sponsors/colinhacks"
399
+ }
400
+ }
401
+ }
402
+ }