@geminixiang/mikan 1.0.0-beta.95 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +387 -391
- package/README.md +33 -42
- package/dist/adapters/github/bot.js +1 -1
- package/dist/adapters/github/bot.js.map +1 -1
- package/dist/adapters/github/policy.d.ts +2 -9
- package/dist/adapters/github/policy.d.ts.map +1 -1
- package/dist/adapters/github/policy.js +18 -26
- package/dist/adapters/github/policy.js.map +1 -1
- package/dist/adapters/slack/bot.d.ts +2 -4
- package/dist/adapters/slack/bot.d.ts.map +1 -1
- package/dist/adapters/slack/bot.js +28 -56
- package/dist/adapters/slack/bot.js.map +1 -1
- package/dist/adapters/slack/socket-agent.d.ts +9 -0
- package/dist/adapters/slack/socket-agent.d.ts.map +1 -0
- package/dist/adapters/slack/socket-agent.js +17 -0
- package/dist/adapters/slack/socket-agent.js.map +1 -0
- package/dist/adapters/telegram/bot.d.ts +1 -0
- package/dist/adapters/telegram/bot.d.ts.map +1 -1
- package/dist/adapters/telegram/bot.js +6 -1
- package/dist/adapters/telegram/bot.js.map +1 -1
- package/dist/adapters/telegram/types.d.ts +1 -0
- package/dist/adapters/telegram/types.d.ts.map +1 -1
- package/dist/adapters/telegram/types.js.map +1 -1
- package/dist/cli/arg-grammar.d.ts +1 -2
- package/dist/cli/arg-grammar.d.ts.map +1 -1
- package/dist/cli/arg-grammar.js +2 -17
- package/dist/cli/arg-grammar.js.map +1 -1
- package/dist/cli/boot.d.ts.map +1 -1
- package/dist/cli/boot.js +5 -11
- package/dist/cli/boot.js.map +1 -1
- package/dist/cli/migrate.d.ts.map +1 -1
- package/dist/cli/migrate.js +22 -7
- package/dist/cli/migrate.js.map +1 -1
- package/dist/cli/office.d.ts.map +1 -1
- package/dist/cli/office.js +3 -5
- package/dist/cli/office.js.map +1 -1
- package/dist/cli/onboard.js +18 -20
- package/dist/cli/onboard.js.map +1 -1
- package/dist/cli/types.d.ts +1 -2
- package/dist/cli/types.d.ts.map +1 -1
- package/dist/cli/types.js.map +1 -1
- package/dist/env-manifest.d.ts +2 -0
- package/dist/env-manifest.d.ts.map +1 -1
- package/dist/env-manifest.js +76 -43
- package/dist/env-manifest.js.map +1 -1
- package/dist/events/index.d.ts +5 -5
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +1 -7
- package/dist/events/index.js.map +1 -1
- package/dist/file-guards.d.ts +1 -0
- package/dist/file-guards.d.ts.map +1 -1
- package/dist/file-guards.js +4 -1
- package/dist/file-guards.js.map +1 -1
- package/dist/harness/execution-resolver.d.ts.map +1 -1
- package/dist/harness/execution-resolver.js +1 -7
- package/dist/harness/execution-resolver.js.map +1 -1
- package/dist/harness/http.d.ts +1 -2
- package/dist/harness/http.d.ts.map +1 -1
- package/dist/harness/http.js +3 -16
- package/dist/harness/http.js.map +1 -1
- package/dist/harness/jev.d.ts +2 -1
- package/dist/harness/jev.d.ts.map +1 -1
- package/dist/harness/jev.js.map +1 -1
- package/dist/harness/prompt.d.ts.map +1 -1
- package/dist/harness/prompt.js +0 -6
- package/dist/harness/prompt.js.map +1 -1
- package/dist/harness/session.d.ts +2 -9
- package/dist/harness/session.d.ts.map +1 -1
- package/dist/harness/session.js +3 -3
- package/dist/harness/session.js.map +1 -1
- package/dist/harness/tools/event.d.ts +0 -1
- package/dist/harness/tools/event.d.ts.map +1 -1
- package/dist/harness/tools/event.js +1 -7
- package/dist/harness/tools/event.js.map +1 -1
- package/dist/harness/types.d.ts +3 -3
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js.map +1 -1
- package/dist/index.d.ts +8 -31
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -15
- package/dist/index.js.map +1 -1
- package/dist/main.js +26 -36
- package/dist/main.js.map +1 -1
- package/dist/migrations/index.d.ts +0 -1
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/index.js +4 -4
- package/dist/migrations/index.js.map +1 -1
- package/dist/migrations/legacy-office-files.d.ts +3 -0
- package/dist/migrations/legacy-office-files.d.ts.map +1 -0
- package/dist/migrations/legacy-office-files.js +29 -0
- package/dist/migrations/legacy-office-files.js.map +1 -0
- package/dist/observability/instrument.js +2 -3
- package/dist/observability/instrument.js.map +1 -1
- package/dist/observability/sentry.js +1 -1
- package/dist/observability/sentry.js.map +1 -1
- package/dist/office/projection.js +2 -2
- package/dist/office/projection.js.map +1 -1
- package/dist/sandbox/identity.d.ts +0 -1
- package/dist/sandbox/identity.d.ts.map +1 -1
- package/dist/sandbox/identity.js +0 -3
- package/dist/sandbox/identity.js.map +1 -1
- package/dist/sandbox/registry.d.ts +1 -5
- package/dist/sandbox/registry.d.ts.map +1 -1
- package/dist/sandbox/registry.js +4 -13
- package/dist/sandbox/registry.js.map +1 -1
- package/dist/sandbox/types.d.ts +1 -5
- package/dist/sandbox/types.d.ts.map +1 -1
- package/dist/sandbox/types.js.map +1 -1
- package/dist/sessions/types.d.ts +1 -1
- package/dist/sessions/types.d.ts.map +1 -1
- package/dist/sessions/types.js.map +1 -1
- package/dist/settings/index.d.ts +56 -2
- package/dist/settings/index.d.ts.map +1 -1
- package/dist/settings/index.js +57 -37
- package/dist/settings/index.js.map +1 -1
- package/dist/types.d.ts +1 -25
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/vault/index.js +1 -1
- package/dist/vault/index.js.map +1 -1
- package/package.json +4 -17
- package/dist/cli/download.d.ts +0 -2
- package/dist/cli/download.d.ts.map +0 -1
- package/dist/cli/download.js +0 -84
- package/dist/cli/download.js.map +0 -1
- package/dist/harness/index.d.ts +0 -20
- package/dist/harness/index.d.ts.map +0 -1
- package/dist/harness/index.js +0 -14
- package/dist/harness/index.js.map +0 -1
- package/dist/sandbox/cloudflare.d.ts +0 -17
- package/dist/sandbox/cloudflare.d.ts.map +0 -1
- package/dist/sandbox/cloudflare.js +0 -142
- package/dist/sandbox/cloudflare.js.map +0 -1
- package/dist/sandbox/index.d.ts +0 -7
- package/dist/sandbox/index.d.ts.map +0 -1
- package/dist/sandbox/index.js +0 -6
- package/dist/sandbox/index.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/sandbox/identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAI/C,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEhC,MAAM,UAAU,0BAA0B,CACxC,UAAyB,EACzB,KAAsB;IAEtB,IAAI,UAAU,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACvE,IAAI,UAAU,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,sBAAsB,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IACzF,OAAO,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,OAAO,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,SAAiB;IACtD,OAAO,WAAW,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,UAAyB,EACzB,GAA+C;IAE/C,IAAI,UAAU,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,WAAW,CAAC,WAAW,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;IAC3F,IAAI,UAAU,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACvE,OAAO,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAa;IACnD,MAAM,SAAS,GAAG,KAAK;SACpB,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC3B,OAAO,SAAS,IAAI,SAAS,CAAC;AAChC,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/sandbox/identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAI/C,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEhC,MAAM,UAAU,0BAA0B,CACxC,UAAyB,EACzB,KAAsB;IAEtB,IAAI,UAAU,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACvE,IAAI,UAAU,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,sBAAsB,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IACzF,OAAO,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,OAAO,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,SAAiB;IACtD,OAAO,WAAW,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,UAAyB,EACzB,GAA+C;IAE/C,IAAI,UAAU,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,WAAW,CAAC,WAAW,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;IAC3F,IAAI,UAAU,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACvE,OAAO,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAa;IACnD,MAAM,SAAS,GAAG,KAAK;SACpB,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC3B,OAAO,SAAS,IAAI,SAAS,CAAC;AAChC,CAAC;AAED,SAAS,WAAW,CAAC,IAA0B,EAAE,KAAa;IAC5D,MAAM,QAAQ,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC;IAC9F,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC;SAC9B,MAAM,CAAC,GAAG,IAAI,KAAK,KAAK,EAAE,CAAC;SAC3B,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;IAClC,OAAO,GAAG,QAAQ,IAAI,IAAI,EAAE,CAAC;AAC/B,CAAC","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { officeKey } from \"../office/index.js\";\nimport type { OfficeAddress } from \"../types.js\";\nimport type { CredentialScope, SandboxConfig } from \"./types.js\";\n\nconst IDENTITY_HASH_LENGTH = 12;\n\nexport function credentialAuthorizationKey(\n baseConfig: SandboxConfig,\n scope: CredentialScope,\n): string {\n if (baseConfig.type === \"host\") return userCredentialKey(scope.userId);\n if (baseConfig.type === \"container\") return containerCredentialKey(baseConfig.container);\n return officeKey(scope.address);\n}\n\nexport function userCredentialKey(userId: string): string {\n return identityKey(\"user\", userId);\n}\n\nexport function containerCredentialKey(container: string): string {\n return identityKey(\"container\", container);\n}\n\nexport function runtimeResourceKey(\n baseConfig: SandboxConfig,\n ids: { userId: string; address: OfficeAddress },\n): string {\n if (baseConfig.type === \"container\") return identityKey(\"container\", baseConfig.container);\n if (baseConfig.type === \"host\") return identityKey(\"user\", ids.userId);\n return officeKey(ids.address);\n}\n\nexport function sanitizeIdentitySegment(value: string): string {\n const sanitized = value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n return sanitized || \"unknown\";\n}\n\nfunction identityKey(kind: \"user\" | \"container\", value: string): string {\n const readable = sanitizeIdentitySegment(value).slice(0, 40).replace(/-+$/g, \"\") || \"unknown\";\n const hash = createHash(\"sha256\")\n .update(`${kind}\\0${value}`)\n .digest(\"hex\")\n .slice(0, IDENTITY_HASH_LENGTH);\n return `${readable}-${hash}`;\n}\n"]}
|
|
@@ -1,12 +1,8 @@
|
|
|
1
|
-
import type { Executor,
|
|
2
|
-
declare const sandboxAdapters: readonly [SandboxAdapter<import("./types.js").HostSandboxConfig>, SandboxAdapter<import("./types.js").ContainerSandboxConfig>, SandboxAdapter<ImageSandboxConfig>, SandboxAdapter<import("./types.js").CloudflareSandboxConfig>];
|
|
3
|
-
export declare function getSandboxAdapters(): readonly [...typeof sandboxAdapters];
|
|
1
|
+
import type { Executor, RuntimePathContext, SandboxAdapter, SandboxConfig } from "./types.js";
|
|
4
2
|
export declare function getSandboxCredentialCapabilities(type: SandboxConfig["type"]): SandboxAdapter["credentials"];
|
|
5
|
-
export declare function getSandboxWorkspaceCapabilities(type: SandboxConfig["type"]): SandboxAdapter["workspace"];
|
|
6
3
|
export declare function warnUnenforcedPrivateOffice(sandboxConfig: SandboxConfig, visibility: "public" | "private", officeKey: string): void;
|
|
7
4
|
export declare function parseSandboxArg(value: string): SandboxConfig;
|
|
8
5
|
export declare function validateSandbox(config: SandboxConfig): Promise<void>;
|
|
9
6
|
export declare function createExecutor(config: SandboxConfig, env?: Record<string, string>, ensureReady?: () => Promise<void>): Executor;
|
|
10
7
|
export declare function getUnresolvedSandboxPathContext(sandboxConfig: SandboxConfig, hostWorkspaceRoot: string): RuntimePathContext;
|
|
11
|
-
export {};
|
|
12
8
|
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/sandbox/registry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/sandbox/registry.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,QAAQ,EAER,kBAAkB,EAClB,cAAc,EACd,aAAa,EACd,MAAM,YAAY,CAAC;AA0CpB,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,GAC1B,cAAc,CAAC,aAAa,CAAC,CAE/B;AAQD,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,QAAQ,GAAG,SAAS,EAChC,SAAS,EAAE,MAAM,GAChB,IAAI,CASN;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAiB5D;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1E;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,aAAa,EACrB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAChC,QAAQ,CAMV;AAED,wBAAgB,+BAA+B,CAC7C,aAAa,EAAE,aAAa,EAC5B,iBAAiB,EAAE,MAAM,GACxB,kBAAkB,CAMpB"}
|
package/dist/sandbox/registry.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { containerSandboxAdapter } from "./container.js";
|
|
2
|
-
import { cloudflareSandboxAdapter } from "./cloudflare.js";
|
|
3
2
|
import { hostSandboxAdapter } from "./host.js";
|
|
4
3
|
import { createMountedRuntimePathContext, execSimple, SandboxError } from "./utils.js";
|
|
5
4
|
import { GUEST_WORKSPACE_ROOT } from "./layout.js";
|
|
@@ -30,16 +29,8 @@ const imageSandboxAdapter = {
|
|
|
30
29
|
parse: parseImageSandboxArg,
|
|
31
30
|
validate: validateImageSandbox,
|
|
32
31
|
};
|
|
33
|
-
const sandboxAdapters = [
|
|
34
|
-
hostSandboxAdapter,
|
|
35
|
-
containerSandboxAdapter,
|
|
36
|
-
imageSandboxAdapter,
|
|
37
|
-
cloudflareSandboxAdapter,
|
|
38
|
-
];
|
|
32
|
+
const sandboxAdapters = [hostSandboxAdapter, containerSandboxAdapter, imageSandboxAdapter];
|
|
39
33
|
const sandboxAdapterByType = new Map(sandboxAdapters.map((adapter) => [adapter.type, adapter]));
|
|
40
|
-
export function getSandboxAdapters() {
|
|
41
|
-
return sandboxAdapters;
|
|
42
|
-
}
|
|
43
34
|
function requireSandboxAdapter(type) {
|
|
44
35
|
const adapter = sandboxAdapterByType.get(type);
|
|
45
36
|
if (!adapter)
|
|
@@ -49,7 +40,7 @@ function requireSandboxAdapter(type) {
|
|
|
49
40
|
export function getSandboxCredentialCapabilities(type) {
|
|
50
41
|
return requireSandboxAdapter(type).credentials;
|
|
51
42
|
}
|
|
52
|
-
|
|
43
|
+
function getSandboxWorkspaceCapabilities(type) {
|
|
53
44
|
return requireSandboxAdapter(type).workspace;
|
|
54
45
|
}
|
|
55
46
|
const warnedUnenforcedPrivacy = new Set();
|
|
@@ -60,7 +51,7 @@ export function warnUnenforcedPrivateOffice(sandboxConfig, visibility, officeKey
|
|
|
60
51
|
if (warnedUnenforcedPrivacy.has(officeKey))
|
|
61
52
|
return;
|
|
62
53
|
warnedUnenforcedPrivacy.add(officeKey);
|
|
63
|
-
log.logWarning(`Sandbox '${sandboxConfig.type}' cannot enforce private office visibility for ${officeKey}`, "host
|
|
54
|
+
log.logWarning(`Sandbox '${sandboxConfig.type}' cannot enforce private office visibility for ${officeKey}`, "host and container backends share one filesystem; use image:* to isolate private channels and DMs");
|
|
64
55
|
}
|
|
65
56
|
export function parseSandboxArg(value) {
|
|
66
57
|
for (const adapter of sandboxAdapters) {
|
|
@@ -72,7 +63,7 @@ export function parseSandboxArg(value) {
|
|
|
72
63
|
if (value.startsWith("docker:")) {
|
|
73
64
|
throw new SandboxError(`Error: '${value}' is not supported. Use 'container:<container-name>' for the shared-container mode or 'image:<image-name>' for mikan-managed per-user containers.`);
|
|
74
65
|
}
|
|
75
|
-
throw new SandboxError(`Error: Invalid sandbox type '${value}'. Use 'host', 'container:<container-name>', 'image:<image-name>'
|
|
66
|
+
throw new SandboxError(`Error: Invalid sandbox type '${value}'. Use 'host', 'container:<container-name>', or 'image:<image-name>'`);
|
|
76
67
|
}
|
|
77
68
|
export async function validateSandbox(config) {
|
|
78
69
|
await requireSandboxAdapter(config.type).validate?.(config);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/sandbox/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/sandbox/registry.ts"],"names":[],"mappings":"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","sourcesContent":["import { containerSandboxAdapter } from \"./container.js\";\nimport { hostSandboxAdapter } from \"./host.js\";\nimport { createMountedRuntimePathContext, execSimple, SandboxError } from \"./utils.js\";\nimport { GUEST_WORKSPACE_ROOT } from \"./layout.js\";\nimport * as log from \"../log.js\";\nimport type {\n Executor,\n ImageSandboxConfig,\n RuntimePathContext,\n SandboxAdapter,\n SandboxConfig,\n} from \"./types.js\";\n\nfunction parseImageSandboxArg(value: string): ImageSandboxConfig | undefined {\n if (!value.startsWith(\"image:\")) {\n return undefined;\n }\n\n const image = value.slice(\"image:\".length);\n if (!image) {\n throw new SandboxError(\"Error: image sandbox requires image name (e.g., image:ubuntu:24.04)\");\n }\n return { type: \"image\", image };\n}\n\nasync function validateImageSandbox(config: ImageSandboxConfig): Promise<void> {\n try {\n await execSimple(\"docker\", [\"--version\"]);\n } catch {\n throw new SandboxError(\"Error: Docker is not installed or not in PATH\");\n }\n console.log(` Image auto-provisioning enabled. Image: ${config.image}`);\n}\n\nconst imageSandboxAdapter: SandboxAdapter<ImageSandboxConfig> = {\n type: \"image\",\n credentials: { env: true, fileMounts: true },\n workspace: { managedProjection: true },\n parse: parseImageSandboxArg,\n validate: validateImageSandbox,\n};\n\nconst sandboxAdapters = [hostSandboxAdapter, containerSandboxAdapter, imageSandboxAdapter] as const;\nconst sandboxAdapterByType = new Map(\n sandboxAdapters.map((adapter) => [adapter.type, adapter]),\n) as Map<SandboxConfig[\"type\"], SandboxAdapter>;\n\nfunction requireSandboxAdapter(type: SandboxConfig[\"type\"]): SandboxAdapter {\n const adapter = sandboxAdapterByType.get(type);\n if (!adapter) throw new SandboxError(`Error: Unsupported sandbox type '${type}'`);\n return adapter;\n}\n\nexport function getSandboxCredentialCapabilities(\n type: SandboxConfig[\"type\"],\n): SandboxAdapter[\"credentials\"] {\n return requireSandboxAdapter(type).credentials;\n}\n\nfunction getSandboxWorkspaceCapabilities(type: SandboxConfig[\"type\"]): SandboxAdapter[\"workspace\"] {\n return requireSandboxAdapter(type).workspace;\n}\n\nconst warnedUnenforcedPrivacy = new Set<string>();\n\nexport function warnUnenforcedPrivateOffice(\n sandboxConfig: SandboxConfig,\n visibility: \"public\" | \"private\",\n officeKey: string,\n): void {\n const capabilities = getSandboxWorkspaceCapabilities(sandboxConfig.type);\n if (capabilities.managedProjection || visibility === \"public\") return;\n if (warnedUnenforcedPrivacy.has(officeKey)) return;\n warnedUnenforcedPrivacy.add(officeKey);\n log.logWarning(\n `Sandbox '${sandboxConfig.type}' cannot enforce private office visibility for ${officeKey}`,\n \"host and container backends share one filesystem; use image:* to isolate private channels and DMs\",\n );\n}\n\nexport function parseSandboxArg(value: string): SandboxConfig {\n for (const adapter of sandboxAdapters) {\n const config = adapter.parse(value);\n if (config) {\n return config;\n }\n }\n\n if (value.startsWith(\"docker:\")) {\n throw new SandboxError(\n `Error: '${value}' is not supported. Use 'container:<container-name>' for the shared-container mode or 'image:<image-name>' for mikan-managed per-user containers.`,\n );\n }\n\n throw new SandboxError(\n `Error: Invalid sandbox type '${value}'. Use 'host', 'container:<container-name>', or 'image:<image-name>'`,\n );\n}\n\nexport async function validateSandbox(config: SandboxConfig): Promise<void> {\n await requireSandboxAdapter(config.type).validate?.(config);\n}\n\nexport function createExecutor(\n config: SandboxConfig,\n env?: Record<string, string>,\n ensureReady?: () => Promise<void>,\n): Executor {\n const adapter = requireSandboxAdapter(config.type);\n if (!adapter.createExecutor) {\n throw new SandboxError(\"Error: image sandbox must resolve to a concrete container executor\");\n }\n return adapter.createExecutor(config, env, ensureReady);\n}\n\nexport function getUnresolvedSandboxPathContext(\n sandboxConfig: SandboxConfig,\n hostWorkspaceRoot: string,\n): RuntimePathContext {\n if (sandboxConfig.type === \"image\") {\n return createMountedRuntimePathContext(hostWorkspaceRoot, GUEST_WORKSPACE_ROOT);\n }\n\n return createExecutor(sandboxConfig).getPathContext(hostWorkspaceRoot);\n}\n"]}
|
package/dist/sandbox/types.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { OfficeAddress } from "../types.js";
|
|
2
|
-
export type SandboxConfig = HostSandboxConfig | ContainerSandboxConfig | ImageSandboxConfig
|
|
2
|
+
export type SandboxConfig = HostSandboxConfig | ContainerSandboxConfig | ImageSandboxConfig;
|
|
3
3
|
export interface HostSandboxConfig {
|
|
4
4
|
type: "host";
|
|
5
5
|
}
|
|
@@ -11,10 +11,6 @@ export interface ImageSandboxConfig {
|
|
|
11
11
|
type: "image";
|
|
12
12
|
image: string;
|
|
13
13
|
}
|
|
14
|
-
export interface CloudflareSandboxConfig {
|
|
15
|
-
type: "cloudflare";
|
|
16
|
-
sandboxId: string;
|
|
17
|
-
}
|
|
18
14
|
export interface Executor {
|
|
19
15
|
exec(command: string, options?: ExecOptions): Promise<ExecResult>;
|
|
20
16
|
readFile(path: string, options?: ExecOptions): Promise<string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sandbox/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sandbox/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,MAAM,aAAa,GAAG,iBAAiB,GAAG,sBAAsB,GAAG,kBAAkB,CAAC;AAE5F,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAElE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAE/D,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAErE,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE/E,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;IAE3C,cAAc,CAAC,iBAAiB,EAAE,MAAM,GAAG,kBAAkB,CAAC;IAE9D,gBAAgB,IAAI,aAAa,CAAC;CACnC;AAED,MAAM,WAAW,kBAAkB;IACjC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,iBAAiB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,MAAM,CAAC;CACrD;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAE3F,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,6BAA6B;IAC5C,GAAG,EAAE,OAAO,CAAC;IACb,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,aAAa,CAAC;CACxB;AAED,UAAU,4BAA4B;IACpC,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc,CAAC,OAAO,SAAS,aAAa,GAAG,aAAa;IAC3E,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACtB,WAAW,EAAE,6BAA6B,CAAC;IAC3C,SAAS,EAAE,4BAA4B,CAAC;IACxC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,cAAc,CAAC,CACb,MAAM,EAAE,OAAO,EACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAChC,QAAQ,CAAC;CACb"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/sandbox/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { OfficeAddress } from \"../types.js\";\n\nexport type SandboxConfig
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/sandbox/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { OfficeAddress } from \"../types.js\";\n\nexport type SandboxConfig = HostSandboxConfig | ContainerSandboxConfig | ImageSandboxConfig;\n\nexport interface HostSandboxConfig {\n type: \"host\";\n}\n\nexport interface ContainerSandboxConfig {\n type: \"container\";\n container: string;\n}\n\nexport interface ImageSandboxConfig {\n type: \"image\";\n image: string;\n}\n\nexport interface Executor {\n exec(command: string, options?: ExecOptions): Promise<ExecResult>;\n\n readFile(path: string, options?: ExecOptions): Promise<string>;\n\n readFileBase64(path: string, options?: ExecOptions): Promise<string>;\n\n writeFile(path: string, content: string, options?: ExecOptions): Promise<void>;\n\n getWorkspacePath(hostPath: string): string;\n\n getPathContext(hostWorkspaceRoot: string): RuntimePathContext;\n\n getSandboxConfig(): SandboxConfig;\n}\n\nexport interface RuntimePathContext {\n hostWorkspaceRoot: string;\n runtimeWorkspaceRoot: string;\n runtimeToHostPath?: (runtimePath: string) => string;\n}\n\nexport interface ExecOptions {\n timeout?: number;\n cwd?: string;\n signal?: AbortSignal;\n}\n\nexport type DockerExecFile = (file: string, args: string[]) => Promise<{ stdout: string }>;\n\nexport interface ExecResult {\n stdout: string;\n stderr: string;\n code: number;\n}\n\nexport interface SandboxCredentialCapabilities {\n env: boolean;\n fileMounts: boolean;\n}\n\nexport interface CredentialScope {\n userId: string;\n address: OfficeAddress;\n}\n\ninterface SandboxWorkspaceCapabilities {\n managedProjection: boolean;\n}\n\nexport interface SandboxAdapter<TConfig extends SandboxConfig = SandboxConfig> {\n type: TConfig[\"type\"];\n credentials: SandboxCredentialCapabilities;\n workspace: SandboxWorkspaceCapabilities;\n parse(value: string): TConfig | undefined;\n validate?(config: TConfig): Promise<void>;\n createExecutor?(\n config: TConfig,\n env?: Record<string, string>,\n ensureReady?: () => Promise<void>,\n ): Executor;\n}\n"]}
|
package/dist/sessions/types.d.ts
CHANGED
|
@@ -42,7 +42,7 @@ export interface SessionMessageEntry extends SessionEntryBase {
|
|
|
42
42
|
message: AgentMessage;
|
|
43
43
|
history?: ChatHistoryMessageIdentity;
|
|
44
44
|
}
|
|
45
|
-
|
|
45
|
+
interface SessionCustomEntry extends SessionEntryBase {
|
|
46
46
|
type: "custom";
|
|
47
47
|
customType: string;
|
|
48
48
|
data?: JsonValue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sessions/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EACV,YAAY,EACZ,OAAO,EACP,cAAc,EACd,eAAe,EACf,QAAQ,EACT,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,WAAW,wBAAwB;IACvC,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC;IAC5B,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACrC;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,QAAQ,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,UAAU,gBAAgB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAoB,SAAQ,gBAAgB;IAC3D,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,CAAC,EAAE,0BAA0B,CAAC;CACtC;AAED,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sessions/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/sessions/types.ts"],"names":[],"mappings":"AA8EA,MAAM,CAAC,MAAM,yBAAyB,GAAG,qBAAqB,CAAC;AAC/D,MAAM,CAAC,MAAM,qBAAqB,GAAG,iBAAiB,CAAC","sourcesContent":["import type { Office } from \"../office/types.js\";\nimport type { ConversationKind } from \"../types.js\";\nimport type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { Message, Models } from \"@earendil-works/pi-ai\";\nimport type {\n Conversation,\n Harness,\n HarnessOptions,\n HarnessSettings,\n Registry,\n} from \"@earendil-works/pi-durable\";\nimport type { JsonValue } from \"@earendil-works/chord\";\nimport type { ConversationLogMessage } from \"../types.js\";\nimport type { SessionStore } from \"./session-store.js\";\n\nexport interface ResolveSessionKeyOptions {\n conversationId: string;\n conversationKind: ConversationKind;\n messageId: string;\n threadTs?: string;\n persistentTopLevel?: boolean;\n scopeDirectThreads?: boolean;\n}\n\nexport interface SessionHarnessBinding {\n models: Models;\n requestModels?: Models;\n env?: HarnessOptions[\"env\"];\n settings?: HarnessSettings;\n onReport?: (error: unknown) => void;\n}\n\nexport interface AttachedSessionHarness {\n harness: Harness;\n conversation: Conversation;\n registry: Registry;\n extensionName: string;\n}\n\nexport interface SessionContext {\n messages: AgentMessage[];\n}\n\ninterface SessionEntryBase {\n id: string;\n timestamp: number;\n}\n\nexport interface ChatHistoryMessageIdentity {\n messageId: string | null;\n}\n\nexport interface SessionMessageEntry extends SessionEntryBase {\n type: \"message\";\n message: AgentMessage;\n history?: ChatHistoryMessageIdentity;\n}\n\
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/sessions/types.ts"],"names":[],"mappings":"AA8EA,MAAM,CAAC,MAAM,yBAAyB,GAAG,qBAAqB,CAAC;AAC/D,MAAM,CAAC,MAAM,qBAAqB,GAAG,iBAAiB,CAAC","sourcesContent":["import type { Office } from \"../office/types.js\";\nimport type { ConversationKind } from \"../types.js\";\nimport type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { Message, Models } from \"@earendil-works/pi-ai\";\nimport type {\n Conversation,\n Harness,\n HarnessOptions,\n HarnessSettings,\n Registry,\n} from \"@earendil-works/pi-durable\";\nimport type { JsonValue } from \"@earendil-works/chord\";\nimport type { ConversationLogMessage } from \"../types.js\";\nimport type { SessionStore } from \"./session-store.js\";\n\nexport interface ResolveSessionKeyOptions {\n conversationId: string;\n conversationKind: ConversationKind;\n messageId: string;\n threadTs?: string;\n persistentTopLevel?: boolean;\n scopeDirectThreads?: boolean;\n}\n\nexport interface SessionHarnessBinding {\n models: Models;\n requestModels?: Models;\n env?: HarnessOptions[\"env\"];\n settings?: HarnessSettings;\n onReport?: (error: unknown) => void;\n}\n\nexport interface AttachedSessionHarness {\n harness: Harness;\n conversation: Conversation;\n registry: Registry;\n extensionName: string;\n}\n\nexport interface SessionContext {\n messages: AgentMessage[];\n}\n\ninterface SessionEntryBase {\n id: string;\n timestamp: number;\n}\n\nexport interface ChatHistoryMessageIdentity {\n messageId: string | null;\n}\n\nexport interface SessionMessageEntry extends SessionEntryBase {\n type: \"message\";\n message: AgentMessage;\n history?: ChatHistoryMessageIdentity;\n}\n\ninterface SessionCustomEntry extends SessionEntryBase {\n type: \"custom\";\n customType: string;\n data?: JsonValue;\n}\n\nexport interface SessionCompactionEntry extends SessionEntryBase {\n type: \"compaction\";\n summary: string;\n}\n\nexport type SessionEntry = SessionMessageEntry | SessionCustomEntry | SessionCompactionEntry;\n\nexport type SessionRunStatus = \"completed\" | \"aborted\" | \"failed\";\n\nexport interface SessionRunRecord {\n endedAt?: number;\n status?: SessionRunStatus;\n}\n\nexport const CONTROL_INPUT_CUSTOM_TYPE = \"mikan.control_input\";\nexport const RUN_CAUSE_CUSTOM_TYPE = \"mikan.run_cause\";\n\nexport interface SessionInspection {\n getHeader(): SessionHeader;\n getEntries(): Promise<SessionEntry[]>;\n getSessionName(): Promise<string | undefined>;\n buildSessionContext(): Promise<SessionContext>;\n}\n\nexport interface SessionHeader {\n id: string;\n createdAt: number;\n parentSessionId?: string;\n}\n\nexport interface ThreadRootMessage {\n text?: string;\n userName?: string;\n user?: string;\n}\n\nexport interface ResolvedSessionScope {\n threadRootMessage: ThreadRootMessage | null;\n}\n\nexport interface SessionListing {\n key: string;\n id: string;\n createdAt: number;\n root: boolean;\n parentSessionId: string | undefined;\n forkEntryId: string | undefined;\n}\n\nexport type ImportedSessionEntry =\n | { type: \"message\"; message: Message; history?: ChatHistoryMessageIdentity }\n | { type: \"compaction\"; summary: string; timestamp: number }\n | { type: \"custom\"; customType: string; data: unknown; timestamp: number };\n\nexport interface ImportedSession {\n key: string;\n id: string;\n createdAt: number;\n root: boolean;\n name: string | undefined;\n entries: ImportedSessionEntry[];\n}\n\nexport interface LogRecord {\n message: ConversationLogMessage;\n index: number;\n}\n\nexport interface ChatHistorySyncOptions {\n isCommandText: (text: string) => boolean;\n recentDays?: number;\n maxTopLevelMessages?: number;\n now?: () => Date;\n}\n\nexport interface ResolveChatSessionScopeOptions {\n office: Office;\n sessionKey: string;\n currentMessageId?: string;\n}\n\nexport interface SyncChatSessionOptions {\n office: Office;\n sessionKey: string;\n sessionManager: SessionStore;\n currentMessageId?: string;\n}\n\nexport interface ResetChatSessionOptions {\n office: Office;\n sessionKey: string;\n}\n\nexport interface RegisterThreadSessionOptions {\n office: Office;\n sessionKey: string;\n}\n\nexport interface HasMaterializedSessionOptions {\n office: Office;\n sessionKey: string;\n}\n\nexport interface ThreadBootstrapWaitOptions {\n parentSessionKey: string;\n sessionKey: string;\n hasThreadSession: () => Promise<boolean>;\n isParentRunning: () => boolean;\n sleep?: (ms: number) => Promise<void>;\n pollMs?: number;\n}\n"]}
|
package/dist/settings/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ThinkingLevel } from "@earendil-works/pi-agent-core";
|
|
2
|
+
import { Type, type Static } from "typebox";
|
|
2
3
|
export declare class MissingGlobalSettingsError extends Error {
|
|
3
4
|
readonly settingsPath: string;
|
|
4
5
|
constructor(settingsPath: string);
|
|
@@ -9,14 +10,66 @@ import type { OnboardLlmChoice } from "../types.js";
|
|
|
9
10
|
import type { Office } from "../office/types.js";
|
|
10
11
|
export declare const THINKING_LEVELS: ThinkingLevel[];
|
|
11
12
|
export declare function isThinkingLevel(value: unknown): value is ThinkingLevel;
|
|
13
|
+
declare const SettingsFileSchema: Type.TObject<{
|
|
14
|
+
llm: Type.TOptional<Type.TObject<{
|
|
15
|
+
provider: Type.TOptional<Type.TString>;
|
|
16
|
+
model: Type.TOptional<Type.TString>;
|
|
17
|
+
thinkingLevel: Type.TOptional<Type.TEnum<ThinkingLevel[]>>;
|
|
18
|
+
}>>;
|
|
19
|
+
github: Type.TOptional<Type.TObject<{
|
|
20
|
+
repos: Type.TOptional<Type.TArray<Type.TString>>;
|
|
21
|
+
publicRepos: Type.TOptional<Type.TBoolean>;
|
|
22
|
+
users: Type.TOptional<Type.TArray<Type.TString>>;
|
|
23
|
+
minPermission: Type.TOptional<Type.TString>;
|
|
24
|
+
triggers: Type.TOptional<Type.TArray<Type.TString>>;
|
|
25
|
+
capabilities: Type.TOptional<Type.TArray<Type.TString>>;
|
|
26
|
+
}>>;
|
|
27
|
+
slack: Type.TOptional<Type.TObject<{
|
|
28
|
+
replyMode: Type.TOptional<Type.TUnion<[Type.TLiteral<"top-level">, Type.TLiteral<"thread">]>>;
|
|
29
|
+
}>>;
|
|
30
|
+
office: Type.TOptional<Type.TObject<{
|
|
31
|
+
visibility: Type.TOptional<Type.TLiteral<"private">>;
|
|
32
|
+
}>>;
|
|
33
|
+
sandbox: Type.TOptional<Type.TObject<{
|
|
34
|
+
cpus: Type.TOptional<Type.TString>;
|
|
35
|
+
memory: Type.TOptional<Type.TString>;
|
|
36
|
+
boost: Type.TOptional<Type.TObject<{
|
|
37
|
+
cpus: Type.TOptional<Type.TString>;
|
|
38
|
+
memory: Type.TOptional<Type.TString>;
|
|
39
|
+
}>>;
|
|
40
|
+
defaultSharedVault: Type.TOptional<Type.TString>;
|
|
41
|
+
}>>;
|
|
42
|
+
mcpServers: Type.TOptional<Type.TRecord<"^.*$", Type.TObject<{
|
|
43
|
+
command: Type.TOptional<Type.TString>;
|
|
44
|
+
args: Type.TOptional<Type.TArray<Type.TString>>;
|
|
45
|
+
env: Type.TOptional<Type.TRecord<"^.*$", Type.TString>>;
|
|
46
|
+
url: Type.TOptional<Type.TString>;
|
|
47
|
+
headers: Type.TOptional<Type.TRecord<"^.*$", Type.TString>>;
|
|
48
|
+
disabled: Type.TOptional<Type.TBoolean>;
|
|
49
|
+
exposure: Type.TOptional<Type.TUnion<[Type.TLiteral<"codemode">, Type.TLiteral<"deferred">]>>;
|
|
50
|
+
description: Type.TOptional<Type.TString>;
|
|
51
|
+
}>>>;
|
|
52
|
+
skills: Type.TOptional<Type.TArray<Type.TString>>;
|
|
53
|
+
}>;
|
|
54
|
+
type SettingsFileConfig = Static<typeof SettingsFileSchema>;
|
|
55
|
+
export type GithubSettings = NonNullable<SettingsFileConfig["github"]>;
|
|
56
|
+
export interface UnusedSettings {
|
|
57
|
+
readonly path: string;
|
|
58
|
+
readonly keys: readonly string[];
|
|
59
|
+
}
|
|
60
|
+
export declare function findUnusedSettings(stateDir: string, offices: readonly Office[]): UnusedSettings[];
|
|
61
|
+
export declare function globalSettingsPath(stateDir: string): string;
|
|
12
62
|
export declare function loadGlobalSettings(stateDir: string): AgentConfig;
|
|
63
|
+
export declare function loadGithubSettings(stateDir: string): GithubSettings | undefined;
|
|
13
64
|
export declare function conversationSettingsPath(office: Office): string;
|
|
14
65
|
export type SlackAutoReplyMode = "off" | "on" | "jev";
|
|
15
66
|
export declare function slackConversationAutoReplyMode(office: Office): SlackAutoReplyMode;
|
|
16
67
|
export declare function setSlackConversationAutoReply(office: Office, mode: SlackAutoReplyMode): void;
|
|
17
68
|
export declare function resolveConversationSettings(office: Office): AgentConfig;
|
|
18
|
-
export declare function
|
|
19
|
-
|
|
69
|
+
export declare function createGlobalSettingsFile(stateDir: string, choices?: {
|
|
70
|
+
llm?: OnboardLlmChoice;
|
|
71
|
+
githubRepos?: string[];
|
|
72
|
+
}): string;
|
|
20
73
|
export declare function updateGlobalSettings(stateDir: string, patch: Partial<AgentConfig>): void;
|
|
21
74
|
export declare function updateConversationSettings(office: Office, patch: Partial<AgentConfig>): void;
|
|
22
75
|
export declare function loadSkillPatterns(office: Office): SkillPatterns;
|
|
@@ -27,4 +80,5 @@ export declare function loadScopeMcpServers(office: Office): {
|
|
|
27
80
|
};
|
|
28
81
|
export declare function loadOfficeVisibilityOverride(office: Office): "private" | null;
|
|
29
82
|
export declare function setOfficeVisibilityOverride(office: Office, visibility: "private" | null): void;
|
|
83
|
+
export {};
|
|
30
84
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/settings/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/settings/index.ts"],"names":[],"mappings":"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"}
|
package/dist/settings/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Type } from "typebox";
|
|
2
|
+
import { Value } from "typebox/value";
|
|
2
3
|
import { existsSync, lstatSync, rmSync } from "node:fs";
|
|
3
4
|
import { dirname, join } from "node:path";
|
|
4
|
-
import {
|
|
5
|
-
import { atomicWritePrivateFile, ensureDirExists, readJsonSchemaFileIfExists, } from "../file-guards.js";
|
|
5
|
+
import { atomicWritePrivateFile, ensureDirExists, ensurePrivateDirExists, readJsonSchemaFileIfExists, } from "../file-guards.js";
|
|
6
6
|
export class MissingGlobalSettingsError extends Error {
|
|
7
7
|
constructor(settingsPath) {
|
|
8
8
|
super(`Missing global settings file at ${settingsPath}`);
|
|
@@ -10,7 +10,7 @@ export class MissingGlobalSettingsError extends Error {
|
|
|
10
10
|
this.name = "MissingGlobalSettingsError";
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
|
-
import { errorMessage } from "../unknown-values.js";
|
|
13
|
+
import { errorMessage, isRecord } from "../unknown-values.js";
|
|
14
14
|
const ONBOARD_SETTINGS = {
|
|
15
15
|
llm: {
|
|
16
16
|
provider: "anthropic",
|
|
@@ -49,8 +49,13 @@ const SettingsFileSchema = Type.Object({
|
|
|
49
49
|
model: Type.Optional(Type.String()),
|
|
50
50
|
thinkingLevel: Type.Optional(Type.Enum(THINKING_LEVELS)),
|
|
51
51
|
})),
|
|
52
|
-
|
|
53
|
-
|
|
52
|
+
github: Type.Optional(Type.Object({
|
|
53
|
+
repos: Type.Optional(Type.Array(Type.String())),
|
|
54
|
+
publicRepos: Type.Optional(Type.Boolean()),
|
|
55
|
+
users: Type.Optional(Type.Array(Type.String())),
|
|
56
|
+
minPermission: Type.Optional(Type.String()),
|
|
57
|
+
triggers: Type.Optional(Type.Array(Type.String())),
|
|
58
|
+
capabilities: Type.Optional(Type.Array(Type.String())),
|
|
54
59
|
})),
|
|
55
60
|
slack: Type.Optional(Type.Object({
|
|
56
61
|
replyMode: Type.Optional(Type.Union([Type.Literal("top-level"), Type.Literal("thread")])),
|
|
@@ -89,7 +94,6 @@ function normalizeSettingsConfig(config) {
|
|
|
89
94
|
...(config.llm?.provider !== undefined ? { provider: config.llm.provider } : {}),
|
|
90
95
|
...(config.llm?.model !== undefined ? { model: config.llm.model } : {}),
|
|
91
96
|
...(config.llm?.thinkingLevel !== undefined ? { thinkingLevel: config.llm.thinkingLevel } : {}),
|
|
92
|
-
...(config.sentry?.dsn !== undefined ? { sentryDsn: config.sentry.dsn } : {}),
|
|
93
97
|
...(config.sandbox !== undefined ? { sandbox: normalizeSandboxSettings(config.sandbox) } : {}),
|
|
94
98
|
...(config.slack !== undefined ? { slack: config.slack } : {}),
|
|
95
99
|
...(config.mcpServers !== undefined ? { mcpServers: config.mcpServers } : {}),
|
|
@@ -115,7 +119,35 @@ function mergeSandboxSettings(base, override) {
|
|
|
115
119
|
boost: base.boost || override.boost ? { ...base.boost, ...override.boost } : undefined,
|
|
116
120
|
};
|
|
117
121
|
}
|
|
118
|
-
function
|
|
122
|
+
function unusedKeys(value, used, prefix) {
|
|
123
|
+
if (!isRecord(value) || !isRecord(used))
|
|
124
|
+
return [];
|
|
125
|
+
return Object.keys(value).flatMap((key) => {
|
|
126
|
+
const path = prefix ? `${prefix}.${key}` : key;
|
|
127
|
+
return Object.hasOwn(used, key) ? unusedKeys(value[key], used[key], path) : [path];
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
function unusedSettingsKeys(settingsPath) {
|
|
131
|
+
let settings;
|
|
132
|
+
try {
|
|
133
|
+
settings = loadSettingsFile(settingsPath);
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
return [];
|
|
137
|
+
}
|
|
138
|
+
return unusedKeys(settings, Value.Clean(SettingsFileSchema, structuredClone(settings)), "");
|
|
139
|
+
}
|
|
140
|
+
export function findUnusedSettings(stateDir, offices) {
|
|
141
|
+
const paths = [
|
|
142
|
+
globalSettingsPath(stateDir),
|
|
143
|
+
...offices.map((office) => join(office.stateDir, "settings.json")),
|
|
144
|
+
];
|
|
145
|
+
return paths.flatMap((path) => {
|
|
146
|
+
const keys = unusedSettingsKeys(path);
|
|
147
|
+
return keys.length > 0 ? [{ path, keys }] : [];
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
export function globalSettingsPath(stateDir) {
|
|
119
151
|
return join(stateDir, "settings.json");
|
|
120
152
|
}
|
|
121
153
|
function requireGlobalSettings(stateDir) {
|
|
@@ -136,7 +168,6 @@ function toAgentConfig(fromFile) {
|
|
|
136
168
|
const provider = requireString(fromFile.provider, "llm.provider");
|
|
137
169
|
const model = requireString(fromFile.model, "llm.model");
|
|
138
170
|
const thinkingLevel = requireString(fromFile.thinkingLevel, "llm.thinkingLevel");
|
|
139
|
-
const sentryDsn = sentryDsnFrom(fromFile.sentryDsn);
|
|
140
171
|
const sandbox = fromFile.sandbox;
|
|
141
172
|
const slack = fromFile.slack;
|
|
142
173
|
const mcpServers = fromFile.mcpServers;
|
|
@@ -144,7 +175,6 @@ function toAgentConfig(fromFile) {
|
|
|
144
175
|
provider,
|
|
145
176
|
model,
|
|
146
177
|
thinkingLevel,
|
|
147
|
-
sentryDsn,
|
|
148
178
|
sandbox,
|
|
149
179
|
slack,
|
|
150
180
|
mcpServers,
|
|
@@ -156,13 +186,16 @@ function loadRawGlobalSettings(stateDir) {
|
|
|
156
186
|
export function loadGlobalSettings(stateDir) {
|
|
157
187
|
return toAgentConfig(loadRawGlobalSettings(stateDir));
|
|
158
188
|
}
|
|
189
|
+
export function loadGithubSettings(stateDir) {
|
|
190
|
+
return requireGlobalSettings(stateDir).github;
|
|
191
|
+
}
|
|
159
192
|
export function conversationSettingsPath(office) {
|
|
160
193
|
const hostPath = join(office.stateDir, "settings.json");
|
|
161
194
|
if (existsSync(hostPath)) {
|
|
162
195
|
assertSettingsFile(hostPath, "Conversation settings");
|
|
163
196
|
return hostPath;
|
|
164
197
|
}
|
|
165
|
-
|
|
198
|
+
ensurePrivateDirExists(dirname(hostPath));
|
|
166
199
|
atomicWritePrivateFile(hostPath, "{}\n");
|
|
167
200
|
return hostPath;
|
|
168
201
|
}
|
|
@@ -216,29 +249,20 @@ export function resolveConversationSettings(office) {
|
|
|
216
249
|
...(Object.keys(mcpServers).length > 0 ? { mcpServers } : {}),
|
|
217
250
|
});
|
|
218
251
|
}
|
|
219
|
-
function
|
|
220
|
-
return fromFile || readEnv("SENTRY_DSN");
|
|
221
|
-
}
|
|
222
|
-
export function resolveSentryDsn(stateDir) {
|
|
223
|
-
const fromFile = normalizeSettingsConfig(loadSettingsFile(globalSettingsPath(stateDir)) ?? {});
|
|
224
|
-
return sentryDsnFrom(fromFile.sentryDsn);
|
|
225
|
-
}
|
|
226
|
-
export function createGlobalSettingsFile(stateDir, llm) {
|
|
252
|
+
export function createGlobalSettingsFile(stateDir, choices = {}) {
|
|
227
253
|
const settingsPath = globalSettingsPath(stateDir);
|
|
228
254
|
if (existsSync(settingsPath)) {
|
|
229
255
|
throw new Error(`Global settings already exists at ${settingsPath}`);
|
|
230
256
|
}
|
|
231
|
-
|
|
232
|
-
const
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
}
|
|
241
|
-
: ONBOARD_SETTINGS;
|
|
257
|
+
ensurePrivateDirExists(stateDir);
|
|
258
|
+
const { llm, githubRepos } = choices;
|
|
259
|
+
const settings = {
|
|
260
|
+
...ONBOARD_SETTINGS,
|
|
261
|
+
llm: llm
|
|
262
|
+
? { ...ONBOARD_SETTINGS.llm, provider: llm.provider, model: llm.model }
|
|
263
|
+
: ONBOARD_SETTINGS.llm,
|
|
264
|
+
github: githubRepos ? { repos: githubRepos } : undefined,
|
|
265
|
+
};
|
|
242
266
|
atomicWritePrivateFile(settingsPath, JSON.stringify(settings, null, 2));
|
|
243
267
|
return settingsPath;
|
|
244
268
|
}
|
|
@@ -248,10 +272,10 @@ function hasDefinedValue(values) {
|
|
|
248
272
|
function compactSettingsConfig(config) {
|
|
249
273
|
return {
|
|
250
274
|
llm: hasDefinedValue(config.llm) ? config.llm : undefined,
|
|
251
|
-
sentry: hasDefinedValue(config.sentry) ? config.sentry : undefined,
|
|
252
275
|
sandbox: hasDefinedValue(config.sandbox) ? config.sandbox : undefined,
|
|
253
276
|
slack: hasDefinedValue(config.slack) ? config.slack : undefined,
|
|
254
277
|
office: hasDefinedValue(config.office) ? config.office : undefined,
|
|
278
|
+
github: hasDefinedValue(config.github) ? config.github : undefined,
|
|
255
279
|
mcpServers: config.mcpServers,
|
|
256
280
|
skills: config.skills,
|
|
257
281
|
};
|
|
@@ -265,10 +289,6 @@ function patchSettingsConfig(existing, config) {
|
|
|
265
289
|
...(config.model !== undefined ? { model: config.model } : {}),
|
|
266
290
|
...(config.thinkingLevel !== undefined ? { thinkingLevel: config.thinkingLevel } : {}),
|
|
267
291
|
},
|
|
268
|
-
sentry: {
|
|
269
|
-
...existing.sentry,
|
|
270
|
-
...(config.sentryDsn !== undefined ? { dsn: config.sentryDsn } : {}),
|
|
271
|
-
},
|
|
272
292
|
sandbox: mergeSandboxSettings(existing.sandbox, config.sandbox) ?? {},
|
|
273
293
|
slack: {
|
|
274
294
|
...existing.slack,
|
|
@@ -295,7 +315,7 @@ function loadSettingsFileForUpdate(settingsPath, defaultSettings) {
|
|
|
295
315
|
}
|
|
296
316
|
function updateSettingsFile(settingsPath, patch, defaultSettings) {
|
|
297
317
|
const existing = loadSettingsFileForUpdate(settingsPath, defaultSettings);
|
|
298
|
-
|
|
318
|
+
ensurePrivateDirExists(dirname(settingsPath));
|
|
299
319
|
atomicWritePrivateFile(settingsPath, JSON.stringify(patchSettingsConfig(existing, patch), null, 2));
|
|
300
320
|
}
|
|
301
321
|
export function updateGlobalSettings(stateDir, patch) {
|
|
@@ -315,7 +335,7 @@ export function updateSkillPatterns(office, scope, skills) {
|
|
|
315
335
|
? conversationSettingsPath(office)
|
|
316
336
|
: globalSettingsPath(office.workspace.stateDir);
|
|
317
337
|
const existing = loadSettingsFileForUpdate(settingsPath, scope === "conversation" ? {} : ONBOARD_SETTINGS);
|
|
318
|
-
|
|
338
|
+
ensurePrivateDirExists(dirname(settingsPath));
|
|
319
339
|
atomicWritePrivateFile(settingsPath, JSON.stringify(compactSettingsConfig({ ...existing, skills: skills.length > 0 ? [...skills] : undefined }), null, 2));
|
|
320
340
|
}
|
|
321
341
|
export function loadScopeMcpServers(office) {
|
|
@@ -331,7 +351,7 @@ export function setOfficeVisibilityOverride(office, visibility) {
|
|
|
331
351
|
const settingsPath = conversationSettingsPath(office);
|
|
332
352
|
const existing = loadSettingsFileForUpdate(settingsPath, {});
|
|
333
353
|
const { office: _previous, ...rest } = existing;
|
|
334
|
-
|
|
354
|
+
ensurePrivateDirExists(dirname(settingsPath));
|
|
335
355
|
atomicWritePrivateFile(settingsPath, JSON.stringify(compactSettingsConfig({ ...rest, office: visibility ? { visibility } : undefined }), null, 2));
|
|
336
356
|
}
|
|
337
357
|
//# sourceMappingURL=index.js.map
|