@fusionkit/cli 0.1.5 → 0.1.6
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/README.md +24 -2
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +1 -0
- package/dist/commands/ensemble-gateway.js +0 -2
- package/dist/commands/ensemble-records.d.ts +2 -1
- package/dist/commands/ensemble-records.js +3 -1
- package/dist/commands/ensemble.js +3 -4
- package/dist/commands/fusion.js +0 -5
- package/dist/commands/local.js +3 -3
- package/dist/cursor-acp.d.ts +3 -5
- package/dist/cursor-acp.js +12 -11
- package/dist/dashboard.d.ts +65 -0
- package/dist/dashboard.js +587 -0
- package/dist/fusion/env.d.ts +108 -0
- package/dist/fusion/env.js +98 -0
- package/dist/fusion/observability.d.ts +39 -0
- package/dist/fusion/observability.js +227 -0
- package/dist/fusion/preflight.d.ts +12 -0
- package/dist/fusion/preflight.js +42 -0
- package/dist/fusion/stack.d.ts +62 -0
- package/dist/fusion/stack.js +295 -0
- package/dist/fusion-config.d.ts +0 -1
- package/dist/fusion-config.js +0 -6
- package/dist/fusion-init.js +2 -11
- package/dist/fusion-quickstart.d.ts +11 -222
- package/dist/fusion-quickstart.js +57 -759
- package/dist/gateway.d.ts +0 -2
- package/dist/gateway.js +0 -2
- package/dist/local.d.ts +10 -17
- package/dist/local.js +50 -116
- package/dist/shared/options.d.ts +2 -1
- package/dist/shared/options.js +13 -19
- package/dist/shared/proc.d.ts +4 -70
- package/dist/shared/proc.js +3 -228
- package/dist/test/cli.test.js +8 -3
- package/dist/test/dashboard.test.d.ts +1 -0
- package/dist/test/dashboard.test.js +214 -0
- package/dist/test/gateway-e2e.test.js +13 -10
- package/dist/test/local.test.js +4 -4
- package/dist/tools.d.ts +2 -0
- package/dist/tools.js +25 -0
- package/package.json +14 -9
- package/scope/.next/BUILD_ID +1 -1
- package/scope/.next/app-build-manifest.json +16 -16
- package/scope/.next/app-path-routes-manifest.json +4 -4
- package/scope/.next/build-manifest.json +2 -2
- package/scope/.next/prerender-manifest.json +9 -9
- package/scope/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/scope/.next/server/app/_not-found.html +1 -1
- package/scope/.next/server/app/_not-found.rsc +1 -1
- package/scope/.next/server/app/api/environments/route_client-reference-manifest.js +1 -1
- package/scope/.next/server/app/api/ingest/route_client-reference-manifest.js +1 -1
- package/scope/.next/server/app/api/models/route_client-reference-manifest.js +1 -1
- package/scope/.next/server/app/api/replay/route_client-reference-manifest.js +1 -1
- package/scope/.next/server/app/api/sessions/[traceId]/route_client-reference-manifest.js +1 -1
- package/scope/.next/server/app/api/sessions/route_client-reference-manifest.js +1 -1
- package/scope/.next/server/app/api/stream/route_client-reference-manifest.js +1 -1
- package/scope/.next/server/app/environments/page_client-reference-manifest.js +1 -1
- package/scope/.next/server/app/environments.html +1 -1
- package/scope/.next/server/app/environments.rsc +1 -1
- package/scope/.next/server/app/index.html +1 -1
- package/scope/.next/server/app/index.rsc +1 -1
- package/scope/.next/server/app/models/page_client-reference-manifest.js +1 -1
- package/scope/.next/server/app/models.html +1 -1
- package/scope/.next/server/app/models.rsc +1 -1
- package/scope/.next/server/app/page_client-reference-manifest.js +1 -1
- package/scope/.next/server/app/sessions/[traceId]/page_client-reference-manifest.js +1 -1
- package/scope/.next/server/app-paths-manifest.json +4 -4
- package/scope/.next/server/functions-config-manifest.json +2 -2
- package/scope/.next/server/pages/404.html +1 -1
- package/scope/.next/server/pages/500.html +1 -1
- package/scope/.next/server/server-reference-manifest.json +1 -1
- /package/scope/.next/static/{vxqImMqlOwssVTua5Facf → x7wPUCpgS31-5ZHJkcKsU}/_buildManifest.js +0 -0
- /package/scope/.next/static/{vxqImMqlOwssVTua5Facf → x7wPUCpgS31-5ZHJkcKsU}/_ssgManifest.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { test } from "node:test";
|
|
6
|
+
import { assertHarnessRunResultV1 } from "@fusionkit/protocol";
|
|
7
|
+
import { gitText } from "@fusionkit/workspace";
|
|
8
|
+
import { createMockHarness } from "@fusionkit/ensemble";
|
|
9
|
+
import { createHarnessCapabilityMatrix, runHarnessSmokeDashboard } from "../dashboard.js";
|
|
10
|
+
function makeRepo() {
|
|
11
|
+
const root = mkdtempSync(join(tmpdir(), "ensemble-dashboard-"));
|
|
12
|
+
const repo = join(root, "repo");
|
|
13
|
+
mkdirSync(repo);
|
|
14
|
+
gitText(repo, ["init", "--quiet", "--initial-branch=main"]);
|
|
15
|
+
gitText(repo, ["config", "user.email", "dashboard@warrant.local"]);
|
|
16
|
+
gitText(repo, ["config", "user.name", "dashboard"]);
|
|
17
|
+
writeFileSync(join(repo, "README.md"), "# dashboard\n");
|
|
18
|
+
gitText(repo, ["add", "-A"]);
|
|
19
|
+
gitText(repo, ["commit", "--quiet", "-m", "init"]);
|
|
20
|
+
return {
|
|
21
|
+
repo,
|
|
22
|
+
outputRoot: join(root, "dashboard-out"),
|
|
23
|
+
cleanup: () => rmSync(root, { recursive: true, force: true })
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
test("capability matrix covers Cursor, Claude Code, Codex, command, and mock", () => {
|
|
27
|
+
const matrix = createHarnessCapabilityMatrix({ env: {} });
|
|
28
|
+
const harnessIds = matrix.rows.map((row) => row.harnessId);
|
|
29
|
+
assert.deepEqual(harnessIds, ["codex", "claude-code", "cursor", "command", "mock"]);
|
|
30
|
+
assert.ok(matrix.capabilities.includes("model_override"));
|
|
31
|
+
assert.ok(matrix.capabilities.includes("transcript_capture"));
|
|
32
|
+
assert.ok(matrix.capabilities.includes("diff_capture"));
|
|
33
|
+
assert.ok(matrix.capabilities.includes("tool_loop_capture"));
|
|
34
|
+
assert.ok(matrix.capabilities.includes("patch_apply_visibility"));
|
|
35
|
+
assert.ok(matrix.capabilities.includes("route_model_observation"));
|
|
36
|
+
assert.ok(matrix.capabilities.includes("verification_hint"));
|
|
37
|
+
assert.ok(matrix.capabilities.includes("replay_support"));
|
|
38
|
+
assert.ok(matrix.capabilities.includes("workspace_read"));
|
|
39
|
+
assert.ok(matrix.capabilities.includes("verification"));
|
|
40
|
+
assert.equal(matrix.rows.find((row) => row.harnessId === "cursor")?.availability, "credential_gated");
|
|
41
|
+
assert.equal(matrix.rows.find((row) => row.harnessId === "claude-code")?.harnessKind, "claude_code");
|
|
42
|
+
assert.equal(matrix.rows.find((row) => row.harnessId === "codex")?.harnessKind, "codex");
|
|
43
|
+
});
|
|
44
|
+
test("smoke dashboard writes schema-valid success, failure, skipped, and missing records", async () => {
|
|
45
|
+
const fixture = makeRepo();
|
|
46
|
+
try {
|
|
47
|
+
const dashboard = await runHarnessSmokeDashboard({
|
|
48
|
+
repo: fixture.repo,
|
|
49
|
+
outputRoot: fixture.outputRoot,
|
|
50
|
+
timeoutMs: 1_000,
|
|
51
|
+
createdAt: "2026-06-16T00:00:00.000Z"
|
|
52
|
+
});
|
|
53
|
+
assert.equal(dashboard.records.length, 6);
|
|
54
|
+
assert.equal(existsSync(dashboard.dashboardPath), true);
|
|
55
|
+
for (const record of dashboard.records) {
|
|
56
|
+
assertHarnessRunResultV1(record.result);
|
|
57
|
+
assert.equal(existsSync(record.resultPath), true);
|
|
58
|
+
const written = JSON.parse(readFileSync(record.resultPath, "utf8"));
|
|
59
|
+
assertHarnessRunResultV1(written);
|
|
60
|
+
}
|
|
61
|
+
const statuses = dashboard.records.map((record) => record.result.status).sort();
|
|
62
|
+
assert.deepEqual(statuses, [
|
|
63
|
+
"failed",
|
|
64
|
+
"skipped",
|
|
65
|
+
"skipped",
|
|
66
|
+
"skipped",
|
|
67
|
+
"succeeded",
|
|
68
|
+
"succeeded"
|
|
69
|
+
]);
|
|
70
|
+
assert.equal(dashboard.records.find((record) => record.taskId === "claude-code-skipped")?.result
|
|
71
|
+
.harness_kind, "claude_code");
|
|
72
|
+
assert.equal(dashboard.records.find((record) => record.taskId === "codex-skipped")?.result.harness_kind, "codex");
|
|
73
|
+
assert.equal(dashboard.records.find((record) => record.taskId === "cursor-skipped")?.result.harness_kind, "cursor");
|
|
74
|
+
assert.equal(dashboard.records.find((record) => record.taskId === "cursor-skipped")?.result.status, "skipped");
|
|
75
|
+
const markdown = readFileSync(dashboard.dashboardPath, "utf8");
|
|
76
|
+
assert.match(markdown, /# HandoffKit Harness Smoke Dashboard/);
|
|
77
|
+
assert.match(markdown, /## Capability Matrix/);
|
|
78
|
+
assert.match(markdown, /## Adapter Readiness/);
|
|
79
|
+
assert.match(markdown, /contract\/mock ready/);
|
|
80
|
+
assert.match(markdown, /credentials missing\/skipped/);
|
|
81
|
+
assert.match(markdown, /live smoke not requested/);
|
|
82
|
+
assert.match(markdown, /command-failure/);
|
|
83
|
+
assert.match(markdown, /cursor-skipped/);
|
|
84
|
+
assert.match(markdown, /harness-run-results\/mock-success\.json/);
|
|
85
|
+
assert.equal(dashboard.readiness.length, 5);
|
|
86
|
+
}
|
|
87
|
+
finally {
|
|
88
|
+
fixture.cleanup();
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
test("smoke dashboard only adds live records when explicit smoke env is enabled", async () => {
|
|
92
|
+
const fixture = makeRepo();
|
|
93
|
+
try {
|
|
94
|
+
const dashboard = await runHarnessSmokeDashboard({
|
|
95
|
+
repo: fixture.repo,
|
|
96
|
+
outputRoot: fixture.outputRoot,
|
|
97
|
+
timeoutMs: 1_000,
|
|
98
|
+
createdAt: "2026-06-16T00:00:00.000Z",
|
|
99
|
+
env: {},
|
|
100
|
+
liveSmoke: ["claude-code", "codex"]
|
|
101
|
+
});
|
|
102
|
+
assert.equal(dashboard.records.length, 6);
|
|
103
|
+
assert.equal(dashboard.records.some((record) => record.purpose === "live"), false);
|
|
104
|
+
}
|
|
105
|
+
finally {
|
|
106
|
+
fixture.cleanup();
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
test("explicit live smoke without credentials records a failed preflight", async () => {
|
|
110
|
+
const fixture = makeRepo();
|
|
111
|
+
try {
|
|
112
|
+
const dashboard = await runHarnessSmokeDashboard({
|
|
113
|
+
repo: fixture.repo,
|
|
114
|
+
outputRoot: fixture.outputRoot,
|
|
115
|
+
timeoutMs: 1_000,
|
|
116
|
+
createdAt: "2026-06-16T00:00:00.000Z",
|
|
117
|
+
env: { WARRANT_CLAUDE_SMOKE: "1" },
|
|
118
|
+
liveSmoke: ["claude-code"]
|
|
119
|
+
});
|
|
120
|
+
const live = dashboard.records.find((record) => record.taskId === "claude-code-live");
|
|
121
|
+
assert.equal(live?.purpose, "live");
|
|
122
|
+
assert.equal(live?.result.status, "failed");
|
|
123
|
+
assert.match(live?.result.output_summary ?? "", /Explicit live smoke failed before launch/);
|
|
124
|
+
assert.equal(dashboard.readiness.find((row) => row.harnessId === "claude-code")?.liveSmoke, "live smoke failed");
|
|
125
|
+
}
|
|
126
|
+
finally {
|
|
127
|
+
fixture.cleanup();
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
test("live smoke readiness reports sanitized local evidence refs", async () => {
|
|
131
|
+
const fixture = makeRepo();
|
|
132
|
+
const privateTranscript = "raw private transcript should not render";
|
|
133
|
+
try {
|
|
134
|
+
const claudeHarness = {
|
|
135
|
+
...createMockHarness({
|
|
136
|
+
id: "claude-code-live-mock",
|
|
137
|
+
candidates: {
|
|
138
|
+
claude: {
|
|
139
|
+
transcript: privateTranscript,
|
|
140
|
+
artifacts: [
|
|
141
|
+
{
|
|
142
|
+
artifact_id: "claude_safe_log",
|
|
143
|
+
kind: "log",
|
|
144
|
+
hash: `sha256:${"a".repeat(64)}`,
|
|
145
|
+
uri: "file:///tmp/private-claude.log",
|
|
146
|
+
redaction_status: "synthetic"
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
artifact_id: "claude_raw_transcript",
|
|
150
|
+
kind: "transcript",
|
|
151
|
+
hash: `sha256:${"b".repeat(64)}`,
|
|
152
|
+
uri: "file:///tmp/raw-claude.txt",
|
|
153
|
+
redaction_status: "raw"
|
|
154
|
+
}
|
|
155
|
+
]
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}),
|
|
159
|
+
harnessKind: "claude_code"
|
|
160
|
+
};
|
|
161
|
+
const codexHarness = {
|
|
162
|
+
...createMockHarness({
|
|
163
|
+
id: "codex-live-mock",
|
|
164
|
+
candidates: {
|
|
165
|
+
codex: {
|
|
166
|
+
transcript: "codex private transcript should not render",
|
|
167
|
+
artifacts: [
|
|
168
|
+
{
|
|
169
|
+
artifact_id: "codex_safe_log",
|
|
170
|
+
kind: "log",
|
|
171
|
+
hash: `sha256:${"c".repeat(64)}`,
|
|
172
|
+
uri: "file:///tmp/private-codex.log",
|
|
173
|
+
redaction_status: "synthetic"
|
|
174
|
+
}
|
|
175
|
+
]
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}),
|
|
179
|
+
harnessKind: "codex"
|
|
180
|
+
};
|
|
181
|
+
const dashboard = await runHarnessSmokeDashboard({
|
|
182
|
+
repo: fixture.repo,
|
|
183
|
+
outputRoot: fixture.outputRoot,
|
|
184
|
+
timeoutMs: 1_000,
|
|
185
|
+
createdAt: "2026-06-16T00:00:00.000Z",
|
|
186
|
+
env: {
|
|
187
|
+
WARRANT_ENSEMBLE_LIVE_SMOKE: "1",
|
|
188
|
+
VERCEL_TOKEN: "vercel-test",
|
|
189
|
+
ANTHROPIC_API_KEY: "anthropic-test",
|
|
190
|
+
CODEX_API_KEY: "codex-test"
|
|
191
|
+
},
|
|
192
|
+
liveSmoke: ["claude-code", "codex"],
|
|
193
|
+
liveSmokeHarnesses: {
|
|
194
|
+
"claude-code": claudeHarness,
|
|
195
|
+
codex: codexHarness
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
assert.equal(dashboard.records.length, 8);
|
|
199
|
+
assert.equal(dashboard.records.find((record) => record.taskId === "claude-code-live")?.result.status, "succeeded");
|
|
200
|
+
assert.equal(dashboard.records.find((record) => record.taskId === "codex-live")?.result.status, "succeeded");
|
|
201
|
+
assert.equal(dashboard.readiness.find((row) => row.harnessId === "claude-code")?.liveSmoke, "live smoke passed");
|
|
202
|
+
assert.equal(dashboard.readiness.find((row) => row.harnessId === "codex")?.liveSmoke, "live smoke passed");
|
|
203
|
+
const markdown = readFileSync(dashboard.dashboardPath, "utf8");
|
|
204
|
+
assert.match(markdown, /log:claude_safe_log:sha256/);
|
|
205
|
+
assert.match(markdown, /log:codex_safe_log:sha256/);
|
|
206
|
+
assert.match(markdown, /raw artifact ref\(s\) withheld/);
|
|
207
|
+
assert.equal(markdown.includes(privateTranscript), false);
|
|
208
|
+
assert.equal(markdown.includes("file:///tmp/private-claude.log"), false);
|
|
209
|
+
assert.equal(markdown.includes("file:///tmp/private-codex.log"), false);
|
|
210
|
+
}
|
|
211
|
+
finally {
|
|
212
|
+
fixture.cleanup();
|
|
213
|
+
}
|
|
214
|
+
});
|
|
@@ -9,6 +9,7 @@ import { PassThrough } from "node:stream";
|
|
|
9
9
|
import { fileURLToPath } from "node:url";
|
|
10
10
|
import { after, before, test } from "node:test";
|
|
11
11
|
import { FUSION_REPORT_HEADER, FUSION_RUN_ID_HEADER, runAcpAgent, runFrontDoorAcceptance } from "@fusionkit/model-gateway";
|
|
12
|
+
import { resolveCursorkitCli } from "@fusionkit/ensemble";
|
|
12
13
|
import { buildAcpRunner, startConfiguredGateway } from "../gateway.js";
|
|
13
14
|
/**
|
|
14
15
|
* Comprehensive front-door e2e. Exercises the real chain end to end:
|
|
@@ -386,7 +387,9 @@ test("unified acceptance suite passes every reachable front door against the rea
|
|
|
386
387
|
assert.equal(statusOf("cursor-acp"), "blocked");
|
|
387
388
|
assert.ok(backend.judgeCallCount() >= 4, "judge synthesis must hit the model backend per front door");
|
|
388
389
|
});
|
|
389
|
-
const LIVE_CLAUDE = process.env.WARRANT_GATEWAY_LIVE_CLAUDE === "1"
|
|
390
|
+
const LIVE_CLAUDE = (process.env.FUSIONKIT_GATEWAY_LIVE_CLAUDE ?? process.env.WARRANT_GATEWAY_LIVE_CLAUDE) === "1"
|
|
391
|
+
? false
|
|
392
|
+
: "set FUSIONKIT_GATEWAY_LIVE_CLAUDE=1 with a working claude CLI";
|
|
390
393
|
test("live: real Claude Code CLI drives the gateway fusion run and receives the synthesized answer", { skip: LIVE_CLAUDE }, async () => {
|
|
391
394
|
// A dedicated single-model gateway keeps the live run light: each Claude
|
|
392
395
|
// model call triggers one real unified harness run (worktree + command +
|
|
@@ -429,7 +432,9 @@ test("live: real Claude Code CLI drives the gateway fusion run and receives the
|
|
|
429
432
|
await liveGateway.close();
|
|
430
433
|
}
|
|
431
434
|
});
|
|
432
|
-
const LIVE_CODEX = process.env.WARRANT_GATEWAY_LIVE_CODEX === "1"
|
|
435
|
+
const LIVE_CODEX = (process.env.FUSIONKIT_GATEWAY_LIVE_CODEX ?? process.env.WARRANT_GATEWAY_LIVE_CODEX) === "1"
|
|
436
|
+
? false
|
|
437
|
+
: "set FUSIONKIT_GATEWAY_LIVE_CODEX=1 with a working codex CLI";
|
|
433
438
|
test("live: real Codex CLI drives the gateway fusion run and receives the synthesized answer", { skip: LIVE_CODEX }, async () => {
|
|
434
439
|
// Codex streams `/v1/responses`; the gateway must emit the Responses SSE
|
|
435
440
|
// sequence ending in response.completed for Codex to accept the answer.
|
|
@@ -482,15 +487,14 @@ test("live: real Codex CLI drives the gateway fusion run and receives the synthe
|
|
|
482
487
|
rmSync(codexHome, { recursive: true, force: true });
|
|
483
488
|
}
|
|
484
489
|
});
|
|
485
|
-
// Drives the real cursor-agent CLI in ACP mode through the
|
|
490
|
+
// Drives the real cursor-agent CLI in ACP mode through the bundled Cursorkit
|
|
486
491
|
// bridge, whose local model backend is pointed at this gateway. Requires a
|
|
487
|
-
// logged-in cursor-agent
|
|
488
|
-
const
|
|
489
|
-
const LIVE_CURSOR = process.env.WARRANT_GATEWAY_LIVE_CURSOR === "1" && CURSORKIT_DIR !== undefined
|
|
492
|
+
// logged-in cursor-agent (Cursorkit is bundled as an npm dependency).
|
|
493
|
+
const LIVE_CURSOR = (process.env.FUSIONKIT_GATEWAY_LIVE_CURSOR ?? process.env.WARRANT_GATEWAY_LIVE_CURSOR) === "1"
|
|
490
494
|
? false
|
|
491
|
-
: "set
|
|
495
|
+
: "set FUSIONKIT_GATEWAY_LIVE_CURSOR=1 with a logged-in cursor-agent";
|
|
492
496
|
test("live: real cursor-agent (ACP) drives the Cursorkit bridge into the gateway fusion run", { skip: LIVE_CURSOR }, async () => {
|
|
493
|
-
const
|
|
497
|
+
const { serveCli } = resolveCursorkitCli();
|
|
494
498
|
const liveGateway = await startConfiguredGateway({
|
|
495
499
|
config: { ...config, models: [{ id: "cursor-panel", model: "fusion-cursor" }] },
|
|
496
500
|
host: "127.0.0.1",
|
|
@@ -519,8 +523,7 @@ test("live: real cursor-agent (ACP) drives the Cursorkit bridge into the gateway
|
|
|
519
523
|
MODEL_PROVIDER_MODEL: "fusion-panel",
|
|
520
524
|
MODEL_CONTEXT_TOKEN_LIMIT: "128000"
|
|
521
525
|
});
|
|
522
|
-
const bridge = spawn(process.execPath, [
|
|
523
|
-
cwd: cursorkitDir,
|
|
526
|
+
const bridge = spawn(process.execPath, [serveCli, "serve"], {
|
|
524
527
|
env: bridgeEnv,
|
|
525
528
|
stdio: ["ignore", "pipe", "pipe"]
|
|
526
529
|
});
|
package/dist/test/local.test.js
CHANGED
|
@@ -13,23 +13,23 @@ test("claudeEnv points Claude Code at the gateway's Anthropic surface", () => {
|
|
|
13
13
|
});
|
|
14
14
|
test("claudeEnv falls back to a placeholder auth token", () => {
|
|
15
15
|
const env = claudeEnv("http://127.0.0.1:9000");
|
|
16
|
-
assert.equal(env.ANTHROPIC_AUTH_TOKEN, "
|
|
16
|
+
assert.equal(env.ANTHROPIC_AUTH_TOKEN, "fusionkit-local");
|
|
17
17
|
});
|
|
18
18
|
test("codexConfigToml declares a Responses provider at the gateway", () => {
|
|
19
19
|
const toml = codexConfigToml("http://127.0.0.1:9000", "local-model");
|
|
20
20
|
assert.ok(toml.includes('model = "local-model"'));
|
|
21
|
-
assert.ok(toml.includes("[model_providers.
|
|
21
|
+
assert.ok(toml.includes("[model_providers.fusionkit-local]"));
|
|
22
22
|
assert.ok(toml.includes('base_url = "http://127.0.0.1:9000/v1"'));
|
|
23
23
|
assert.ok(toml.includes('wire_api = "responses"'));
|
|
24
24
|
assert.ok(toml.includes("requires_openai_auth = false"));
|
|
25
25
|
});
|
|
26
26
|
test("opencodeConfig registers an OpenAI-compatible provider", () => {
|
|
27
27
|
const config = opencodeConfig("http://127.0.0.1:9000", "local-model");
|
|
28
|
-
const provider = config.provider["
|
|
28
|
+
const provider = config.provider["fusionkit-local"];
|
|
29
29
|
assert.equal(provider?.npm, "@ai-sdk/openai-compatible");
|
|
30
30
|
assert.equal(provider?.options.baseURL, "http://127.0.0.1:9000/v1");
|
|
31
31
|
assert.ok("local-model" in (provider?.models ?? {}));
|
|
32
|
-
assert.equal(opencodeModelArg("local-model"), "
|
|
32
|
+
assert.equal(opencodeModelArg("local-model"), "fusionkit-local/local-model");
|
|
33
33
|
});
|
|
34
34
|
test("cursorInstructions surfaces the public URL and plan-mode caveat", () => {
|
|
35
35
|
const text = cursorInstructions("https://abc.example", "local-model");
|
package/dist/tools.d.ts
ADDED
package/dist/tools.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The fusionkit tool registry: the single place that knows every tool package.
|
|
3
|
+
* Importing this module also wires the ensemble harness gateway to resolve
|
|
4
|
+
* tool-backed adapters (codex / claude-code / cursor) from the registry, so
|
|
5
|
+
* `@fusionkit/ensemble` itself stays free of any per-tool dependency.
|
|
6
|
+
*
|
|
7
|
+
* Adding a new tool is one new `@fusionkit/tool-*` package plus one entry here.
|
|
8
|
+
*/
|
|
9
|
+
import { setToolHarnessProvider } from "@fusionkit/ensemble";
|
|
10
|
+
import { createToolRegistry } from "@fusionkit/tools";
|
|
11
|
+
import { claudeTool } from "@fusionkit/tool-claude";
|
|
12
|
+
import { codexTool } from "@fusionkit/tool-codex";
|
|
13
|
+
import { cursorTool } from "@fusionkit/tool-cursor";
|
|
14
|
+
import { opencodeTool } from "@fusionkit/tool-opencode";
|
|
15
|
+
export const toolRegistry = createToolRegistry([
|
|
16
|
+
codexTool,
|
|
17
|
+
claudeTool,
|
|
18
|
+
cursorTool,
|
|
19
|
+
opencodeTool
|
|
20
|
+
]);
|
|
21
|
+
setToolHarnessProvider({
|
|
22
|
+
adapter: (kind, options) => toolRegistry.harnessForKind(kind, options),
|
|
23
|
+
sideEffects: (kind) => toolRegistry.sideEffectsForKind(kind),
|
|
24
|
+
responseShape: (kind) => toolRegistry.responseShapeForKind(kind)
|
|
25
|
+
});
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fusionkit/cli",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.6",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
7
7
|
"url": "git+https://github.com/velum-labs/handoffkit.git",
|
|
@@ -34,14 +34,19 @@
|
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
36
|
"commander": "14.0.3",
|
|
37
|
-
"@fusionkit/ensemble": "0.1.
|
|
38
|
-
"@fusionkit/
|
|
39
|
-
"@fusionkit/
|
|
40
|
-
"@fusionkit/protocol": "0.1.
|
|
41
|
-
"@fusionkit/
|
|
42
|
-
"@fusionkit/
|
|
43
|
-
"@fusionkit/sdk": "0.1.
|
|
44
|
-
"@fusionkit/
|
|
37
|
+
"@fusionkit/ensemble": "0.1.6",
|
|
38
|
+
"@fusionkit/handoff": "0.1.6",
|
|
39
|
+
"@fusionkit/model-gateway": "0.1.6",
|
|
40
|
+
"@fusionkit/protocol": "0.1.6",
|
|
41
|
+
"@fusionkit/plane": "0.1.6",
|
|
42
|
+
"@fusionkit/runner": "0.1.6",
|
|
43
|
+
"@fusionkit/sdk": "0.1.6",
|
|
44
|
+
"@fusionkit/tool-cursor": "0.1.6",
|
|
45
|
+
"@fusionkit/tool-codex": "0.1.6",
|
|
46
|
+
"@fusionkit/tool-claude": "0.1.6",
|
|
47
|
+
"@fusionkit/tool-opencode": "0.1.6",
|
|
48
|
+
"@fusionkit/tools": "0.1.6",
|
|
49
|
+
"@fusionkit/workspace": "0.1.6"
|
|
45
50
|
},
|
|
46
51
|
"optionalDependencies": {
|
|
47
52
|
"portless": "0.14.0"
|
package/scope/.next/BUILD_ID
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
x7wPUCpgS31-5ZHJkcKsU
|
|
@@ -17,6 +17,13 @@
|
|
|
17
17
|
"static/chunks/989-1c7081e9fd5c9b9d.js",
|
|
18
18
|
"static/chunks/app/layout-d12f7c5cc80486b4.js"
|
|
19
19
|
],
|
|
20
|
+
"/api/models/route": [
|
|
21
|
+
"static/chunks/webpack-4501ec292abda191.js",
|
|
22
|
+
"static/chunks/4bd1b696-409494caf8c83275.js",
|
|
23
|
+
"static/chunks/255-69a4a78fac9becef.js",
|
|
24
|
+
"static/chunks/main-app-2a6b1f94de31f96f.js",
|
|
25
|
+
"static/chunks/app/api/models/route-95e822afbebe548b.js"
|
|
26
|
+
],
|
|
20
27
|
"/api/environments/route": [
|
|
21
28
|
"static/chunks/webpack-4501ec292abda191.js",
|
|
22
29
|
"static/chunks/4bd1b696-409494caf8c83275.js",
|
|
@@ -24,26 +31,26 @@
|
|
|
24
31
|
"static/chunks/main-app-2a6b1f94de31f96f.js",
|
|
25
32
|
"static/chunks/app/api/environments/route-95e822afbebe548b.js"
|
|
26
33
|
],
|
|
27
|
-
"/api/
|
|
34
|
+
"/api/replay/route": [
|
|
28
35
|
"static/chunks/webpack-4501ec292abda191.js",
|
|
29
36
|
"static/chunks/4bd1b696-409494caf8c83275.js",
|
|
30
37
|
"static/chunks/255-69a4a78fac9becef.js",
|
|
31
38
|
"static/chunks/main-app-2a6b1f94de31f96f.js",
|
|
32
|
-
"static/chunks/app/api/
|
|
39
|
+
"static/chunks/app/api/replay/route-95e822afbebe548b.js"
|
|
33
40
|
],
|
|
34
|
-
"/api/
|
|
41
|
+
"/api/sessions/[traceId]/route": [
|
|
35
42
|
"static/chunks/webpack-4501ec292abda191.js",
|
|
36
43
|
"static/chunks/4bd1b696-409494caf8c83275.js",
|
|
37
44
|
"static/chunks/255-69a4a78fac9becef.js",
|
|
38
45
|
"static/chunks/main-app-2a6b1f94de31f96f.js",
|
|
39
|
-
"static/chunks/app/api/
|
|
46
|
+
"static/chunks/app/api/sessions/[traceId]/route-95e822afbebe548b.js"
|
|
40
47
|
],
|
|
41
|
-
"/api/
|
|
48
|
+
"/api/ingest/route": [
|
|
42
49
|
"static/chunks/webpack-4501ec292abda191.js",
|
|
43
50
|
"static/chunks/4bd1b696-409494caf8c83275.js",
|
|
44
51
|
"static/chunks/255-69a4a78fac9becef.js",
|
|
45
52
|
"static/chunks/main-app-2a6b1f94de31f96f.js",
|
|
46
|
-
"static/chunks/app/api/
|
|
53
|
+
"static/chunks/app/api/ingest/route-95e822afbebe548b.js"
|
|
47
54
|
],
|
|
48
55
|
"/api/sessions/route": [
|
|
49
56
|
"static/chunks/webpack-4501ec292abda191.js",
|
|
@@ -59,12 +66,13 @@
|
|
|
59
66
|
"static/chunks/main-app-2a6b1f94de31f96f.js",
|
|
60
67
|
"static/chunks/app/api/stream/route-95e822afbebe548b.js"
|
|
61
68
|
],
|
|
62
|
-
"/
|
|
69
|
+
"/environments/page": [
|
|
63
70
|
"static/chunks/webpack-4501ec292abda191.js",
|
|
64
71
|
"static/chunks/4bd1b696-409494caf8c83275.js",
|
|
65
72
|
"static/chunks/255-69a4a78fac9becef.js",
|
|
66
73
|
"static/chunks/main-app-2a6b1f94de31f96f.js",
|
|
67
|
-
"static/chunks/
|
|
74
|
+
"static/chunks/239-1c69ce437d02745f.js",
|
|
75
|
+
"static/chunks/app/environments/page-75403c3640fdf9de.js"
|
|
68
76
|
],
|
|
69
77
|
"/models/page": [
|
|
70
78
|
"static/chunks/webpack-4501ec292abda191.js",
|
|
@@ -75,14 +83,6 @@
|
|
|
75
83
|
"static/chunks/873-9351d1edaa9d58ef.js",
|
|
76
84
|
"static/chunks/app/models/page-d9b7d19485e9a640.js"
|
|
77
85
|
],
|
|
78
|
-
"/environments/page": [
|
|
79
|
-
"static/chunks/webpack-4501ec292abda191.js",
|
|
80
|
-
"static/chunks/4bd1b696-409494caf8c83275.js",
|
|
81
|
-
"static/chunks/255-69a4a78fac9becef.js",
|
|
82
|
-
"static/chunks/main-app-2a6b1f94de31f96f.js",
|
|
83
|
-
"static/chunks/239-1c69ce437d02745f.js",
|
|
84
|
-
"static/chunks/app/environments/page-75403c3640fdf9de.js"
|
|
85
|
-
],
|
|
86
86
|
"/page": [
|
|
87
87
|
"static/chunks/webpack-4501ec292abda191.js",
|
|
88
88
|
"static/chunks/4bd1b696-409494caf8c83275.js",
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"/_not-found/page": "/_not-found",
|
|
3
|
-
"/api/environments/route": "/api/environments",
|
|
4
3
|
"/api/models/route": "/api/models",
|
|
5
|
-
"/api/
|
|
4
|
+
"/api/environments/route": "/api/environments",
|
|
6
5
|
"/api/replay/route": "/api/replay",
|
|
6
|
+
"/api/sessions/[traceId]/route": "/api/sessions/[traceId]",
|
|
7
|
+
"/api/ingest/route": "/api/ingest",
|
|
7
8
|
"/api/sessions/route": "/api/sessions",
|
|
8
9
|
"/api/stream/route": "/api/stream",
|
|
9
|
-
"/api/sessions/[traceId]/route": "/api/sessions/[traceId]",
|
|
10
|
-
"/models/page": "/models",
|
|
11
10
|
"/environments/page": "/environments",
|
|
11
|
+
"/models/page": "/models",
|
|
12
12
|
"/page": "/",
|
|
13
13
|
"/sessions/[traceId]/page": "/sessions/[traceId]"
|
|
14
14
|
}
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
"devFiles": [],
|
|
6
6
|
"ampDevFiles": [],
|
|
7
7
|
"lowPriorityFiles": [
|
|
8
|
-
"static/
|
|
9
|
-
"static/
|
|
8
|
+
"static/x7wPUCpgS31-5ZHJkcKsU/_buildManifest.js",
|
|
9
|
+
"static/x7wPUCpgS31-5ZHJkcKsU/_ssgManifest.js"
|
|
10
10
|
],
|
|
11
11
|
"rootMainFiles": [
|
|
12
12
|
"static/chunks/webpack-4501ec292abda191.js",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"x-next-revalidate-tag-token"
|
|
27
27
|
]
|
|
28
28
|
},
|
|
29
|
-
"/
|
|
29
|
+
"/environments": {
|
|
30
30
|
"experimentalBypassFor": [
|
|
31
31
|
{
|
|
32
32
|
"type": "header",
|
|
@@ -39,8 +39,8 @@
|
|
|
39
39
|
}
|
|
40
40
|
],
|
|
41
41
|
"initialRevalidateSeconds": false,
|
|
42
|
-
"srcRoute": "/
|
|
43
|
-
"dataRoute": "/
|
|
42
|
+
"srcRoute": "/environments",
|
|
43
|
+
"dataRoute": "/environments.rsc",
|
|
44
44
|
"allowHeader": [
|
|
45
45
|
"host",
|
|
46
46
|
"x-matched-path",
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"x-next-revalidate-tag-token"
|
|
51
51
|
]
|
|
52
52
|
},
|
|
53
|
-
"/
|
|
53
|
+
"/models": {
|
|
54
54
|
"experimentalBypassFor": [
|
|
55
55
|
{
|
|
56
56
|
"type": "header",
|
|
@@ -63,8 +63,8 @@
|
|
|
63
63
|
}
|
|
64
64
|
],
|
|
65
65
|
"initialRevalidateSeconds": false,
|
|
66
|
-
"srcRoute": "/
|
|
67
|
-
"dataRoute": "/
|
|
66
|
+
"srcRoute": "/models",
|
|
67
|
+
"dataRoute": "/models.rsc",
|
|
68
68
|
"allowHeader": [
|
|
69
69
|
"host",
|
|
70
70
|
"x-matched-path",
|
|
@@ -102,8 +102,8 @@
|
|
|
102
102
|
"dynamicRoutes": {},
|
|
103
103
|
"notFoundRoutes": [],
|
|
104
104
|
"preview": {
|
|
105
|
-
"previewModeId": "
|
|
106
|
-
"previewModeSigningKey": "
|
|
107
|
-
"previewModeEncryptionKey": "
|
|
105
|
+
"previewModeId": "9594f04790760323f1e2923ec24b2404",
|
|
106
|
+
"previewModeSigningKey": "281238373f342e329fe0b57d64f2d25dd33871bf9a620ea29ef66276a15f8ec5",
|
|
107
|
+
"previewModeEncryptionKey": "a673bd91681e4c5f8b9cd3b04ac5d5dd4d03a041430c0ade96730587eef1ac9f"
|
|
108
108
|
}
|
|
109
109
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
globalThis.__RSC_MANIFEST=(globalThis.__RSC_MANIFEST||{});globalThis.__RSC_MANIFEST["/_not-found/page"]={"moduleLoading":{"prefix":"/_next/"},"ssrModuleMapping":{"9766":{"*":{"id":"77526","name":"*","chunks":[],"async":false}},"11509":{"*":{"id":"94466","name":"*","chunks":[],"async":false}},"15278":{"*":{"id":"78922","name":"*","chunks":[],"async":false}},"17989":{"*":{"id":"68495","name":"*","chunks":[],"async":false}},"24431":{"*":{"id":"12263","name":"*","chunks":[],"async":false}},"31327":{"*":{"id":"33069","name":"*","chunks":[],"async":false}},"37373":{"*":{"id":"72400","name":"*","chunks":[],"async":false}},"54664":{"*":{"id":"8044","name":"*","chunks":[],"async":false}},"57150":{"*":{"id":"54160","name":"*","chunks":[],"async":false}},"63886":{"*":{"id":"75170","name":"*","chunks":[],"async":false}},"64441":{"*":{"id":"75780","name":"*","chunks":[],"async":false}},"72417":{"*":{"id":"10371","name":"*","chunks":[],"async":false}},"80622":{"*":{"id":"82146","name":"*","chunks":[],"async":false}},"81959":{"*":{"id":"31603","name":"*","chunks":[],"async":false}},"82180":{"*":{"id":"36736","name":"*","chunks":[],"async":false}},"98924":{"*":{"id":"29234","name":"*","chunks":[],"async":false}}},"edgeSSRModuleMapping":{},"clientModules":{"/home/runner/work/handoffkit/handoffkit/apps/scope/node_modules/next/dist/client/components/builtin/global-error.js":{"id":57150,"name":"*","chunks":[],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/node_modules/next/dist/esm/client/components/builtin/global-error.js":{"id":57150,"name":"*","chunks":[],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/node_modules/next/dist/client/components/client-page.js":{"id":81959,"name":"*","chunks":[],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/node_modules/next/dist/esm/client/components/client-page.js":{"id":81959,"name":"*","chunks":[],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/node_modules/next/dist/client/components/client-segment.js":{"id":17989,"name":"*","chunks":[],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/node_modules/next/dist/esm/client/components/client-segment.js":{"id":17989,"name":"*","chunks":[],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/node_modules/next/dist/client/components/http-access-fallback/error-boundary.js":{"id":63886,"name":"*","chunks":[],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/node_modules/next/dist/esm/client/components/http-access-fallback/error-boundary.js":{"id":63886,"name":"*","chunks":[],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/node_modules/next/dist/client/components/layout-router.js":{"id":9766,"name":"*","chunks":[],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/node_modules/next/dist/esm/client/components/layout-router.js":{"id":9766,"name":"*","chunks":[],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/node_modules/next/dist/client/components/metadata/async-metadata.js":{"id":15278,"name":"*","chunks":[],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/node_modules/next/dist/esm/client/components/metadata/async-metadata.js":{"id":15278,"name":"*","chunks":[],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/node_modules/next/dist/client/components/render-from-template-context.js":{"id":98924,"name":"*","chunks":[],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/node_modules/next/dist/esm/client/components/render-from-template-context.js":{"id":98924,"name":"*","chunks":[],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/node_modules/next/dist/lib/framework/boundary-components.js":{"id":24431,"name":"*","chunks":[],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/node_modules/next/dist/esm/lib/framework/boundary-components.js":{"id":24431,"name":"*","chunks":[],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/node_modules/next/dist/lib/metadata/generate/icon-mark.js":{"id":80622,"name":"*","chunks":[],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/node_modules/next/dist/esm/lib/metadata/generate/icon-mark.js":{"id":80622,"name":"*","chunks":[],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/components/scope/sidebar-nav.tsx":{"id":31327,"name":"*","chunks":["239","static/chunks/239-1c69ce437d02745f.js","989","static/chunks/989-1c7081e9fd5c9b9d.js","177","static/chunks/app/layout-d12f7c5cc80486b4.js"],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/components/ui/separator.tsx":{"id":54664,"name":"*","chunks":["239","static/chunks/239-1c69ce437d02745f.js","989","static/chunks/989-1c7081e9fd5c9b9d.js","177","static/chunks/app/layout-d12f7c5cc80486b4.js"],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/components/ui/tooltip.tsx":{"id":82180,"name":"*","chunks":["239","static/chunks/239-1c69ce437d02745f.js","989","static/chunks/989-1c7081e9fd5c9b9d.js","177","static/chunks/app/layout-d12f7c5cc80486b4.js"],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/node_modules/next/font/google/target.css?{\"path\":\"app/layout.tsx\",\"import\":\"Geist\",\"arguments\":[{\"subsets\":[\"latin\"],\"variable\":\"--font-sans\"}],\"variableName\":\"geist\"}":{"id":70127,"name":"*","chunks":["239","static/chunks/239-1c69ce437d02745f.js","989","static/chunks/989-1c7081e9fd5c9b9d.js","177","static/chunks/app/layout-d12f7c5cc80486b4.js"],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/node_modules/next/font/google/target.css?{\"path\":\"app/layout.tsx\",\"import\":\"Geist_Mono\",\"arguments\":[{\"subsets\":[\"latin\"],\"variable\":\"--font-mono\"}],\"variableName\":\"geistMono\"}":{"id":44176,"name":"*","chunks":["239","static/chunks/239-1c69ce437d02745f.js","989","static/chunks/989-1c7081e9fd5c9b9d.js","177","static/chunks/app/layout-d12f7c5cc80486b4.js"],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/app/globals.css":{"id":41290,"name":"*","chunks":["239","static/chunks/239-1c69ce437d02745f.js","989","static/chunks/989-1c7081e9fd5c9b9d.js","177","static/chunks/app/layout-d12f7c5cc80486b4.js"],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/app/
|
|
1
|
+
globalThis.__RSC_MANIFEST=(globalThis.__RSC_MANIFEST||{});globalThis.__RSC_MANIFEST["/_not-found/page"]={"moduleLoading":{"prefix":"/_next/"},"ssrModuleMapping":{"9766":{"*":{"id":"77526","name":"*","chunks":[],"async":false}},"11509":{"*":{"id":"94466","name":"*","chunks":[],"async":false}},"15278":{"*":{"id":"78922","name":"*","chunks":[],"async":false}},"17989":{"*":{"id":"68495","name":"*","chunks":[],"async":false}},"24431":{"*":{"id":"12263","name":"*","chunks":[],"async":false}},"31327":{"*":{"id":"33069","name":"*","chunks":[],"async":false}},"37373":{"*":{"id":"72400","name":"*","chunks":[],"async":false}},"54664":{"*":{"id":"8044","name":"*","chunks":[],"async":false}},"57150":{"*":{"id":"54160","name":"*","chunks":[],"async":false}},"63886":{"*":{"id":"75170","name":"*","chunks":[],"async":false}},"64441":{"*":{"id":"75780","name":"*","chunks":[],"async":false}},"72417":{"*":{"id":"10371","name":"*","chunks":[],"async":false}},"80622":{"*":{"id":"82146","name":"*","chunks":[],"async":false}},"81959":{"*":{"id":"31603","name":"*","chunks":[],"async":false}},"82180":{"*":{"id":"36736","name":"*","chunks":[],"async":false}},"98924":{"*":{"id":"29234","name":"*","chunks":[],"async":false}}},"edgeSSRModuleMapping":{},"clientModules":{"/home/runner/work/handoffkit/handoffkit/apps/scope/node_modules/next/dist/client/components/builtin/global-error.js":{"id":57150,"name":"*","chunks":[],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/node_modules/next/dist/esm/client/components/builtin/global-error.js":{"id":57150,"name":"*","chunks":[],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/node_modules/next/dist/client/components/client-page.js":{"id":81959,"name":"*","chunks":[],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/node_modules/next/dist/esm/client/components/client-page.js":{"id":81959,"name":"*","chunks":[],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/node_modules/next/dist/client/components/client-segment.js":{"id":17989,"name":"*","chunks":[],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/node_modules/next/dist/esm/client/components/client-segment.js":{"id":17989,"name":"*","chunks":[],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/node_modules/next/dist/client/components/http-access-fallback/error-boundary.js":{"id":63886,"name":"*","chunks":[],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/node_modules/next/dist/esm/client/components/http-access-fallback/error-boundary.js":{"id":63886,"name":"*","chunks":[],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/node_modules/next/dist/client/components/layout-router.js":{"id":9766,"name":"*","chunks":[],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/node_modules/next/dist/esm/client/components/layout-router.js":{"id":9766,"name":"*","chunks":[],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/node_modules/next/dist/client/components/metadata/async-metadata.js":{"id":15278,"name":"*","chunks":[],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/node_modules/next/dist/esm/client/components/metadata/async-metadata.js":{"id":15278,"name":"*","chunks":[],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/node_modules/next/dist/client/components/render-from-template-context.js":{"id":98924,"name":"*","chunks":[],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/node_modules/next/dist/esm/client/components/render-from-template-context.js":{"id":98924,"name":"*","chunks":[],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/node_modules/next/dist/lib/framework/boundary-components.js":{"id":24431,"name":"*","chunks":[],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/node_modules/next/dist/esm/lib/framework/boundary-components.js":{"id":24431,"name":"*","chunks":[],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/node_modules/next/dist/lib/metadata/generate/icon-mark.js":{"id":80622,"name":"*","chunks":[],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/node_modules/next/dist/esm/lib/metadata/generate/icon-mark.js":{"id":80622,"name":"*","chunks":[],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/components/scope/sidebar-nav.tsx":{"id":31327,"name":"*","chunks":["239","static/chunks/239-1c69ce437d02745f.js","989","static/chunks/989-1c7081e9fd5c9b9d.js","177","static/chunks/app/layout-d12f7c5cc80486b4.js"],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/components/ui/separator.tsx":{"id":54664,"name":"*","chunks":["239","static/chunks/239-1c69ce437d02745f.js","989","static/chunks/989-1c7081e9fd5c9b9d.js","177","static/chunks/app/layout-d12f7c5cc80486b4.js"],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/components/ui/tooltip.tsx":{"id":82180,"name":"*","chunks":["239","static/chunks/239-1c69ce437d02745f.js","989","static/chunks/989-1c7081e9fd5c9b9d.js","177","static/chunks/app/layout-d12f7c5cc80486b4.js"],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/node_modules/next/font/google/target.css?{\"path\":\"app/layout.tsx\",\"import\":\"Geist\",\"arguments\":[{\"subsets\":[\"latin\"],\"variable\":\"--font-sans\"}],\"variableName\":\"geist\"}":{"id":70127,"name":"*","chunks":["239","static/chunks/239-1c69ce437d02745f.js","989","static/chunks/989-1c7081e9fd5c9b9d.js","177","static/chunks/app/layout-d12f7c5cc80486b4.js"],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/node_modules/next/font/google/target.css?{\"path\":\"app/layout.tsx\",\"import\":\"Geist_Mono\",\"arguments\":[{\"subsets\":[\"latin\"],\"variable\":\"--font-mono\"}],\"variableName\":\"geistMono\"}":{"id":44176,"name":"*","chunks":["239","static/chunks/239-1c69ce437d02745f.js","989","static/chunks/989-1c7081e9fd5c9b9d.js","177","static/chunks/app/layout-d12f7c5cc80486b4.js"],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/app/globals.css":{"id":41290,"name":"*","chunks":["239","static/chunks/239-1c69ce437d02745f.js","989","static/chunks/989-1c7081e9fd5c9b9d.js","177","static/chunks/app/layout-d12f7c5cc80486b4.js"],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/app/environments/page.tsx":{"id":11509,"name":"*","chunks":[],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/app/models/page.tsx":{"id":64441,"name":"*","chunks":[],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/app/page.tsx":{"id":72417,"name":"*","chunks":["239","static/chunks/239-1c69ce437d02745f.js","989","static/chunks/989-1c7081e9fd5c9b9d.js","22","static/chunks/22-1934dc9c2e544aa9.js","974","static/chunks/app/page-57dce47ff6c00ddd.js"],"async":false},"/home/runner/work/handoffkit/handoffkit/apps/scope/app/sessions/[traceId]/page.tsx":{"id":37373,"name":"*","chunks":[],"async":false}},"entryCSSFiles":{"/home/runner/work/handoffkit/handoffkit/apps/scope/":[],"/home/runner/work/handoffkit/handoffkit/apps/scope/app/layout":[{"inlined":false,"path":"static/css/d57be8dcbceccbc1.css"}],"/home/runner/work/handoffkit/handoffkit/apps/scope/app/page":[],"/home/runner/work/handoffkit/handoffkit/apps/scope/app/_not-found/page":[]},"rscModuleMapping":{"9766":{"*":{"id":"6060","name":"*","chunks":[],"async":false}},"11509":{"*":{"id":"86851","name":"*","chunks":[],"async":false}},"15278":{"*":{"id":"7184","name":"*","chunks":[],"async":false}},"17989":{"*":{"id":"36893","name":"*","chunks":[],"async":false}},"24431":{"*":{"id":"73041","name":"*","chunks":[],"async":false}},"31327":{"*":{"id":"36755","name":"*","chunks":[],"async":false}},"37373":{"*":{"id":"66381","name":"*","chunks":[],"async":false}},"41290":{"*":{"id":"82704","name":"*","chunks":[],"async":false}},"54664":{"*":{"id":"54814","name":"*","chunks":[],"async":false}},"57150":{"*":{"id":"81170","name":"*","chunks":[],"async":false}},"63886":{"*":{"id":"89748","name":"*","chunks":[],"async":false}},"64441":{"*":{"id":"21399","name":"*","chunks":[],"async":false}},"72417":{"*":{"id":"17742","name":"*","chunks":[],"async":false}},"80622":{"*":{"id":"51384","name":"*","chunks":[],"async":false}},"81959":{"*":{"id":"23597","name":"*","chunks":[],"async":false}},"82180":{"*":{"id":"76786","name":"*","chunks":[],"async":false}},"98924":{"*":{"id":"69576","name":"*","chunks":[],"async":false}}},"edgeRscModuleMapping":{}}
|