aws-runtime-bridge 1.9.10 → 1.9.20
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/adapter/AcodeSdkAdapter.d.ts +40 -0
- package/dist/adapter/AcodeSdkAdapter.d.ts.map +1 -1
- package/dist/adapter/AcodeSdkAdapter.js +353 -7
- package/dist/adapter/AcodeSdkAdapter.test.js +155 -8
- package/dist/adapter/OpencodeSdkAdapter.d.ts.map +1 -1
- package/dist/adapter/OpencodeSdkAdapter.js +36 -3
- package/dist/adapter/instance-ai-config-resolver.d.ts +49 -0
- package/dist/adapter/instance-ai-config-resolver.d.ts.map +1 -0
- package/dist/adapter/instance-ai-config-resolver.js +46 -0
- package/dist/adapter/types.d.ts +27 -2
- package/dist/adapter/types.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/routes/dashboard.d.ts.map +1 -1
- package/dist/routes/dashboard.js +749 -15
- package/dist/routes/events.d.ts +7 -0
- package/dist/routes/events.d.ts.map +1 -0
- package/dist/routes/events.js +22 -0
- package/dist/routes/file-browser.d.ts +1 -1
- package/dist/routes/file-browser.d.ts.map +1 -1
- package/dist/routes/file-browser.js +25 -9
- package/dist/routes/file-snapshot.d.ts +10 -0
- package/dist/routes/file-snapshot.d.ts.map +1 -0
- package/dist/routes/file-snapshot.js +156 -0
- package/dist/routes/git.d.ts +10 -0
- package/dist/routes/git.d.ts.map +1 -1
- package/dist/routes/git.js +305 -2
- package/dist/routes/git.test.js +39 -2
- package/dist/routes/instance.js +3 -1
- package/dist/routes/memory.d.ts +3 -0
- package/dist/routes/memory.d.ts.map +1 -1
- package/dist/routes/memory.js +3 -0
- package/dist/routes/terminal.d.ts +2 -1
- package/dist/routes/terminal.d.ts.map +1 -1
- package/dist/routes/terminal.js +378 -41
- package/dist/routes/terminal.test.js +33 -7
- package/dist/services/agent-event-store.d.ts +59 -0
- package/dist/services/agent-event-store.d.ts.map +1 -0
- package/dist/services/agent-event-store.js +68 -0
- package/dist/services/event-delta-pusher.d.ts +40 -0
- package/dist/services/event-delta-pusher.d.ts.map +1 -0
- package/dist/services/event-delta-pusher.js +95 -0
- package/dist/services/fileSnapshotStore.d.ts +96 -0
- package/dist/services/fileSnapshotStore.d.ts.map +1 -0
- package/dist/services/fileSnapshotStore.js +500 -0
- package/dist/services/instance-ai-config-service.d.ts +49 -0
- package/dist/services/instance-ai-config-service.d.ts.map +1 -0
- package/dist/services/instance-ai-config-service.js +174 -0
- package/dist/services/panel-auth.d.ts +8 -0
- package/dist/services/panel-auth.d.ts.map +1 -1
- package/dist/services/panel-auth.js +8 -0
- package/dist/services/ring-buffer.d.ts +67 -0
- package/dist/services/ring-buffer.d.ts.map +1 -0
- package/dist/services/ring-buffer.js +103 -0
- package/dist/services/session-output.d.ts +47 -3
- package/dist/services/session-output.d.ts.map +1 -1
- package/dist/services/session-output.js +112 -2
- package/dist/utils/instance-ai-config-debug-logger.d.ts +37 -0
- package/dist/utils/instance-ai-config-debug-logger.d.ts.map +1 -0
- package/dist/utils/instance-ai-config-debug-logger.js +63 -0
- package/dist/utils/logger.d.ts +18 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +48 -4
- package/package/acode/dist/built-in-file-tools.d.ts +1 -1
- package/package/acode/dist/built-in-file-tools.d.ts.map +1 -1
- package/package/acode/dist/built-in-file-tools.js +5 -3
- package/package/acode/dist/builtins/commandArtifacts.d.ts +8 -1
- package/package/acode/dist/builtins/commandArtifacts.d.ts.map +1 -1
- package/package/acode/dist/builtins/commandArtifacts.js +24 -4
- package/package/acode/dist/builtins/shellCommandResult.d.ts +1 -0
- package/package/acode/dist/builtins/shellCommandResult.d.ts.map +1 -1
- package/package/acode/dist/builtins/shellCommandResult.js +3 -3
- package/package/acode/dist/builtins/shellCommandRunner.d.ts +1 -0
- package/package/acode/dist/builtins/shellCommandRunner.d.ts.map +1 -1
- package/package/acode/dist/builtins/shellCommandRunner.js +1 -0
- package/package/acode/dist/cli.js +2 -0
- package/package/acode/dist/runtime.d.ts.map +1 -1
- package/package/acode/dist/runtime.js +156 -5
- package/package/acode/dist/types.d.ts +1 -0
- package/package/acode/dist/types.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts +5 -0
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/agent-client.js +16 -0
- package/package/aws-client-agent-mcp/dist/agent-client.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/context-manager.d.ts +136 -0
- package/package/aws-client-agent-mcp/dist/context-manager.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/context-manager.js +473 -0
- package/package/aws-client-agent-mcp/dist/context-manager.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/context-manager.test.d.ts +6 -0
- package/package/aws-client-agent-mcp/dist/context-manager.test.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/context-manager.test.js +307 -0
- package/package/aws-client-agent-mcp/dist/context-manager.test.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +170 -2
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.js +947 -9
- package/package/aws-client-agent-mcp/dist/mcp-server.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js +103 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +15 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.js +62 -2
- package/package/aws-client-agent-mcp/dist/mcp-tools.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/memory-store.d.ts +46 -1
- package/package/aws-client-agent-mcp/dist/memory-store.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/memory-store.js +164 -12
- package/package/aws-client-agent-mcp/dist/memory-store.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/memory-tools.d.ts +8 -0
- package/package/aws-client-agent-mcp/dist/memory-tools.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/memory-tools.js +88 -1
- package/package/aws-client-agent-mcp/dist/memory-tools.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts +7 -1
- package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/server-memory-store.js +18 -0
- package/package/aws-client-agent-mcp/dist/server-memory-store.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/types.d.ts +103 -2
- package/package/aws-client-agent-mcp/dist/types.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/types.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.d.ts +27 -2
- package/package/aws-client-agent-mcp/dist/websocket-client.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.js +122 -5
- package/package/aws-client-agent-mcp/dist/websocket-client.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { EventEmitter } from "node:events";
|
|
2
|
-
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { describe, expect, it, vi, beforeEach, afterEach } from "vitest";
|
|
3
3
|
import { AcodeSdkAdapter, isFailedAcodeTurnComplete, } from "./AcodeSdkAdapter.js";
|
|
4
4
|
class FailedTurnRuntime extends EventEmitter {
|
|
5
5
|
constructor(config) {
|
|
@@ -837,7 +837,7 @@ describe("AcodeSdkAdapter turn completion state", () => {
|
|
|
837
837
|
type: "turn_complete",
|
|
838
838
|
data: { usage: { inputTokens: 31, outputTokens: 58 } },
|
|
839
839
|
});
|
|
840
|
-
expect(statuses.at(-1)).
|
|
840
|
+
expect(statuses.at(-1)).toMatchObject({
|
|
841
841
|
status: "waiting_input",
|
|
842
842
|
usage: { inputTokens: 31, outputTokens: 58 },
|
|
843
843
|
});
|
|
@@ -862,7 +862,7 @@ describe("AcodeSdkAdapter turn completion state", () => {
|
|
|
862
862
|
});
|
|
863
863
|
await adapter.sendMessage("session-reset-context", "finish work");
|
|
864
864
|
expect(adapter.getConversation("session-reset-context")).toHaveLength(2);
|
|
865
|
-
expect(statuses.at(-1)).
|
|
865
|
+
expect(statuses.at(-1)).toMatchObject({
|
|
866
866
|
status: "waiting_input",
|
|
867
867
|
usage: { inputTokens: 7, outputTokens: 3 },
|
|
868
868
|
});
|
|
@@ -872,7 +872,7 @@ describe("AcodeSdkAdapter turn completion state", () => {
|
|
|
872
872
|
expect(adapter.hasSession("session-reset-context")).toBe(true);
|
|
873
873
|
expect(adapter.getSessionStatus("session-reset-context")).toBe("waiting_input");
|
|
874
874
|
expect(adapter.getConversation("session-reset-context")).toEqual([]);
|
|
875
|
-
expect(statuses.at(-1)).
|
|
875
|
+
expect(statuses.at(-1)).toMatchObject({
|
|
876
876
|
status: "waiting_input",
|
|
877
877
|
usage: { inputTokens: 0, outputTokens: 0 },
|
|
878
878
|
});
|
|
@@ -1157,10 +1157,12 @@ describe("AcodeSdkAdapter turn completion state", () => {
|
|
|
1157
1157
|
requestBody: '{"model":"test-model"}',
|
|
1158
1158
|
},
|
|
1159
1159
|
});
|
|
1160
|
-
expect(statuses).
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1160
|
+
expect(statuses).toEqual(expect.arrayContaining([
|
|
1161
|
+
expect.objectContaining({
|
|
1162
|
+
status: "thinking",
|
|
1163
|
+
usage: expect.objectContaining({ inputTokens: 6800, outputTokens: 0 }),
|
|
1164
|
+
}),
|
|
1165
|
+
]));
|
|
1164
1166
|
});
|
|
1165
1167
|
it("forwards ACode thinking deltas as realtime thinking provider events", async () => {
|
|
1166
1168
|
const adapter = new AcodeSdkAdapter();
|
|
@@ -1851,3 +1853,148 @@ describe("AcodeSdkAdapter turn completion state", () => {
|
|
|
1851
1853
|
}
|
|
1852
1854
|
});
|
|
1853
1855
|
});
|
|
1856
|
+
/**
|
|
1857
|
+
* 用于验证 AcodeSdkAdapter 在 startSession 阶段传给 ACodeRuntime 的 config 是否符合
|
|
1858
|
+
* "instance > global > default" 优先级。Stub 会在构造时把 model / configPath 缓存到
|
|
1859
|
+
* lastConfig 供断言读取。
|
|
1860
|
+
*/
|
|
1861
|
+
class CapturingConfigRuntime extends EventEmitter {
|
|
1862
|
+
constructor(config) {
|
|
1863
|
+
super();
|
|
1864
|
+
CapturingConfigRuntime.lastConfig = { ...config };
|
|
1865
|
+
}
|
|
1866
|
+
async start() { }
|
|
1867
|
+
async submit(_message) { }
|
|
1868
|
+
async abort() { }
|
|
1869
|
+
async stop() { }
|
|
1870
|
+
}
|
|
1871
|
+
describe("AcodeSdkAdapter instance AI configuration priority", () => {
|
|
1872
|
+
let tempDir;
|
|
1873
|
+
let globalAcodePath;
|
|
1874
|
+
let perInstanceAcodePath;
|
|
1875
|
+
beforeEach(async () => {
|
|
1876
|
+
const { mkdir, mkdtemp, writeFile } = await import("node:fs/promises");
|
|
1877
|
+
const os = await import("node:os");
|
|
1878
|
+
const path = await import("node:path");
|
|
1879
|
+
tempDir = await mkdtemp(path.join(os.tmpdir(), "acode-adapter-ai-"));
|
|
1880
|
+
globalAcodePath = path.join(tempDir, "global", ".acode", "config.json");
|
|
1881
|
+
perInstanceAcodePath = path.join(tempDir, "instance-acode-config.json");
|
|
1882
|
+
await mkdir(path.dirname(globalAcodePath), { recursive: true });
|
|
1883
|
+
await writeFile(globalAcodePath, JSON.stringify({
|
|
1884
|
+
provider: {
|
|
1885
|
+
default: {
|
|
1886
|
+
model: "global-model",
|
|
1887
|
+
options: {
|
|
1888
|
+
baseURL: "https://global.example.com/v1",
|
|
1889
|
+
apiKey: "sk-global",
|
|
1890
|
+
},
|
|
1891
|
+
},
|
|
1892
|
+
},
|
|
1893
|
+
}), "utf-8");
|
|
1894
|
+
process.env.AWS_RUNTIME_HOME_DIR = tempDir;
|
|
1895
|
+
process.env.AWS_RUNTIME_ACODE_CONFIG_FILE = globalAcodePath;
|
|
1896
|
+
});
|
|
1897
|
+
afterEach(async () => {
|
|
1898
|
+
const { rm } = await import("node:fs/promises");
|
|
1899
|
+
delete process.env.AWS_RUNTIME_HOME_DIR;
|
|
1900
|
+
delete process.env.AWS_RUNTIME_ACODE_CONFIG_FILE;
|
|
1901
|
+
CapturingConfigRuntime.lastConfig = undefined;
|
|
1902
|
+
await rm(tempDir, { recursive: true, force: true });
|
|
1903
|
+
});
|
|
1904
|
+
it("无 instance 覆盖时使用全局 acode.json 的 model 与 configPath", async () => {
|
|
1905
|
+
const adapter = new AcodeSdkAdapter();
|
|
1906
|
+
adapter.setRuntimeConstructorForTest(CapturingConfigRuntime);
|
|
1907
|
+
await adapter.startSession("s-default", {
|
|
1908
|
+
command: "acode",
|
|
1909
|
+
workingDirectory: process.cwd(),
|
|
1910
|
+
autoAccept: true,
|
|
1911
|
+
extraMcpServers: {},
|
|
1912
|
+
envOverrides: {},
|
|
1913
|
+
});
|
|
1914
|
+
expect(CapturingConfigRuntime.lastConfig?.configPath).toBe(globalAcodePath);
|
|
1915
|
+
expect(CapturingConfigRuntime.lastConfig?.model).toBe("global-model");
|
|
1916
|
+
adapter.cleanup();
|
|
1917
|
+
});
|
|
1918
|
+
it("per-instance instanceAiConfig.model 覆盖全局 model", async () => {
|
|
1919
|
+
const adapter = new AcodeSdkAdapter();
|
|
1920
|
+
adapter.setRuntimeConstructorForTest(CapturingConfigRuntime);
|
|
1921
|
+
await adapter.startSession("s-instance-model", {
|
|
1922
|
+
command: "acode",
|
|
1923
|
+
workingDirectory: process.cwd(),
|
|
1924
|
+
autoAccept: true,
|
|
1925
|
+
mcpConfigPath: perInstanceAcodePath,
|
|
1926
|
+
instanceAiConfig: { model: "instance-model" },
|
|
1927
|
+
extraMcpServers: {},
|
|
1928
|
+
envOverrides: {},
|
|
1929
|
+
});
|
|
1930
|
+
// 没有 per-instance 文件时,adapter 仍使用调用方传入的 mcpConfigPath
|
|
1931
|
+
expect(CapturingConfigRuntime.lastConfig?.configPath).toBe(perInstanceAcodePath);
|
|
1932
|
+
expect(CapturingConfigRuntime.lastConfig?.model).toBe("instance-model");
|
|
1933
|
+
adapter.cleanup();
|
|
1934
|
+
});
|
|
1935
|
+
it("per-instance 文件已 deep-merge 时,baseURL/apiKey 从文件读取(instance 优先)", async () => {
|
|
1936
|
+
const { writeFile } = await import("node:fs/promises");
|
|
1937
|
+
await writeFile(perInstanceAcodePath, JSON.stringify({
|
|
1938
|
+
provider: {
|
|
1939
|
+
default: {
|
|
1940
|
+
model: "instance-file-model",
|
|
1941
|
+
options: {
|
|
1942
|
+
baseURL: "https://instance.example.com/v1",
|
|
1943
|
+
apiKey: "sk-instance",
|
|
1944
|
+
},
|
|
1945
|
+
},
|
|
1946
|
+
},
|
|
1947
|
+
mcpServers: { "kept-from-global": { type: "stdio", command: "x" } },
|
|
1948
|
+
}), "utf-8");
|
|
1949
|
+
const adapter = new AcodeSdkAdapter();
|
|
1950
|
+
adapter.setRuntimeConstructorForTest(CapturingConfigRuntime);
|
|
1951
|
+
await adapter.startSession("s-instance-file", {
|
|
1952
|
+
command: "acode",
|
|
1953
|
+
workingDirectory: process.cwd(),
|
|
1954
|
+
autoAccept: true,
|
|
1955
|
+
mcpConfigPath: perInstanceAcodePath,
|
|
1956
|
+
extraMcpServers: {},
|
|
1957
|
+
envOverrides: {},
|
|
1958
|
+
});
|
|
1959
|
+
expect(CapturingConfigRuntime.lastConfig?.configPath).toBe(perInstanceAcodePath);
|
|
1960
|
+
// model 走 per-instance 文件的 provider.default.model
|
|
1961
|
+
expect(CapturingConfigRuntime.lastConfig?.model).toBe("instance-file-model");
|
|
1962
|
+
adapter.cleanup();
|
|
1963
|
+
});
|
|
1964
|
+
it("per-session model 优先于 per-instance file model 与全局", async () => {
|
|
1965
|
+
const { writeFile } = await import("node:fs/promises");
|
|
1966
|
+
await writeFile(perInstanceAcodePath, JSON.stringify({
|
|
1967
|
+
provider: {
|
|
1968
|
+
default: { model: "instance-file-model" },
|
|
1969
|
+
},
|
|
1970
|
+
}), "utf-8");
|
|
1971
|
+
const adapter = new AcodeSdkAdapter();
|
|
1972
|
+
adapter.setRuntimeConstructorForTest(CapturingConfigRuntime);
|
|
1973
|
+
await adapter.startSession("s-session-wins", {
|
|
1974
|
+
command: "acode",
|
|
1975
|
+
workingDirectory: process.cwd(),
|
|
1976
|
+
autoAccept: true,
|
|
1977
|
+
mcpConfigPath: perInstanceAcodePath,
|
|
1978
|
+
model: "session-model",
|
|
1979
|
+
extraMcpServers: {},
|
|
1980
|
+
envOverrides: {},
|
|
1981
|
+
});
|
|
1982
|
+
expect(CapturingConfigRuntime.lastConfig?.model).toBe("session-model");
|
|
1983
|
+
adapter.cleanup();
|
|
1984
|
+
});
|
|
1985
|
+
it("全空时回退默认 'acode-default'", async () => {
|
|
1986
|
+
const adapter = new AcodeSdkAdapter();
|
|
1987
|
+
adapter.setRuntimeConstructorForTest(CapturingConfigRuntime);
|
|
1988
|
+
await adapter.startSession("s-all-empty", {
|
|
1989
|
+
command: "acode",
|
|
1990
|
+
workingDirectory: process.cwd(),
|
|
1991
|
+
autoAccept: true,
|
|
1992
|
+
// 指向一个不存在的 per-instance 文件,模拟 instance & global 都为空
|
|
1993
|
+
mcpConfigPath: perInstanceAcodePath,
|
|
1994
|
+
extraMcpServers: {},
|
|
1995
|
+
envOverrides: {},
|
|
1996
|
+
});
|
|
1997
|
+
expect(CapturingConfigRuntime.lastConfig?.model).toBe("acode-default");
|
|
1998
|
+
adapter.cleanup();
|
|
1999
|
+
});
|
|
2000
|
+
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpencodeSdkAdapter.d.ts","sourceRoot":"","sources":["../../src/adapter/OpencodeSdkAdapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAiB3C,OAAO,EAKL,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EAExB,KAAK,aAAa,EACnB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"OpencodeSdkAdapter.d.ts","sourceRoot":"","sources":["../../src/adapter/OpencodeSdkAdapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAiB3C,OAAO,EAKL,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EAExB,KAAK,aAAa,EACnB,MAAM,YAAY,CAAC;AA8HpB,qBAAa,kBAAmB,SAAQ,YAAa,YAAW,mBAAmB;IACjF,QAAQ,CAAC,UAAU,cAAc;IACjC,QAAQ,CAAC,WAAW,cAAc;IAElC,OAAO,CAAC,QAAQ,CAA2C;IAC3D,OAAO,CAAC,SAAS,CAAC,CAAoB;IAEhC,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IA2J5E,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAqDzG,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBnE,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7F,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE;QAAE,gBAAgB,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAUnG,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAclD,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BxD,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,mBAAmB,EAAE;IAIzD,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAItC,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI3D,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAI9D,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAOpD,OAAO,IAAI,IAAI;IAaf;;;OAGG;YACW,OAAO;YA2BP,aAAa;IAmB3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAO3B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAahC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAY7B,OAAO,CAAC,YAAY;YAYN,UAAU;IAuBxB,OAAO,CAAC,mBAAmB;IA6H3B,OAAO,CAAC,gBAAgB;IAkHxB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,kBAAkB;IAuC1B,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,2BAA2B;CAOpC"}
|
|
@@ -84,6 +84,23 @@ function hasErrorCode(error) {
|
|
|
84
84
|
function isMissingPackageError(error, packageName) {
|
|
85
85
|
return hasErrorCode(error) && error.code === 'ERR_MODULE_NOT_FOUND' && error.message.includes(packageName);
|
|
86
86
|
}
|
|
87
|
+
// ============ 模型解析 ============
|
|
88
|
+
/**
|
|
89
|
+
* 解析 OpenCode 模型规格。
|
|
90
|
+
* OpenCode 原生格式为 "provider/model"(如 "anthropic/claude-sonnet-4-5")。
|
|
91
|
+
* 若用户只提供模型名(不含 "/"),则仅返回 modelID,providerID 留空让 OpenCode 自动选择。
|
|
92
|
+
*/
|
|
93
|
+
function parseOpenCodeModelSpec(model) {
|
|
94
|
+
if (!model || !model.trim())
|
|
95
|
+
return undefined;
|
|
96
|
+
const trimmed = model.trim();
|
|
97
|
+
const slashIndex = trimmed.indexOf('/');
|
|
98
|
+
if (slashIndex > 0) {
|
|
99
|
+
return { providerID: trimmed.slice(0, slashIndex), modelID: trimmed.slice(slashIndex + 1) };
|
|
100
|
+
}
|
|
101
|
+
// 纯模型名,无 provider 前缀
|
|
102
|
+
return { modelID: trimmed };
|
|
103
|
+
}
|
|
87
104
|
// ============ Adapter ============
|
|
88
105
|
export class OpencodeSdkAdapter extends EventEmitter {
|
|
89
106
|
constructor() {
|
|
@@ -127,6 +144,14 @@ export class OpencodeSdkAdapter extends EventEmitter {
|
|
|
127
144
|
(process.platform === 'win32' && !path.isAbsolute(openCodeCommand));
|
|
128
145
|
console.log(`[OpencodeSdkAdapter] shell=${useShell}`);
|
|
129
146
|
const env = { ...process.env, ...config.envOverrides };
|
|
147
|
+
// ★ 实例级模型覆盖:通过 OPENCODE_CONFIG_CONTENT 注入(OpenCode 标准 inline config,优先级 6)
|
|
148
|
+
// 参考:https://opencode.ai/docs/config/ — "Inline config (OPENCODE_CONFIG_CONTENT env var) - runtime overrides"
|
|
149
|
+
const parsedModel = parseOpenCodeModelSpec(config.model);
|
|
150
|
+
if (parsedModel?.modelID) {
|
|
151
|
+
const inlineConfig = { model: config.model.trim() };
|
|
152
|
+
env.OPENCODE_CONFIG_CONTENT = JSON.stringify(inlineConfig);
|
|
153
|
+
console.log(`[OpencodeSdkAdapter] ★★★ 实例级模型覆盖 ★★★ OPENCODE_CONFIG_CONTENT=${env.OPENCODE_CONFIG_CONTENT}`);
|
|
154
|
+
}
|
|
130
155
|
const proc = spawn(openCodeCommand, ['serve', '--port', String(port)], {
|
|
131
156
|
cwd: config.workingDirectory,
|
|
132
157
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
@@ -236,11 +261,19 @@ export class OpencodeSdkAdapter extends EventEmitter {
|
|
|
236
261
|
this.stopIdleDetection(sessionId);
|
|
237
262
|
}
|
|
238
263
|
try {
|
|
264
|
+
// ★ 实例级模型覆盖:per-message model override
|
|
265
|
+
// 仅当模型含 "provider/model" 格式时传入(OpenCode SDK 要求 providerID + modelID)
|
|
266
|
+
const parsedModel = parseOpenCodeModelSpec(session.config.model);
|
|
267
|
+
const promptBody = {
|
|
268
|
+
parts: [{ type: 'text', text: message }],
|
|
269
|
+
};
|
|
270
|
+
if (parsedModel?.providerID && parsedModel?.modelID) {
|
|
271
|
+
promptBody.model = { providerID: parsedModel.providerID, modelID: parsedModel.modelID };
|
|
272
|
+
console.log(`[OpencodeSdkAdapter] ★★★ per-message model ★★★ provider=${parsedModel.providerID}, model=${parsedModel.modelID}`);
|
|
273
|
+
}
|
|
239
274
|
await session.client.session.prompt({
|
|
240
275
|
path: { id: session.opencodeSessionId },
|
|
241
|
-
body:
|
|
242
|
-
parts: [{ type: 'text', text: message }],
|
|
243
|
-
},
|
|
276
|
+
body: promptBody,
|
|
244
277
|
query: { directory: session.workingDirectory },
|
|
245
278
|
});
|
|
246
279
|
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Instance AI 配置仲裁器
|
|
3
|
+
*
|
|
4
|
+
* 按 "instance > global > default" 三层优先级仲裁 ACode 的
|
|
5
|
+
* model/baseURL/apiKey 配置。
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* 实例级 AI 配置(来自 per-session model + per-instance instanceAiConfig)。
|
|
9
|
+
*/
|
|
10
|
+
export interface InstanceAiConfig {
|
|
11
|
+
model?: string;
|
|
12
|
+
baseURL?: string;
|
|
13
|
+
apiKey?: string;
|
|
14
|
+
effort?: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* 仲裁结果。
|
|
18
|
+
*/
|
|
19
|
+
export interface ResolvedAcodeProviderConfig {
|
|
20
|
+
/** 最终选定的 model */
|
|
21
|
+
model: string;
|
|
22
|
+
/** 最终选定的 baseURL,可能为空 */
|
|
23
|
+
baseURL?: string;
|
|
24
|
+
/** 最终选定的 apiKey,可能为空 */
|
|
25
|
+
apiKey?: string;
|
|
26
|
+
/** 最终选定的 effort,可能为空 */
|
|
27
|
+
effort?: string;
|
|
28
|
+
/** 各字段的来源标签 */
|
|
29
|
+
source: {
|
|
30
|
+
model: string;
|
|
31
|
+
baseURL: string;
|
|
32
|
+
apiKey: string;
|
|
33
|
+
effort: string;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 仲裁 ACode provider 配置。
|
|
38
|
+
*
|
|
39
|
+
* 优先级:instance > global > default
|
|
40
|
+
* - instance:来自 per-session model + per-instance instanceAiConfig
|
|
41
|
+
* - global:来自 acode.json 顶层 provider.default
|
|
42
|
+
* - default:调用方提供的默认值
|
|
43
|
+
*
|
|
44
|
+
* @param instanceConfig 请求级实例配置(含 perSessionModel 覆盖后的 instanceAiConfig)
|
|
45
|
+
* @param globalConfig 全局 acode.json 中的 provider.default 层
|
|
46
|
+
* @param defaultModel 兜底默认模型名
|
|
47
|
+
*/
|
|
48
|
+
export declare function resolveAcodeProviderConfig(instanceConfig: InstanceAiConfig, globalConfig: InstanceAiConfig | undefined, defaultModel: string): ResolvedAcodeProviderConfig;
|
|
49
|
+
//# sourceMappingURL=instance-ai-config-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instance-ai-config-resolver.d.ts","sourceRoot":"","sources":["../../src/adapter/instance-ai-config-resolver.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,yBAAyB;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wBAAwB;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wBAAwB;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe;IACf,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAeD;;;;;;;;;;;GAWG;AACH,wBAAgB,0BAA0B,CACxC,cAAc,EAAE,gBAAgB,EAChC,YAAY,EAAE,gBAAgB,GAAG,SAAS,EAC1C,YAAY,EAAE,MAAM,GACnB,2BAA2B,CAkC7B"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Instance AI 配置仲裁器
|
|
3
|
+
*
|
|
4
|
+
* 按 "instance > global > default" 三层优先级仲裁 ACode 的
|
|
5
|
+
* model/baseURL/apiKey 配置。
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* 解析来源标签。
|
|
9
|
+
*/
|
|
10
|
+
function pickSource(instanceVal, globalVal, _defaultLabel) {
|
|
11
|
+
if (instanceVal !== undefined)
|
|
12
|
+
return { value: instanceVal, source: "instance" };
|
|
13
|
+
if (globalVal !== undefined)
|
|
14
|
+
return { value: globalVal, source: "global" };
|
|
15
|
+
return { value: undefined, source: _defaultLabel ?? "default" };
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 仲裁 ACode provider 配置。
|
|
19
|
+
*
|
|
20
|
+
* 优先级:instance > global > default
|
|
21
|
+
* - instance:来自 per-session model + per-instance instanceAiConfig
|
|
22
|
+
* - global:来自 acode.json 顶层 provider.default
|
|
23
|
+
* - default:调用方提供的默认值
|
|
24
|
+
*
|
|
25
|
+
* @param instanceConfig 请求级实例配置(含 perSessionModel 覆盖后的 instanceAiConfig)
|
|
26
|
+
* @param globalConfig 全局 acode.json 中的 provider.default 层
|
|
27
|
+
* @param defaultModel 兜底默认模型名
|
|
28
|
+
*/
|
|
29
|
+
export function resolveAcodeProviderConfig(instanceConfig, globalConfig, defaultModel) {
|
|
30
|
+
const modelResult = pickSource(instanceConfig.model, globalConfig?.model, defaultModel);
|
|
31
|
+
const baseURLResult = pickSource(instanceConfig.baseURL, globalConfig?.baseURL, undefined);
|
|
32
|
+
const apiKeyResult = pickSource(instanceConfig.apiKey, globalConfig?.apiKey, undefined);
|
|
33
|
+
const effortResult = pickSource(instanceConfig.effort, globalConfig?.effort, undefined);
|
|
34
|
+
return {
|
|
35
|
+
model: modelResult.value ?? defaultModel,
|
|
36
|
+
...(baseURLResult.value ? { baseURL: baseURLResult.value } : {}),
|
|
37
|
+
...(apiKeyResult.value ? { apiKey: apiKeyResult.value } : {}),
|
|
38
|
+
...(effortResult.value ? { effort: effortResult.value } : {}),
|
|
39
|
+
source: {
|
|
40
|
+
model: modelResult.source,
|
|
41
|
+
baseURL: baseURLResult.source,
|
|
42
|
+
apiKey: apiKeyResult.source,
|
|
43
|
+
effort: effortResult.source,
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|
package/dist/adapter/types.d.ts
CHANGED
|
@@ -57,6 +57,8 @@ export declare function getToolActionInfo(toolName: string | undefined, toolInpu
|
|
|
57
57
|
export interface RuntimeTokenUsage {
|
|
58
58
|
inputTokens: number;
|
|
59
59
|
outputTokens: number;
|
|
60
|
+
/** Model context window token limit used for the used/limit display. */
|
|
61
|
+
contextLimit?: number;
|
|
60
62
|
}
|
|
61
63
|
export type CommandOutputStream = "stdout" | "stderr" | "mixed";
|
|
62
64
|
export interface RuntimeStatusActionInfo {
|
|
@@ -144,11 +146,27 @@ export interface ProviderEvent {
|
|
|
144
146
|
commandLineCount?: number;
|
|
145
147
|
};
|
|
146
148
|
}
|
|
149
|
+
/**
|
|
150
|
+
* 实例自配置 AI provider 覆盖(仅 ACode 适配器消费)。
|
|
151
|
+
*
|
|
152
|
+
* 优先级:API 请求体(per-launch)> 环境变量 > bridge 下的 instance-acode-config.json 文件。
|
|
153
|
+
* 实例配置优先于 acode.json 全局 provider.default 配置;AcodeSdkAdapter 内部按
|
|
154
|
+
* "instance > global > default" 三层逐字段仲裁 model / baseURL / apiKey。
|
|
155
|
+
*/
|
|
156
|
+
export interface AdapterInstanceAiConfig {
|
|
157
|
+
model?: string;
|
|
158
|
+
baseURL?: string;
|
|
159
|
+
apiKey?: string;
|
|
160
|
+
/** Per-instance model reasoning effort (minimal|low|medium|high|xhigh) */
|
|
161
|
+
effort?: string;
|
|
162
|
+
}
|
|
147
163
|
export interface AdapterSessionConfig {
|
|
148
164
|
/** CLI 命令(支持绝对路径) */
|
|
149
165
|
command: string;
|
|
150
166
|
/** 工作目录 */
|
|
151
167
|
workingDirectory: string;
|
|
168
|
+
/** Agent ID(用于 spillover 文件路径隔离) */
|
|
169
|
+
agentId?: string;
|
|
152
170
|
/** 初始 prompt(创建会话后自动发送) */
|
|
153
171
|
initialPrompt?: string;
|
|
154
172
|
/** 初始 prompt 是否显示为用户消息 */
|
|
@@ -161,14 +179,20 @@ export interface AdapterSessionConfig {
|
|
|
161
179
|
preset: string;
|
|
162
180
|
append: string;
|
|
163
181
|
};
|
|
164
|
-
/**
|
|
182
|
+
/** 模型名称覆盖(per-session 粒度,优先级最高) */
|
|
165
183
|
model?: string;
|
|
166
184
|
/** 最大对话轮次(0=无限) */
|
|
167
185
|
maxTurns?: number;
|
|
168
186
|
/** 允许的工具列表(空=全部) */
|
|
169
187
|
allowedTools?: string[];
|
|
170
|
-
/** MCP
|
|
188
|
+
/** MCP 配置路径;如为 per-instance 文件则由 instance-ai-config-service 写入 */
|
|
171
189
|
mcpConfigPath?: string;
|
|
190
|
+
/**
|
|
191
|
+
* 实例自配置 AI provider 覆盖(仅 ACode 消费)。AcodeSdkAdapter 内部会按
|
|
192
|
+
* "instance > global > default" 优先级仲裁,并将 baseURL/apiKey 写入
|
|
193
|
+
* per-instance acode.json 后作为 configPath 使用。
|
|
194
|
+
*/
|
|
195
|
+
instanceAiConfig?: AdapterInstanceAiConfig;
|
|
172
196
|
/** Provider 特定参数 */
|
|
173
197
|
providerArgs?: string[];
|
|
174
198
|
/** 环境变量覆盖 */
|
|
@@ -199,6 +223,7 @@ export interface AdapterSession {
|
|
|
199
223
|
totalUsage: {
|
|
200
224
|
inputTokens: number;
|
|
201
225
|
outputTokens: number;
|
|
226
|
+
contextLimit?: number;
|
|
202
227
|
};
|
|
203
228
|
/** SDK 进程 PID(用于检测进程是否存活) */
|
|
204
229
|
pid?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/adapter/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,MAAM,MAAM,aAAa,GACrB,UAAU,GACV,UAAU,GACV,YAAY,GACZ,eAAe,GACf,WAAW,GACX,YAAY,GACZ,OAAO,CAAC;AAIZ,MAAM,MAAM,iBAAiB,GACzB,YAAY,GACZ,YAAY,GACZ,UAAU,GACV,gBAAgB,GAChB,gBAAgB,GAChB,cAAc,GACd,oBAAoB,GACpB,mBAAmB,GACnB,gBAAgB,GAChB,eAAe,GACf,kBAAkB,GAClB,OAAO,CAAC;AAIZ;;;GAGG;AACH,MAAM,MAAM,cAAc,GACtB,OAAO,GACP,KAAK,GACL,MAAM,GACN,WAAW,GACX,YAAY,GACZ,WAAW,GACX,MAAM,GACN,QAAQ,GACR,KAAK,GACL,YAAY,GACZ,KAAK,GACL,UAAU,GACV,OAAO,CAAC;AAEZ;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,aAAa;IACb,UAAU,EAAE,cAAc,CAAC;IAC3B,iBAAiB;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,qBAAqB;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY;IACZ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAUD;;;GAGG;AACH,wBAAgB,kCAAkC,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQvE;AAED;;;GAGG;AACH,wBAAgB,iCAAiC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAWvE;AAED;;GAEG;AACH,wBAAgB,yCAAyC,CACvD,KAAK,EAAE,OAAO,GACb,OAAO,CAgBT;AA4CD,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAsBjE;AAWD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,QAAQ,CAAC,EAAE,YAAY,GACtB,cAAc,CA8ahB;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/adapter/types.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -18,6 +18,7 @@ import { mcpRouter } from "./routes/mcp.js";
|
|
|
18
18
|
import { terminalRouter, sdkSessions } from "./routes/terminal.js";
|
|
19
19
|
import { sessionsRouter } from "./routes/sessions.js";
|
|
20
20
|
import { gitRouter } from "./routes/git.js";
|
|
21
|
+
import { fileSnapshotRouter } from "./routes/file-snapshot.js";
|
|
21
22
|
import { memoryRouter } from "./routes/memory.js";
|
|
22
23
|
import { fileBrowserRouter } from "./routes/file-browser.js";
|
|
23
24
|
import { aiSourcesRouter } from "./routes/ai-sources.js";
|
|
@@ -26,6 +27,7 @@ import { systemMetricsRouter } from "./routes/system-metrics.js";
|
|
|
26
27
|
import { attachPtyWebSocketServer, closeAllPtySessions, ptyRouter, ptySessions, } from "./routes/pty.js";
|
|
27
28
|
import { runtimeBindingRouter, logRuntimeBindingStartupState, } from "./routes/runtime-binding.js";
|
|
28
29
|
import { dashboardRouter } from "./routes/dashboard.js";
|
|
30
|
+
import { eventsRouter } from "./routes/events.js";
|
|
29
31
|
import { loadPersistedSessions, savePersistedSessions, } from "./services/terminal-persistence.js";
|
|
30
32
|
import { detectOrphanProcesses } from "./services/process-detector.js";
|
|
31
33
|
import { startOrphanMonitor, stopOrphanMonitor, } from "./services/orphan-monitor.js";
|
|
@@ -295,7 +297,9 @@ app.use("/runtime", terminalRouter);
|
|
|
295
297
|
app.use("/runtime", sessionsRouter);
|
|
296
298
|
app.use("/runtime", processesRouter);
|
|
297
299
|
app.use("/runtime", systemMetricsRouter);
|
|
300
|
+
app.use("/runtime", eventsRouter);
|
|
298
301
|
app.use("/runtime", gitRouter);
|
|
302
|
+
app.use("/runtime", fileSnapshotRouter);
|
|
299
303
|
app.use("/runtime", memoryRouter);
|
|
300
304
|
app.use("/runtime", aiSourcesRouter);
|
|
301
305
|
app.use("/pty", ptyRouter);
|
|
@@ -473,7 +477,7 @@ async function gracefulShutdown(signal, server, preserveSessions = false) {
|
|
|
473
477
|
logger.info(`[runtime-bridge] 优雅关闭完成 (耗时 ${elapsed}ms),停止 ${sdkCount} SDK 会话`);
|
|
474
478
|
server.close(() => {
|
|
475
479
|
logger.info("[runtime-bridge] HTTP 服务器已关闭");
|
|
476
|
-
process.exit(0);
|
|
480
|
+
process.exit(process.exitCode || 0);
|
|
477
481
|
});
|
|
478
482
|
// 强制退出超时(防止卡住)
|
|
479
483
|
setTimeout(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/routes/dashboard.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/routes/dashboard.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAuFH,eAAO,MAAM,eAAe,4CAAW,CAAC"}
|