@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.
Files changed (137) hide show
  1. package/CHANGELOG.md +387 -391
  2. package/README.md +33 -42
  3. package/dist/adapters/github/bot.js +1 -1
  4. package/dist/adapters/github/bot.js.map +1 -1
  5. package/dist/adapters/github/policy.d.ts +2 -9
  6. package/dist/adapters/github/policy.d.ts.map +1 -1
  7. package/dist/adapters/github/policy.js +18 -26
  8. package/dist/adapters/github/policy.js.map +1 -1
  9. package/dist/adapters/slack/bot.d.ts +2 -4
  10. package/dist/adapters/slack/bot.d.ts.map +1 -1
  11. package/dist/adapters/slack/bot.js +28 -56
  12. package/dist/adapters/slack/bot.js.map +1 -1
  13. package/dist/adapters/slack/socket-agent.d.ts +9 -0
  14. package/dist/adapters/slack/socket-agent.d.ts.map +1 -0
  15. package/dist/adapters/slack/socket-agent.js +17 -0
  16. package/dist/adapters/slack/socket-agent.js.map +1 -0
  17. package/dist/adapters/telegram/bot.d.ts +1 -0
  18. package/dist/adapters/telegram/bot.d.ts.map +1 -1
  19. package/dist/adapters/telegram/bot.js +6 -1
  20. package/dist/adapters/telegram/bot.js.map +1 -1
  21. package/dist/adapters/telegram/types.d.ts +1 -0
  22. package/dist/adapters/telegram/types.d.ts.map +1 -1
  23. package/dist/adapters/telegram/types.js.map +1 -1
  24. package/dist/cli/arg-grammar.d.ts +1 -2
  25. package/dist/cli/arg-grammar.d.ts.map +1 -1
  26. package/dist/cli/arg-grammar.js +2 -17
  27. package/dist/cli/arg-grammar.js.map +1 -1
  28. package/dist/cli/boot.d.ts.map +1 -1
  29. package/dist/cli/boot.js +5 -11
  30. package/dist/cli/boot.js.map +1 -1
  31. package/dist/cli/migrate.d.ts.map +1 -1
  32. package/dist/cli/migrate.js +22 -7
  33. package/dist/cli/migrate.js.map +1 -1
  34. package/dist/cli/office.d.ts.map +1 -1
  35. package/dist/cli/office.js +3 -5
  36. package/dist/cli/office.js.map +1 -1
  37. package/dist/cli/onboard.js +18 -20
  38. package/dist/cli/onboard.js.map +1 -1
  39. package/dist/cli/types.d.ts +1 -2
  40. package/dist/cli/types.d.ts.map +1 -1
  41. package/dist/cli/types.js.map +1 -1
  42. package/dist/env-manifest.d.ts +2 -0
  43. package/dist/env-manifest.d.ts.map +1 -1
  44. package/dist/env-manifest.js +76 -43
  45. package/dist/env-manifest.js.map +1 -1
  46. package/dist/events/index.d.ts +5 -5
  47. package/dist/events/index.d.ts.map +1 -1
  48. package/dist/events/index.js +1 -7
  49. package/dist/events/index.js.map +1 -1
  50. package/dist/file-guards.d.ts +1 -0
  51. package/dist/file-guards.d.ts.map +1 -1
  52. package/dist/file-guards.js +4 -1
  53. package/dist/file-guards.js.map +1 -1
  54. package/dist/harness/execution-resolver.d.ts.map +1 -1
  55. package/dist/harness/execution-resolver.js +1 -7
  56. package/dist/harness/execution-resolver.js.map +1 -1
  57. package/dist/harness/http.d.ts +1 -2
  58. package/dist/harness/http.d.ts.map +1 -1
  59. package/dist/harness/http.js +3 -16
  60. package/dist/harness/http.js.map +1 -1
  61. package/dist/harness/jev.d.ts +2 -1
  62. package/dist/harness/jev.d.ts.map +1 -1
  63. package/dist/harness/jev.js.map +1 -1
  64. package/dist/harness/prompt.d.ts.map +1 -1
  65. package/dist/harness/prompt.js +0 -6
  66. package/dist/harness/prompt.js.map +1 -1
  67. package/dist/harness/session.d.ts +2 -9
  68. package/dist/harness/session.d.ts.map +1 -1
  69. package/dist/harness/session.js +3 -3
  70. package/dist/harness/session.js.map +1 -1
  71. package/dist/harness/tools/event.d.ts +0 -1
  72. package/dist/harness/tools/event.d.ts.map +1 -1
  73. package/dist/harness/tools/event.js +1 -7
  74. package/dist/harness/tools/event.js.map +1 -1
  75. package/dist/harness/types.d.ts +3 -3
  76. package/dist/harness/types.d.ts.map +1 -1
  77. package/dist/harness/types.js.map +1 -1
  78. package/dist/index.d.ts +8 -31
  79. package/dist/index.d.ts.map +1 -1
  80. package/dist/index.js +3 -15
  81. package/dist/index.js.map +1 -1
  82. package/dist/main.js +26 -36
  83. package/dist/main.js.map +1 -1
  84. package/dist/migrations/index.d.ts +0 -1
  85. package/dist/migrations/index.d.ts.map +1 -1
  86. package/dist/migrations/index.js +4 -4
  87. package/dist/migrations/index.js.map +1 -1
  88. package/dist/migrations/legacy-office-files.d.ts +3 -0
  89. package/dist/migrations/legacy-office-files.d.ts.map +1 -0
  90. package/dist/migrations/legacy-office-files.js +29 -0
  91. package/dist/migrations/legacy-office-files.js.map +1 -0
  92. package/dist/observability/instrument.js +2 -3
  93. package/dist/observability/instrument.js.map +1 -1
  94. package/dist/observability/sentry.js +1 -1
  95. package/dist/observability/sentry.js.map +1 -1
  96. package/dist/office/projection.js +2 -2
  97. package/dist/office/projection.js.map +1 -1
  98. package/dist/sandbox/identity.d.ts +0 -1
  99. package/dist/sandbox/identity.d.ts.map +1 -1
  100. package/dist/sandbox/identity.js +0 -3
  101. package/dist/sandbox/identity.js.map +1 -1
  102. package/dist/sandbox/registry.d.ts +1 -5
  103. package/dist/sandbox/registry.d.ts.map +1 -1
  104. package/dist/sandbox/registry.js +4 -13
  105. package/dist/sandbox/registry.js.map +1 -1
  106. package/dist/sandbox/types.d.ts +1 -5
  107. package/dist/sandbox/types.d.ts.map +1 -1
  108. package/dist/sandbox/types.js.map +1 -1
  109. package/dist/sessions/types.d.ts +1 -1
  110. package/dist/sessions/types.d.ts.map +1 -1
  111. package/dist/sessions/types.js.map +1 -1
  112. package/dist/settings/index.d.ts +56 -2
  113. package/dist/settings/index.d.ts.map +1 -1
  114. package/dist/settings/index.js +57 -37
  115. package/dist/settings/index.js.map +1 -1
  116. package/dist/types.d.ts +1 -25
  117. package/dist/types.d.ts.map +1 -1
  118. package/dist/types.js.map +1 -1
  119. package/dist/vault/index.js +1 -1
  120. package/dist/vault/index.js.map +1 -1
  121. package/package.json +4 -17
  122. package/dist/cli/download.d.ts +0 -2
  123. package/dist/cli/download.d.ts.map +0 -1
  124. package/dist/cli/download.js +0 -84
  125. package/dist/cli/download.js.map +0 -1
  126. package/dist/harness/index.d.ts +0 -20
  127. package/dist/harness/index.d.ts.map +0 -1
  128. package/dist/harness/index.js +0 -14
  129. package/dist/harness/index.js.map +0 -1
  130. package/dist/sandbox/cloudflare.d.ts +0 -17
  131. package/dist/sandbox/cloudflare.d.ts.map +0 -1
  132. package/dist/sandbox/cloudflare.js +0 -142
  133. package/dist/sandbox/cloudflare.js.map +0 -1
  134. package/dist/sandbox/index.d.ts +0 -7
  135. package/dist/sandbox/index.d.ts.map +0 -1
  136. package/dist/sandbox/index.js +0 -6
  137. 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,MAAM,UAAU,wBAAwB,CAAC,MAAc,EAAE,WAAmB;IAC1E,OAAO,GAAG,MAAM,IAAI,WAAW,EAAE,CAAC;AACpC,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\nexport function scopeCloudflareSandboxId(baseId: string, resourceKey: string): string {\n return `${baseId}-${resourceKey}`;\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
+ {"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, ImageSandboxConfig, RuntimePathContext, SandboxAdapter, SandboxConfig } from "./types.js";
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":"AAMA,OAAO,KAAK,EACV,QAAQ,EACR,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,EACd,aAAa,EACd,MAAM,YAAY,CAAC;AA+BpB,QAAA,MAAM,eAAe,kOAKX,CAAC;AAKX,wBAAgB,kBAAkB,IAAI,SAAS,CAAC,GAAG,OAAO,eAAe,CAAC,CAEzE;AAQD,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,GAC1B,cAAc,CAAC,aAAa,CAAC,CAE/B;AAED,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,GAC1B,cAAc,CAAC,WAAW,CAAC,CAE7B;AAID,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"}
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"}
@@ -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
- export function getSandboxWorkspaceCapabilities(type) {
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, container, and cloudflare backends share one filesystem; use image:* to isolate private channels and DMs");
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>', or 'cloudflare:<sandbox-id>'`);
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":"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","sourcesContent":["import { containerSandboxAdapter } from \"./container.js\";\nimport { cloudflareSandboxAdapter } from \"./cloudflare.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 = [\n hostSandboxAdapter,\n containerSandboxAdapter,\n imageSandboxAdapter,\n cloudflareSandboxAdapter,\n] as const;\nconst sandboxAdapterByType = new Map(\n sandboxAdapters.map((adapter) => [adapter.type, adapter]),\n) as Map<SandboxConfig[\"type\"], SandboxAdapter>;\n\nexport function getSandboxAdapters(): readonly [...typeof sandboxAdapters] {\n return sandboxAdapters;\n}\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\nexport function getSandboxWorkspaceCapabilities(\n type: SandboxConfig[\"type\"],\n): 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, container, and cloudflare 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>', 'image:<image-name>', or 'cloudflare:<sandbox-id>'`,\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"]}
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"]}
@@ -1,5 +1,5 @@
1
1
  import type { OfficeAddress } from "../types.js";
2
- export type SandboxConfig = HostSandboxConfig | ContainerSandboxConfig | ImageSandboxConfig | CloudflareSandboxConfig;
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":"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"}
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 =\n | HostSandboxConfig\n | ContainerSandboxConfig\n | ImageSandboxConfig\n | CloudflareSandboxConfig;\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 CloudflareSandboxConfig {\n type: \"cloudflare\";\n sandboxId: 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"]}
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"]}
@@ -42,7 +42,7 @@ export interface SessionMessageEntry extends SessionEntryBase {
42
42
  message: AgentMessage;
43
43
  history?: ChatHistoryMessageIdentity;
44
44
  }
45
- export interface SessionCustomEntry extends SessionEntryBase {
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":"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"}
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\nexport interface 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"]}
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"]}
@@ -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 resolveSentryDsn(stateDir: string): string | undefined;
19
- export declare function createGlobalSettingsFile(stateDir: string, llm?: OnboardLlmChoice): string;
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;AAWnE,qBAAa,0BAA2B,SAAQ,KAAK;aACvB,YAAY,EAAE,MAAM;IAAhD,YAA4B,YAAY,EAAE,MAAM,EAG/C;CACF;AAED,OAAO,KAAK,EAAE,WAAW,EAAmB,MAAM,aAAa,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAiCjD,eAAO,MAAM,eAAe,EAAuC,aAAa,EAAE,CAAC;AAEnF,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAEtE;AAoJD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAEhE;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAS/D;AAcD,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,CAAC;AAStD,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,CAIjF;AAED,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,GAAG,IAAI,CAU5F;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAavE;AAMD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGrE;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAkBzF;AA0ED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,CAExF;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,CAE5F;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAK/D;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,aAAa,EAC1B,MAAM,EAAE,SAAS,MAAM,EAAE,GACxB,IAAI,CAkBN;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG;IACnD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACxC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAC/C,CAKA;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAE7E;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI,CAa9F"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/settings/index.ts"],"names":[],"mappings":"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"}
@@ -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 { readEnv } from "../env-manifest.js";
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
- sentry: Type.Optional(Type.Object({
53
- dsn: Type.Optional(Type.String()),
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 globalSettingsPath(stateDir) {
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
- ensureDirExists(dirname(hostPath));
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 sentryDsnFrom(fromFile) {
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
- ensureDirExists(stateDir);
232
- const settings = llm
233
- ? {
234
- ...ONBOARD_SETTINGS,
235
- llm: {
236
- ...ONBOARD_SETTINGS.llm,
237
- provider: llm.provider,
238
- model: llm.model,
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
- ensureDirExists(dirname(settingsPath));
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
- ensureDirExists(dirname(settingsPath));
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
- ensureDirExists(dirname(settingsPath));
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