@botiverse/oar 0.0.3 → 0.0.5

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 (115) hide show
  1. package/README.md +15 -4
  2. package/dist/contracts/account-usage.d.ts +1 -0
  3. package/dist/contracts/account-usage.d.ts.map +1 -1
  4. package/dist/contracts/model-catalog.d.ts +51 -0
  5. package/dist/contracts/model-catalog.d.ts.map +1 -0
  6. package/dist/contracts/model-catalog.js +9 -0
  7. package/dist/contracts/model-catalog.js.map +1 -0
  8. package/dist/contracts/provider-auth.d.ts +77 -0
  9. package/dist/contracts/provider-auth.d.ts.map +1 -0
  10. package/dist/contracts/provider-auth.js +9 -0
  11. package/dist/contracts/provider-auth.js.map +1 -0
  12. package/dist/index.d.ts +12 -0
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +17 -1
  15. package/dist/index.js.map +1 -1
  16. package/dist/runtimes/claude/account-usage.d.ts +21 -19
  17. package/dist/runtimes/claude/account-usage.d.ts.map +1 -1
  18. package/dist/runtimes/claude/account-usage.js +153 -131
  19. package/dist/runtimes/claude/account-usage.js.map +1 -1
  20. package/dist/runtimes/codex/account-usage.d.ts +21 -0
  21. package/dist/runtimes/codex/account-usage.d.ts.map +1 -1
  22. package/dist/runtimes/codex/account-usage.js +27 -10
  23. package/dist/runtimes/codex/account-usage.js.map +1 -1
  24. package/dist/runtimes/grok/account-usage.d.ts +6 -0
  25. package/dist/runtimes/grok/account-usage.d.ts.map +1 -0
  26. package/dist/runtimes/grok/account-usage.js +142 -0
  27. package/dist/runtimes/grok/account-usage.js.map +1 -0
  28. package/dist/runtimes/grok/index.d.ts +9 -0
  29. package/dist/runtimes/grok/index.d.ts.map +1 -0
  30. package/dist/runtimes/grok/index.js +13 -0
  31. package/dist/runtimes/grok/index.js.map +1 -0
  32. package/dist/runtimes/grok/installation.d.ts +4 -0
  33. package/dist/runtimes/grok/installation.d.ts.map +1 -0
  34. package/dist/runtimes/grok/installation.js +19 -0
  35. package/dist/runtimes/grok/installation.js.map +1 -0
  36. package/dist/runtimes/grok/session.d.ts +10 -0
  37. package/dist/runtimes/grok/session.d.ts.map +1 -0
  38. package/dist/runtimes/grok/session.js +66 -0
  39. package/dist/runtimes/grok/session.js.map +1 -0
  40. package/dist/runtimes/kimi/account-usage.d.ts +9 -0
  41. package/dist/runtimes/kimi/account-usage.d.ts.map +1 -0
  42. package/dist/runtimes/kimi/account-usage.js +241 -0
  43. package/dist/runtimes/kimi/account-usage.js.map +1 -0
  44. package/dist/runtimes/kimi/auth-config.d.ts +12 -0
  45. package/dist/runtimes/kimi/auth-config.d.ts.map +1 -0
  46. package/dist/runtimes/kimi/auth-config.js +90 -0
  47. package/dist/runtimes/kimi/auth-config.js.map +1 -0
  48. package/dist/runtimes/kimi/index.d.ts +9 -0
  49. package/dist/runtimes/kimi/index.d.ts.map +1 -0
  50. package/dist/runtimes/kimi/index.js +13 -0
  51. package/dist/runtimes/kimi/index.js.map +1 -0
  52. package/dist/runtimes/kimi/installation.d.ts +4 -0
  53. package/dist/runtimes/kimi/installation.d.ts.map +1 -0
  54. package/dist/runtimes/kimi/installation.js +18 -0
  55. package/dist/runtimes/kimi/installation.js.map +1 -0
  56. package/dist/runtimes/kimi/oauth-token.d.ts +12 -0
  57. package/dist/runtimes/kimi/oauth-token.d.ts.map +1 -0
  58. package/dist/runtimes/kimi/oauth-token.js +38 -0
  59. package/dist/runtimes/kimi/oauth-token.js.map +1 -0
  60. package/dist/runtimes/kimi/session.d.ts +7 -0
  61. package/dist/runtimes/kimi/session.d.ts.map +1 -0
  62. package/dist/runtimes/kimi/session.js +39 -0
  63. package/dist/runtimes/kimi/session.js.map +1 -0
  64. package/dist/runtimes/pi/auth.d.ts +16 -0
  65. package/dist/runtimes/pi/auth.d.ts.map +1 -0
  66. package/dist/runtimes/pi/auth.js +124 -0
  67. package/dist/runtimes/pi/auth.js.map +1 -0
  68. package/dist/runtimes/pi/catalog.d.ts +10 -0
  69. package/dist/runtimes/pi/catalog.d.ts.map +1 -0
  70. package/dist/runtimes/pi/catalog.js +66 -0
  71. package/dist/runtimes/pi/catalog.js.map +1 -0
  72. package/dist/shared/acp/errors.d.ts +16 -0
  73. package/dist/shared/acp/errors.d.ts.map +1 -0
  74. package/dist/shared/acp/errors.js +25 -0
  75. package/dist/shared/acp/errors.js.map +1 -0
  76. package/dist/shared/acp/process.d.ts +24 -0
  77. package/dist/shared/acp/process.d.ts.map +1 -0
  78. package/dist/shared/acp/process.js +88 -0
  79. package/dist/shared/acp/process.js.map +1 -0
  80. package/dist/shared/acp/profile.d.ts +36 -0
  81. package/dist/shared/acp/profile.d.ts.map +1 -0
  82. package/dist/shared/acp/profile.js +104 -0
  83. package/dist/shared/acp/profile.js.map +1 -0
  84. package/dist/shared/acp/projection.d.ts +21 -0
  85. package/dist/shared/acp/projection.d.ts.map +1 -0
  86. package/dist/shared/acp/projection.js +160 -0
  87. package/dist/shared/acp/projection.js.map +1 -0
  88. package/dist/shared/acp/session.d.ts +5 -0
  89. package/dist/shared/acp/session.d.ts.map +1 -0
  90. package/dist/shared/acp/session.js +254 -0
  91. package/dist/shared/acp/session.js.map +1 -0
  92. package/dist/shared/acp/terminal.d.ts +17 -0
  93. package/dist/shared/acp/terminal.d.ts.map +1 -0
  94. package/dist/shared/acp/terminal.js +193 -0
  95. package/dist/shared/acp/terminal.js.map +1 -0
  96. package/dist/shared/executable/index.d.ts +0 -1
  97. package/dist/shared/executable/index.d.ts.map +1 -1
  98. package/dist/shared/executable/index.js.map +1 -1
  99. package/dist/shared/executable/process.d.ts +16 -15
  100. package/dist/shared/executable/process.d.ts.map +1 -1
  101. package/dist/shared/executable/process.js +46 -32
  102. package/dist/shared/executable/process.js.map +1 -1
  103. package/dist/shared/executable/resolve.d.ts +2 -15
  104. package/dist/shared/executable/resolve.d.ts.map +1 -1
  105. package/dist/shared/executable/resolve.js +4 -61
  106. package/dist/shared/executable/resolve.js.map +1 -1
  107. package/dist/shared/executable/version.d.ts +1 -1
  108. package/dist/shared/executable/version.d.ts.map +1 -1
  109. package/dist/shared/executable/version.js +2 -2
  110. package/dist/shared/executable/version.js.map +1 -1
  111. package/dist/shared/installation.d.ts +6 -1
  112. package/dist/shared/installation.d.ts.map +1 -1
  113. package/dist/shared/installation.js +11 -9
  114. package/dist/shared/installation.js.map +1 -1
  115. package/package.json +6 -3
@@ -0,0 +1,90 @@
1
+ import { createHash } from "node:crypto";
2
+ import { homedir } from "node:os";
3
+ import { basename, join } from "node:path";
4
+ import { runExecutable } from "../../shared/executable/index.js";
5
+ import { asRecord, parseJson } from "../../shared/json.js";
6
+ const MANAGED_PROVIDER = "managed:kimi-code";
7
+ const DEFAULT_BASE_URL = "https://api.kimi.com/coding/v1";
8
+ const DEFAULT_OAUTH_HOST = "https://auth.kimi.com";
9
+ const DEFAULT_OAUTH_KEY = "oauth/kimi-code";
10
+ function text(value) {
11
+ if (typeof value !== "string") {
12
+ return undefined;
13
+ }
14
+ const trimmed = value.trim();
15
+ return trimmed.length > 0 ? trimmed : undefined;
16
+ }
17
+ function normalizedEndpoint(value) {
18
+ return value.trim().replace(/\/+$/u, "");
19
+ }
20
+ function oauthKey(oauthHost, baseUrl) {
21
+ const normalizedHost = normalizedEndpoint(oauthHost);
22
+ const normalizedBase = normalizedEndpoint(baseUrl);
23
+ if (normalizedHost === DEFAULT_OAUTH_HOST && normalizedBase === DEFAULT_BASE_URL) {
24
+ return DEFAULT_OAUTH_KEY;
25
+ }
26
+ const digest = createHash("sha256")
27
+ .update(JSON.stringify({ oauthHost: normalizedHost, baseUrl: normalizedBase }))
28
+ .digest("hex")
29
+ .slice(0, 16);
30
+ return `oauth/kimi-code-env-${digest}`;
31
+ }
32
+ function storageName(key) {
33
+ const prefix = "oauth/";
34
+ const candidate = key.startsWith(prefix) ? key.slice(prefix.length) : key;
35
+ if (candidate.length === 0 || candidate.startsWith(".") || basename(candidate) !== candidate) {
36
+ throw new Error("Kimi returned an invalid OAuth credential key");
37
+ }
38
+ return candidate;
39
+ }
40
+ export function kimiRemainingMs(deadline) {
41
+ const remaining = deadline - Date.now();
42
+ if (remaining <= 0) {
43
+ throw new Error("Kimi account usage timed out");
44
+ }
45
+ return remaining;
46
+ }
47
+ /** Resolve Kimi's own managed provider, environment, and credential slot. */
48
+ export async function resolveKimiAuth(command, deadline) {
49
+ // Kimi's public JSON command is the stable way to read its resolved TOML
50
+ // shape without importing private packages or teaching OAR a TOML dialect.
51
+ const result = await runExecutable(command, ["provider", "list", "--json"], {
52
+ env: process.env,
53
+ timeoutMs: kimiRemainingMs(deadline),
54
+ });
55
+ if (!result.ok) {
56
+ return null;
57
+ }
58
+ const root = asRecord(parseJson(result.stdout));
59
+ const provider = asRecord(asRecord(root?.providers)?.[MANAGED_PROVIDER]);
60
+ if (provider === null || provider.type !== "kimi") {
61
+ return null;
62
+ }
63
+ const configuredOAuth = asRecord(provider.oauth);
64
+ const envBaseUrl = text(process.env.KIMI_CODE_BASE_URL);
65
+ const envOAuthHost = text(process.env.KIMI_CODE_OAUTH_HOST ?? process.env.KIMI_OAUTH_HOST);
66
+ const hasEnvironmentOverride = envBaseUrl !== undefined || envOAuthHost !== undefined;
67
+ const baseUrl = normalizedEndpoint(envBaseUrl ?? text(provider.baseUrl) ?? DEFAULT_BASE_URL);
68
+ const oauthHost = normalizedEndpoint(envOAuthHost ?? text(configuredOAuth?.oauthHost) ?? DEFAULT_OAUTH_HOST);
69
+ const expectedKey = oauthKey(oauthHost, baseUrl);
70
+ const configuredKey = text(configuredOAuth?.key);
71
+ const selectedKey = !hasEnvironmentOverride && configuredKey === expectedKey
72
+ ? configuredKey
73
+ : expectedKey;
74
+ const configuredStorage = text(configuredOAuth?.storage);
75
+ const selectedStorage = !hasEnvironmentOverride && configuredKey === expectedKey
76
+ && configuredStorage !== undefined && configuredStorage !== "file"
77
+ ? "other"
78
+ : "file";
79
+ const home = text(process.env.KIMI_CODE_HOME) ?? join(homedir(), ".kimi-code");
80
+ const selectedStorageName = storageName(selectedKey);
81
+ return {
82
+ baseUrl,
83
+ oauthHost,
84
+ storage: selectedStorage,
85
+ storageName: selectedStorageName,
86
+ home,
87
+ credentialPath: join(home, "credentials", `${selectedStorageName}.json`),
88
+ };
89
+ }
90
+ //# sourceMappingURL=auth-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-config.js","sourceRoot":"","sources":["../../../src/runtimes/kimi/auth-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare const kimiRuntime: {
2
+ readonly id: "kimi";
3
+ readonly installation: import("../../index.js").InstallationProbe;
4
+ readonly accountUsage: import("../../index.js").AccountUsageReader;
5
+ readonly session: import("../../index.js").StartSession;
6
+ };
7
+ export { kimiAccountEmail, kimiAccountUsage, projectKimiUsage } from "./account-usage.js";
8
+ export { kimiSession } from "./session.js";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtimes/kimi/index.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,WAAW;;;;;CAKtB,CAAC;AAEH,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC1F,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { defineRuntime } from "../../contracts/runtime.js";
2
+ import { kimiAccountUsage } from "./account-usage.js";
3
+ import { kimiInstallation } from "./installation.js";
4
+ import { kimiSession } from "./session.js";
5
+ export const kimiRuntime = defineRuntime({
6
+ id: "kimi",
7
+ installation: kimiInstallation,
8
+ accountUsage: kimiAccountUsage,
9
+ session: kimiSession,
10
+ });
11
+ export { kimiAccountEmail, kimiAccountUsage, projectKimiUsage } from "./account-usage.js";
12
+ export { kimiSession } from "./session.js";
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtimes/kimi/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAC;IACvC,EAAE,EAAE,MAAM;IACV,YAAY,EAAE,gBAAgB;IAC9B,YAAY,EAAE,gBAAgB;IAC9B,OAAO,EAAE,WAAW;CACrB,CAAC,CAAC;AAEH,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC1F,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,4 @@
1
+ /** Official native-installer layouts that can be invisible to GUI-process PATH. */
2
+ export declare function kimiInstalledExecutableCandidates(platform?: NodeJS.Platform, home?: string, env?: Readonly<NodeJS.ProcessEnv>): readonly string[];
3
+ export declare const kimiInstallation: import("../../index.js").InstallationProbe;
4
+ //# sourceMappingURL=installation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installation.d.ts","sourceRoot":"","sources":["../../../src/runtimes/kimi/installation.ts"],"names":[],"mappings":"AAIA,mFAAmF;AACnF,wBAAgB,iCAAiC,CAC/C,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,IAAI,GAAE,MAAkB,EACxB,GAAG,GAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAe,GAC7C,SAAS,MAAM,EAAE,CAWnB;AAED,eAAO,MAAM,gBAAgB,4CAM5B,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { homedir } from "node:os";
2
+ import path from "node:path";
3
+ import { executableInstallation } from "../../shared/installation.js";
4
+ /** Official native-installer layouts that can be invisible to GUI-process PATH. */
5
+ export function kimiInstalledExecutableCandidates(platform = process.platform, home = homedir(), env = process.env) {
6
+ const paths = platform === "win32" ? path.win32 : path.posix;
7
+ const executable = platform === "win32" ? "kimi.exe" : "kimi";
8
+ return [
9
+ ...(env.KIMI_INSTALL_DIR === undefined || env.KIMI_INSTALL_DIR === ""
10
+ ? []
11
+ : [paths.join(env.KIMI_INSTALL_DIR, "bin", executable)]),
12
+ paths.join(home, ".kimi-code", "bin", executable),
13
+ // Retain the previous command name only as the last compatibility fallback.
14
+ "kimi-code",
15
+ ];
16
+ }
17
+ export const kimiInstallation = executableInstallation("OAR_KIMI_BIN", "kimi", kimiInstalledExecutableCandidates, ["acp", "--help"], { readinessTimeoutMs: 30_000, versionTimeoutMs: 30_000 });
18
+ //# sourceMappingURL=installation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installation.js","sourceRoot":"","sources":["../../../src/runtimes/kimi/installation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAEtE,mFAAmF;AACnF,MAAM,UAAU,iCAAiC,CAC/C,WAA4B,OAAO,CAAC,QAAQ,EAC5C,OAAe,OAAO,EAAE,EACxB,MAAmC,OAAO,CAAC,GAAG;IAE9C,MAAM,KAAK,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;IAC7D,MAAM,UAAU,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC;IAC9D,OAAO;QACL,GAAG,CAAC,GAAG,CAAC,gBAAgB,KAAK,SAAS,IAAI,GAAG,CAAC,gBAAgB,KAAK,EAAE;YACnE,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;QAC1D,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,CAAC;QACjD,4EAA4E;QAC5E,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,sBAAsB,CACpD,cAAc,EACd,MAAM,EACN,iCAAiC,EACjC,CAAC,KAAK,EAAE,QAAQ,CAAC,EACjB,EAAE,kBAAkB,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,CACzD,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { KimiAuthContext } from "./auth-config.js";
2
+ /** The stored credential is unusable; the account needs `kimi` re-auth. */
3
+ export declare class KimiReauthError extends Error {
4
+ constructor(message: string);
5
+ }
6
+ /**
7
+ * Read Kimi's stored OAuth access token as-is. The credential store belongs to
8
+ * the Kimi CLI, so oar never refreshes or rewrites it; a stale token surfaces
9
+ * as the usage endpoint's 401/403, which callers map to reauth_required.
10
+ */
11
+ export declare function storedKimiAccessToken(auth: KimiAuthContext): Promise<string>;
12
+ //# sourceMappingURL=oauth-token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-token.d.ts","sourceRoot":"","sources":["../../../src/runtimes/kimi/oauth-token.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,2EAA2E;AAC3E,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAI5B;AAUD;;;;GAIG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAMlF"}
@@ -0,0 +1,38 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { asRecord, parseJson } from "../../shared/json.js";
3
+ /** The stored credential is unusable; the account needs `kimi` re-auth. */
4
+ export class KimiReauthError extends Error {
5
+ constructor(message) {
6
+ super(message);
7
+ this.name = "KimiReauthError";
8
+ }
9
+ }
10
+ function text(value) {
11
+ if (typeof value !== "string") {
12
+ return undefined;
13
+ }
14
+ const trimmed = value.trim();
15
+ return trimmed.length > 0 ? trimmed : undefined;
16
+ }
17
+ /**
18
+ * Read Kimi's stored OAuth access token as-is. The credential store belongs to
19
+ * the Kimi CLI, so oar never refreshes or rewrites it; a stale token surfaces
20
+ * as the usage endpoint's 401/403, which callers map to reauth_required.
21
+ */
22
+ export async function storedKimiAccessToken(auth) {
23
+ const accessToken = await readAccessToken(auth.credentialPath);
24
+ if (accessToken === undefined) {
25
+ throw new KimiReauthError("No Kimi OAuth token is stored");
26
+ }
27
+ return accessToken;
28
+ }
29
+ async function readAccessToken(path) {
30
+ try {
31
+ const raw = await readFile(path, "utf8");
32
+ return text(asRecord(parseJson(raw))?.access_token);
33
+ }
34
+ catch {
35
+ return undefined;
36
+ }
37
+ }
38
+ //# sourceMappingURL=oauth-token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-token.js","sourceRoot":"","sources":["../../../src/runtimes/kimi/oauth-token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAG3D,2EAA2E;AAC3E,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,SAAS,IAAI,CAAC,KAAc;IAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAAqB;IAC/D,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC/D,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,IAAI,eAAe,CAAC,+BAA+B,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,IAAY;IACzC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { type AcpSessionProfile } from "../../shared/acp/session.js";
2
+ import { type JsonRecord } from "../../shared/json.js";
3
+ export declare function selectKimiAuthMethod(initialized: JsonRecord): string | undefined;
4
+ export declare function supportsKimiYolo(response: JsonRecord): boolean;
5
+ export declare const kimiAcpProfile: AcpSessionProfile;
6
+ export declare const kimiSession: import("../../contracts/session.js").StartSession;
7
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/runtimes/kimi/session.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,KAAK,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACjF,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEjE,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAOhF;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,UAAU,GAAG,OAAO,CAU9D;AAQD,eAAO,MAAM,cAAc,EAAE,iBAc5B,CAAC;AAEF,eAAO,MAAM,WAAW,mDAA6B,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { acpSession } from "../../shared/acp/session.js";
2
+ import { asRecord } from "../../shared/json.js";
3
+ export function selectKimiAuthMethod(initialized) {
4
+ const methods = Array.isArray(initialized.authMethods) ? initialized.authMethods : [];
5
+ return methods
6
+ .map((method) => asRecord(method))
7
+ .some((method) => method?.id === "login")
8
+ ? "login"
9
+ : undefined;
10
+ }
11
+ export function supportsKimiYolo(response) {
12
+ const modes = asRecord(response.modes);
13
+ const availableModes = Array.isArray(modes?.availableModes) ? modes.availableModes : [];
14
+ if (availableModes.map((mode) => asRecord(mode)).some((mode) => mode?.id === "yolo")) {
15
+ return true;
16
+ }
17
+ const options = Array.isArray(response.configOptions) ? response.configOptions : [];
18
+ const mode = options.map((option) => asRecord(option)).find((option) => option?.id === "mode");
19
+ const values = Array.isArray(mode?.options) ? mode.options : [];
20
+ return values.map((value) => asRecord(value)).some((option) => option?.value === "yolo");
21
+ }
22
+ function validateKimiOptions(options) {
23
+ if (options.systemPrompt !== undefined || options.appendSystemPrompt !== undefined) {
24
+ throw new Error("Kimi ACP does not expose a system prompt override");
25
+ }
26
+ }
27
+ export const kimiAcpProfile = {
28
+ args: ["acp"],
29
+ requestTimeoutMs: 30_000,
30
+ selectAuthMethod: selectKimiAuthMethod,
31
+ validateOptions: validateKimiOptions,
32
+ configureSession: async ({ connection, sessionId, response, requestOptions }) => {
33
+ if (supportsKimiYolo(response)) {
34
+ await connection.agent.request("session/set_mode", { sessionId, modeId: "yolo" }, requestOptions);
35
+ }
36
+ },
37
+ };
38
+ export const kimiSession = acpSession(kimiAcpProfile);
39
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/runtimes/kimi/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { ProviderAuthFacade, ProviderLoginEvent, ProviderLoginPrompt } from "../../contracts/provider-auth.js";
2
+ import { ModelRuntime } from "@earendil-works/pi-coding-agent";
3
+ type PiLoginParameters = Parameters<ModelRuntime["login"]>;
4
+ type PiInteraction = PiLoginParameters[2];
5
+ type PiAuthEvent = Parameters<PiInteraction["notify"]>[0];
6
+ type PiAuthPrompt = Parameters<PiInteraction["prompt"]>[0];
7
+ export declare function toLoginEvent(event: PiAuthEvent): ProviderLoginEvent;
8
+ export declare function toLoginPrompt(prompt: PiAuthPrompt): ProviderLoginPrompt;
9
+ export interface PiProviderAuthOptions {
10
+ /** Path to Pi's `auth.json`; defaults to Pi's `~/.pi/agent/auth.json`. */
11
+ readonly authPath?: string;
12
+ }
13
+ /** Create a {@link ProviderAuthFacade} backed by Pi's `ModelRuntime`. */
14
+ export declare function createPiProviderAuth(options?: PiProviderAuthOptions): Promise<ProviderAuthFacade>;
15
+ export {};
16
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/runtimes/pi/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAElB,kBAAkB,EAGlB,mBAAmB,EACpB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAQ/D,KAAK,iBAAiB,GAAG,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;AAE3D,KAAK,aAAa,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;AAC1C,KAAK,WAAW,GAAG,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1D,KAAK,YAAY,GAAG,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE3D,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,kBAAkB,CAsBnE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,mBAAmB,CAiBvE;AAwFD,MAAM,WAAW,qBAAqB;IACpC,0EAA0E;IAC1E,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,yEAAyE;AACzE,wBAAsB,oBAAoB,CAAC,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAO3G"}
@@ -0,0 +1,124 @@
1
+ import { ModelRuntime } from "@earendil-works/pi-coding-agent";
2
+ export function toLoginEvent(event) {
3
+ switch (event.type) {
4
+ case "auth_url":
5
+ return {
6
+ kind: "auth_url",
7
+ url: event.url,
8
+ ...(event.instructions === undefined ? {} : { instructions: event.instructions }),
9
+ };
10
+ case "device_code":
11
+ return {
12
+ kind: "device_code",
13
+ userCode: event.userCode,
14
+ verificationUri: event.verificationUri,
15
+ ...(event.intervalSeconds === undefined ? {} : { intervalSeconds: event.intervalSeconds }),
16
+ ...(event.expiresInSeconds === undefined ? {} : { expiresInSeconds: event.expiresInSeconds }),
17
+ };
18
+ case "info":
19
+ case "progress":
20
+ return { kind: "info", message: event.message };
21
+ }
22
+ // Unreachable: the switch is exhaustive over Pi's auth-event union.
23
+ throw new Error("unhandled Pi auth event");
24
+ }
25
+ export function toLoginPrompt(prompt) {
26
+ if (prompt.type === "select") {
27
+ return {
28
+ kind: "select",
29
+ message: prompt.message,
30
+ options: prompt.options.map((option) => ({
31
+ id: option.id,
32
+ label: option.label,
33
+ ...(option.description === undefined ? {} : { description: option.description }),
34
+ })),
35
+ };
36
+ }
37
+ return {
38
+ kind: prompt.type,
39
+ message: prompt.message,
40
+ ...(prompt.placeholder === undefined ? {} : { placeholder: prompt.placeholder }),
41
+ };
42
+ }
43
+ /** Bridge an oar {@link ProviderLoginInteraction} into Pi's interaction shape. */
44
+ function toPiInteraction(interaction) {
45
+ return {
46
+ ...(interaction.signal === undefined ? {} : { signal: interaction.signal }),
47
+ notify: (event) => {
48
+ interaction.onEvent(toLoginEvent(event));
49
+ },
50
+ prompt: async (prompt) => {
51
+ const answer = await interaction.prompt(toLoginPrompt(prompt));
52
+ return answer;
53
+ },
54
+ };
55
+ }
56
+ /** A non-interactive interaction that answers every prompt with a fixed value. */
57
+ function fixedAnswerInteraction(answer) {
58
+ return {
59
+ onEvent: () => {
60
+ // A non-interactive api-key flow surfaces no URL or device code.
61
+ },
62
+ prompt: async () => {
63
+ await Promise.resolve();
64
+ return answer;
65
+ },
66
+ };
67
+ }
68
+ class PiProviderAuth {
69
+ #runtime;
70
+ constructor(runtime) {
71
+ this.#runtime = runtime;
72
+ }
73
+ async #statusOf(providerId) {
74
+ const check = await this.#runtime.checkAuth(providerId);
75
+ if (check === undefined) {
76
+ return { providerId, configured: false };
77
+ }
78
+ const status = this.#runtime.getProviderAuthStatus(providerId);
79
+ const label = status.label ?? check.source;
80
+ return {
81
+ providerId,
82
+ configured: true,
83
+ method: check.type === "oauth" ? "oauth" : "api_key",
84
+ ...(label === undefined ? {} : { label }),
85
+ subscription: this.#runtime.isUsingSubscription(providerId),
86
+ };
87
+ }
88
+ async listProviders() {
89
+ const credentials = await this.#runtime.listCredentials();
90
+ return Promise.all(credentials.map(async (credential) => {
91
+ const status = await this.#statusOf(credential.providerId);
92
+ return status;
93
+ }));
94
+ }
95
+ async status(providerId) {
96
+ const status = await this.#statusOf(providerId);
97
+ return status;
98
+ }
99
+ async login(providerId, method, interaction) {
100
+ const authType = method;
101
+ await this.#runtime.login(providerId, authType, toPiInteraction(interaction));
102
+ const status = await this.#statusOf(providerId);
103
+ return status;
104
+ }
105
+ async setApiKey(providerId, apiKey) {
106
+ // Persist the key by running the api-key login flow with a non-interactive
107
+ // interaction that answers the secret prompt with the supplied key.
108
+ const authType = "api_key";
109
+ await this.#runtime.login(providerId, authType, toPiInteraction(fixedAnswerInteraction(apiKey)));
110
+ }
111
+ async logout(providerId) {
112
+ await this.#runtime.logout(providerId);
113
+ }
114
+ }
115
+ /** Create a {@link ProviderAuthFacade} backed by Pi's `ModelRuntime`. */
116
+ export async function createPiProviderAuth(options = {}) {
117
+ const runtime = await ModelRuntime.create({
118
+ ...(options.authPath === undefined ? {} : { authPath: options.authPath }),
119
+ allowModelNetwork: false,
120
+ refreshOnCreate: false,
121
+ });
122
+ return new PiProviderAuth(runtime);
123
+ }
124
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/runtimes/pi/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ModelCatalogFacade } from "../../contracts/model-catalog.js";
2
+ export interface PiModelCatalogOptions {
3
+ /** Path to Pi's `auth.json`; defaults to Pi's `~/.pi/agent/auth.json`. */
4
+ readonly authPath?: string;
5
+ /** Path to Pi's `models.json`; `null` disables the static config. */
6
+ readonly modelsPath?: string | null;
7
+ }
8
+ /** Create a {@link ModelCatalogFacade} backed by Pi's `ModelRegistry`. */
9
+ export declare function createPiModelCatalog(options?: PiModelCatalogOptions): Promise<ModelCatalogFacade>;
10
+ //# sourceMappingURL=catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../../src/runtimes/pi/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAKV,kBAAkB,EACnB,MAAM,kCAAkC,CAAC;AAmE1C,MAAM,WAAW,qBAAqB;IACpC,0EAA0E;IAC1E,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,qEAAqE;IACrE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AAED,0EAA0E;AAC1E,wBAAsB,oBAAoB,CAAC,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAO3G"}
@@ -0,0 +1,66 @@
1
+ import { ModelRegistry, ModelRuntime, resolveCliModel } from "@earendil-works/pi-coding-agent";
2
+ function toCatalogModel(model) {
3
+ return {
4
+ id: model.id,
5
+ providerId: model.provider,
6
+ wire: model.api,
7
+ baseUrl: model.baseUrl,
8
+ contextWindow: model.contextWindow,
9
+ maxTokens: model.maxTokens,
10
+ reasoning: model.reasoning,
11
+ input: [...model.input],
12
+ };
13
+ }
14
+ class PiModelCatalog {
15
+ #runtime;
16
+ #registry;
17
+ constructor(runtime) {
18
+ this.#runtime = runtime;
19
+ this.#registry = new ModelRegistry(runtime);
20
+ }
21
+ providers() {
22
+ const ids = new Set(this.#registry.getAll().map((model) => model.provider));
23
+ return [...ids].map((id) => ({
24
+ id,
25
+ name: this.#registry.getProviderDisplayName(id),
26
+ configured: this.#registry.getProviderAuthStatus(id).configured,
27
+ }));
28
+ }
29
+ models(providerId) {
30
+ const all = this.#registry.getAll();
31
+ const scoped = providerId === undefined ? all : all.filter((model) => model.provider === providerId);
32
+ return scoped.map((model) => toCatalogModel(model));
33
+ }
34
+ defaultModel(providerId) {
35
+ const resolved = resolveCliModel({ modelRuntime: this.#runtime, cliProvider: providerId });
36
+ if (resolved.model !== undefined) {
37
+ return resolved.model.id;
38
+ }
39
+ // Pi's curated per-provider default (`defaultModelPerProvider`) is not part
40
+ // of its public export, and `resolveCliModel` only resolves providers with
41
+ // usable auth; fall back to the first catalogued model for the provider.
42
+ return this.#registry.getAll().find((model) => model.provider === providerId)?.id;
43
+ }
44
+ async refresh(options = {}) {
45
+ const result = await this.#registry.refresh({
46
+ allowNetwork: options.allowNetwork ?? true,
47
+ ...(options.providers === undefined ? {} : { providers: options.providers }),
48
+ ...(options.signal === undefined ? {} : { signal: options.signal }),
49
+ });
50
+ const errors = new Map();
51
+ for (const [providerId, error] of result.errors) {
52
+ errors.set(providerId, error.message);
53
+ }
54
+ return { aborted: result.aborted, errors };
55
+ }
56
+ }
57
+ /** Create a {@link ModelCatalogFacade} backed by Pi's `ModelRegistry`. */
58
+ export async function createPiModelCatalog(options = {}) {
59
+ const runtime = await ModelRuntime.create({
60
+ ...(options.authPath === undefined ? {} : { authPath: options.authPath }),
61
+ ...(options.modelsPath === undefined ? {} : { modelsPath: options.modelsPath }),
62
+ refreshOnCreate: false,
63
+ });
64
+ return new PiModelCatalog(runtime);
65
+ }
66
+ //# sourceMappingURL=catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../../src/runtimes/pi/catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export type AcpErrorKind = "timeout" | "process_exited";
2
+ /** One transport error class with a discriminant instead of four nominal wrappers. */
3
+ export declare class AcpError extends Error {
4
+ readonly kind: AcpErrorKind;
5
+ readonly exitCode: number | null;
6
+ readonly method: string | null;
7
+ readonly timeoutMs: number | null;
8
+ constructor(kind: AcpErrorKind, message: string, fields?: {
9
+ readonly exitCode?: number | null;
10
+ readonly method?: string;
11
+ readonly timeoutMs?: number;
12
+ });
13
+ }
14
+ export declare function acpRequestTimeoutError(method: string, timeoutMs: number): AcpError;
15
+ export declare function acpProcessExitedError(exitCode: number | null): AcpError;
16
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/shared/acp/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,gBAAgB,CAAC;AAExD,sFAAsF;AACtF,qBAAa,QAAS,SAAQ,KAAK;IACjC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;gBAGhC,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,MAAM,EACf,MAAM,GAAE;QACN,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;KACxB;CAST;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,QAAQ,CAKlF;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,QAAQ,CAMvE"}
@@ -0,0 +1,25 @@
1
+ /** One transport error class with a discriminant instead of four nominal wrappers. */
2
+ export class AcpError extends Error {
3
+ kind;
4
+ exitCode;
5
+ method;
6
+ timeoutMs;
7
+ constructor(kind, message, fields = {}) {
8
+ super(message);
9
+ this.name = "AcpError";
10
+ this.kind = kind;
11
+ this.exitCode = fields.exitCode ?? null;
12
+ this.method = fields.method ?? null;
13
+ this.timeoutMs = fields.timeoutMs ?? null;
14
+ }
15
+ }
16
+ export function acpRequestTimeoutError(method, timeoutMs) {
17
+ return new AcpError("timeout", `ACP request ${method} timed out after ${timeoutMs}ms`, {
18
+ method,
19
+ timeoutMs,
20
+ });
21
+ }
22
+ export function acpProcessExitedError(exitCode) {
23
+ return new AcpError("process_exited", exitCode === null ? "ACP process exited" : `ACP process exited with code ${exitCode}`, { exitCode });
24
+ }
25
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/shared/acp/errors.ts"],"names":[],"mappings":"AAEA,sFAAsF;AACtF,MAAM,OAAO,QAAS,SAAQ,KAAK;IACxB,IAAI,CAAe;IACnB,QAAQ,CAAgB;IACxB,MAAM,CAAgB;IACtB,SAAS,CAAgB;IAElC,YACE,IAAkB,EAClB,OAAe,EACf,SAII,EAAE;QAEN,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC;QACxC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC;QACpC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC;IAC5C,CAAC;CACF;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAc,EAAE,SAAiB;IACtE,OAAO,IAAI,QAAQ,CAAC,SAAS,EAAE,eAAe,MAAM,oBAAoB,SAAS,IAAI,EAAE;QACrF,MAAM;QACN,SAAS;KACV,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,QAAuB;IAC3D,OAAO,IAAI,QAAQ,CACjB,gBAAgB,EAChB,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,gCAAgC,QAAQ,EAAE,EACrF,EAAE,QAAQ,EAAE,CACb,CAAC;AACJ,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { type ClientApp, type ClientConnection, type SendRequestOptions } from "@agentclientprotocol/sdk";
2
+ export { client as createAcpClient, methods } from "@agentclientprotocol/sdk";
3
+ export type { ClientApp, SessionNotification } from "@agentclientprotocol/sdk";
4
+ export interface AcpProcessOptions {
5
+ readonly cwd?: string;
6
+ readonly env?: NodeJS.ProcessEnv;
7
+ }
8
+ /** A child process connected directly to an official SDK client app. */
9
+ export interface AcpProcess {
10
+ readonly connection: ClientConnection;
11
+ readonly spawned: Promise<void>;
12
+ readonly exited: Promise<number | null>;
13
+ readonly closed: boolean;
14
+ readonly exitCode: number | null;
15
+ kill(): void;
16
+ }
17
+ /**
18
+ * Add OAR's deadline and process-exit semantics around one direct SDK request.
19
+ * A null timeout is for prompts, whose lifetime is controlled by cancel.
20
+ */
21
+ export declare function withAcpDeadline<Response>(process: AcpProcess, method: string, timeoutMs: number | null, send: (options?: SendRequestOptions) => Promise<Response>): Promise<Response>;
22
+ /** Spawn a stdio ACP agent and let the official SDK own the wire protocol. */
23
+ export declare function startAcpProcess(command: string, args: readonly string[], app: ClientApp, options?: AcpProcessOptions): AcpProcess;
24
+ //# sourceMappingURL=process.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../../src/shared/acp/process.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACxB,MAAM,0BAA0B,CAAC;AAKlC,OAAO,EAAE,MAAM,IAAI,eAAe,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAC9E,YAAY,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAqB/E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CAClC;AAED,wEAAwE;AACxE,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,IAAI,IAAI,IAAI,CAAC;CACd;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAC5C,OAAO,EAAE,UAAU,EACnB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,kBAAkB,KAAK,OAAO,CAAC,QAAQ,CAAC,GACxD,OAAO,CAAC,QAAQ,CAAC,CA4BnB;AAED,8EAA8E;AAC9E,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,GAAG,EAAE,SAAS,EACd,OAAO,GAAE,iBAAsB,GAC9B,UAAU,CAiCZ"}