@geminixiang/mikan 1.0.0-beta.21 → 1.0.0-beta.23

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 (199) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/README.md +12 -8
  3. package/dist/adapters/discord/bot.d.ts.map +1 -1
  4. package/dist/adapters/discord/bot.js +13 -14
  5. package/dist/adapters/discord/bot.js.map +1 -1
  6. package/dist/adapters/intake.d.ts.map +1 -1
  7. package/dist/adapters/intake.js +5 -0
  8. package/dist/adapters/intake.js.map +1 -1
  9. package/dist/adapters/slack/bot.d.ts.map +1 -1
  10. package/dist/adapters/slack/bot.js +13 -2
  11. package/dist/adapters/slack/bot.js.map +1 -1
  12. package/dist/adapters/slack/types.d.ts +2 -0
  13. package/dist/adapters/slack/types.d.ts.map +1 -1
  14. package/dist/adapters/slack/types.js.map +1 -1
  15. package/dist/agent.d.ts.map +1 -1
  16. package/dist/agent.js +34 -24
  17. package/dist/agent.js.map +1 -1
  18. package/dist/cli/boot.d.ts +1 -1
  19. package/dist/cli/boot.d.ts.map +1 -1
  20. package/dist/cli/boot.js +7 -15
  21. package/dist/cli/boot.js.map +1 -1
  22. package/dist/commands/login.js +2 -2
  23. package/dist/commands/login.js.map +1 -1
  24. package/dist/commands/sandbox.d.ts.map +1 -1
  25. package/dist/commands/sandbox.js +4 -7
  26. package/dist/commands/sandbox.js.map +1 -1
  27. package/dist/commands/text.js +1 -1
  28. package/dist/commands/text.js.map +1 -1
  29. package/dist/config.d.ts.map +1 -1
  30. package/dist/config.js +12 -39
  31. package/dist/config.js.map +1 -1
  32. package/dist/execution-resolver.d.ts +6 -8
  33. package/dist/execution-resolver.d.ts.map +1 -1
  34. package/dist/execution-resolver.js +73 -107
  35. package/dist/execution-resolver.js.map +1 -1
  36. package/dist/harness/index.d.ts +1 -1
  37. package/dist/harness/index.d.ts.map +1 -1
  38. package/dist/harness/index.js.map +1 -1
  39. package/dist/harness/runner.d.ts +9 -6
  40. package/dist/harness/runner.d.ts.map +1 -1
  41. package/dist/harness/runner.js +42 -20
  42. package/dist/harness/runner.js.map +1 -1
  43. package/dist/harness/subagent-runner.d.ts +14 -13
  44. package/dist/harness/subagent-runner.d.ts.map +1 -1
  45. package/dist/harness/subagent-runner.js +116 -24
  46. package/dist/harness/subagent-runner.js.map +1 -1
  47. package/dist/harness/types.d.ts +14 -0
  48. package/dist/harness/types.d.ts.map +1 -1
  49. package/dist/harness/types.js.map +1 -1
  50. package/dist/harness/usage.d.ts +6 -0
  51. package/dist/harness/usage.d.ts.map +1 -0
  52. package/dist/harness/usage.js +32 -0
  53. package/dist/harness/usage.js.map +1 -0
  54. package/dist/index.d.ts +3 -2
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +1 -1
  57. package/dist/index.js.map +1 -1
  58. package/dist/main.js +19 -87
  59. package/dist/main.js.map +1 -1
  60. package/dist/runtime/conversation-runtime.d.ts.map +1 -1
  61. package/dist/runtime/conversation-runtime.js +23 -79
  62. package/dist/runtime/conversation-runtime.js.map +1 -1
  63. package/dist/runtime/session-lifecycle.d.ts +19 -0
  64. package/dist/runtime/session-lifecycle.d.ts.map +1 -0
  65. package/dist/runtime/session-lifecycle.js +76 -0
  66. package/dist/runtime/session-lifecycle.js.map +1 -0
  67. package/dist/runtime/types.d.ts +5 -0
  68. package/dist/runtime/types.d.ts.map +1 -1
  69. package/dist/runtime/types.js.map +1 -1
  70. package/dist/sandbox/agent-sandbox.d.ts +18 -0
  71. package/dist/sandbox/agent-sandbox.d.ts.map +1 -0
  72. package/dist/sandbox/agent-sandbox.js +234 -0
  73. package/dist/sandbox/agent-sandbox.js.map +1 -0
  74. package/dist/sandbox/cloudflare.d.ts.map +1 -1
  75. package/dist/sandbox/cloudflare.js +1 -0
  76. package/dist/sandbox/cloudflare.js.map +1 -1
  77. package/dist/sandbox/container.d.ts.map +1 -1
  78. package/dist/sandbox/container.js +1 -0
  79. package/dist/sandbox/container.js.map +1 -1
  80. package/dist/sandbox/host.d.ts.map +1 -1
  81. package/dist/sandbox/host.js +1 -0
  82. package/dist/sandbox/host.js.map +1 -1
  83. package/dist/sandbox/identity.d.ts +11 -16
  84. package/dist/sandbox/identity.d.ts.map +1 -1
  85. package/dist/sandbox/identity.js +32 -26
  86. package/dist/sandbox/identity.js.map +1 -1
  87. package/dist/sandbox/image.d.ts.map +1 -1
  88. package/dist/sandbox/image.js +1 -0
  89. package/dist/sandbox/image.js.map +1 -1
  90. package/dist/sandbox/index.d.ts +7 -7
  91. package/dist/sandbox/index.d.ts.map +1 -1
  92. package/dist/sandbox/index.js +13 -9
  93. package/dist/sandbox/index.js.map +1 -1
  94. package/dist/sandbox/types.d.ts +17 -16
  95. package/dist/sandbox/types.d.ts.map +1 -1
  96. package/dist/sandbox/types.js.map +1 -1
  97. package/dist/sessions/session-key.d.ts +9 -0
  98. package/dist/sessions/session-key.d.ts.map +1 -1
  99. package/dist/sessions/session-key.js +50 -2
  100. package/dist/sessions/session-key.js.map +1 -1
  101. package/dist/sessions/store.d.ts.map +1 -1
  102. package/dist/sessions/store.js +36 -8
  103. package/dist/sessions/store.js.map +1 -1
  104. package/dist/tools/sandbox.d.ts.map +1 -1
  105. package/dist/tools/sandbox.js +4 -5
  106. package/dist/tools/sandbox.js.map +1 -1
  107. package/dist/tools/subagent-slots.d.ts +3 -3
  108. package/dist/tools/subagent-slots.d.ts.map +1 -1
  109. package/dist/tools/subagent-slots.js +25 -10
  110. package/dist/tools/subagent-slots.js.map +1 -1
  111. package/dist/tools/subagent.d.ts +13 -2
  112. package/dist/tools/subagent.d.ts.map +1 -1
  113. package/dist/tools/subagent.js +16 -16
  114. package/dist/tools/subagent.js.map +1 -1
  115. package/dist/types.d.ts +14 -63
  116. package/dist/types.d.ts.map +1 -1
  117. package/dist/types.js.map +1 -1
  118. package/dist/vault/injection.d.ts +4 -14
  119. package/dist/vault/injection.d.ts.map +1 -1
  120. package/dist/vault/injection.js +5 -2
  121. package/dist/vault/injection.js.map +1 -1
  122. package/dist/vault/policy.d.ts +3 -3
  123. package/dist/vault/policy.d.ts.map +1 -1
  124. package/dist/vault/policy.js +6 -4
  125. package/dist/vault/policy.js.map +1 -1
  126. package/dist/vault/types.d.ts +4 -0
  127. package/dist/vault/types.d.ts.map +1 -1
  128. package/dist/vault/types.js.map +1 -1
  129. package/dist/web/admin/portal.js +2 -2
  130. package/dist/web/admin/portal.js.map +1 -1
  131. package/dist/workspace-projection/index.d.ts +5 -0
  132. package/dist/workspace-projection/index.d.ts.map +1 -0
  133. package/dist/workspace-projection/index.js +71 -0
  134. package/dist/workspace-projection/index.js.map +1 -0
  135. package/dist/workspace-projection/types.d.ts +7 -0
  136. package/dist/workspace-projection/types.d.ts.map +1 -0
  137. package/dist/workspace-projection/types.js +2 -0
  138. package/dist/workspace-projection/types.js.map +1 -0
  139. package/package.json +3 -3
  140. package/dist/sandbox/firecracker.d.ts +0 -18
  141. package/dist/sandbox/firecracker.d.ts.map +0 -1
  142. package/dist/sandbox/firecracker.js +0 -221
  143. package/dist/sandbox/firecracker.js.map +0 -1
  144. package/dist/sandbox/gondolin-bootstrap.d.ts +0 -26
  145. package/dist/sandbox/gondolin-bootstrap.d.ts.map +0 -1
  146. package/dist/sandbox/gondolin-bootstrap.js +0 -27
  147. package/dist/sandbox/gondolin-bootstrap.js.map +0 -1
  148. package/dist/sandbox/gondolin-contract.d.ts +0 -125
  149. package/dist/sandbox/gondolin-contract.d.ts.map +0 -1
  150. package/dist/sandbox/gondolin-contract.js +0 -155
  151. package/dist/sandbox/gondolin-contract.js.map +0 -1
  152. package/dist/sandbox/gondolin-fleet.d.ts +0 -104
  153. package/dist/sandbox/gondolin-fleet.d.ts.map +0 -1
  154. package/dist/sandbox/gondolin-fleet.js +0 -330
  155. package/dist/sandbox/gondolin-fleet.js.map +0 -1
  156. package/dist/sandbox/gondolin-gateway.d.ts +0 -86
  157. package/dist/sandbox/gondolin-gateway.d.ts.map +0 -1
  158. package/dist/sandbox/gondolin-gateway.js +0 -407
  159. package/dist/sandbox/gondolin-gateway.js.map +0 -1
  160. package/dist/sandbox/gondolin-inventory.d.ts +0 -75
  161. package/dist/sandbox/gondolin-inventory.d.ts.map +0 -1
  162. package/dist/sandbox/gondolin-inventory.js +0 -257
  163. package/dist/sandbox/gondolin-inventory.js.map +0 -1
  164. package/dist/sandbox/gondolin-join.d.ts +0 -62
  165. package/dist/sandbox/gondolin-join.d.ts.map +0 -1
  166. package/dist/sandbox/gondolin-join.js +0 -261
  167. package/dist/sandbox/gondolin-join.js.map +0 -1
  168. package/dist/sandbox/gondolin-nfs-advisory.d.ts +0 -15
  169. package/dist/sandbox/gondolin-nfs-advisory.d.ts.map +0 -1
  170. package/dist/sandbox/gondolin-nfs-advisory.js +0 -60
  171. package/dist/sandbox/gondolin-nfs-advisory.js.map +0 -1
  172. package/dist/sandbox/gondolin-placement.d.ts +0 -30
  173. package/dist/sandbox/gondolin-placement.d.ts.map +0 -1
  174. package/dist/sandbox/gondolin-placement.js +0 -77
  175. package/dist/sandbox/gondolin-placement.js.map +0 -1
  176. package/dist/sandbox/gondolin-recovery.d.ts +0 -33
  177. package/dist/sandbox/gondolin-recovery.d.ts.map +0 -1
  178. package/dist/sandbox/gondolin-recovery.js +0 -39
  179. package/dist/sandbox/gondolin-recovery.js.map +0 -1
  180. package/dist/sandbox/gondolin-remote.d.ts +0 -70
  181. package/dist/sandbox/gondolin-remote.d.ts.map +0 -1
  182. package/dist/sandbox/gondolin-remote.js +0 -325
  183. package/dist/sandbox/gondolin-remote.js.map +0 -1
  184. package/dist/sandbox/gondolin-worker-client.d.ts +0 -135
  185. package/dist/sandbox/gondolin-worker-client.d.ts.map +0 -1
  186. package/dist/sandbox/gondolin-worker-client.js +0 -323
  187. package/dist/sandbox/gondolin-worker-client.js.map +0 -1
  188. package/dist/sandbox/gondolin-worker-main.d.ts +0 -2
  189. package/dist/sandbox/gondolin-worker-main.d.ts.map +0 -1
  190. package/dist/sandbox/gondolin-worker-main.js +0 -22
  191. package/dist/sandbox/gondolin-worker-main.js.map +0 -1
  192. package/dist/sandbox/gondolin-worker.d.ts +0 -17
  193. package/dist/sandbox/gondolin-worker.d.ts.map +0 -1
  194. package/dist/sandbox/gondolin-worker.js +0 -201
  195. package/dist/sandbox/gondolin-worker.js.map +0 -1
  196. package/dist/sandbox/gondolin.d.ts +0 -53
  197. package/dist/sandbox/gondolin.d.ts.map +0 -1
  198. package/dist/sandbox/gondolin.js +0 -429
  199. package/dist/sandbox/gondolin.js.map +0 -1
@@ -7,6 +7,7 @@
7
7
  * always written, so existing conversation history keeps working unchanged.
8
8
  */
9
9
  import type { BranchSummaryEntry, CompactionEntry, CustomEntry, CustomMessageEntry, MessageEntry, SessionContext, SessionInfoEntry, SessionTreeEntry } from "@earendil-works/pi-agent-core";
10
+ import type { Usage } from "@earendil-works/pi-ai";
10
11
  import type { Static, TSchema } from "@sinclair/typebox";
11
12
  export type { BranchSummaryEntry, CompactionEntry, CustomEntry, CustomMessageEntry, SessionContext, SessionInfoEntry, };
12
13
  /** Message entry as stored in mikan session files. */
@@ -29,9 +30,18 @@ export interface SubagentRunBudget {
29
30
  maxDurationMs?: number;
30
31
  }
31
32
  export type SubagentRunStatus = "completed" | "failed" | "cancelled" | "timeout" | "budget_exceeded" | "invalid_output";
33
+ export interface SubagentParentContext {
34
+ mode: "normalized";
35
+ /** Number of recent user/assistant turns to include. Defaults to 3. */
36
+ recentTurns?: number;
37
+ }
38
+ /** Aggregated model usage across every assistant turn in a subagent run. */
39
+ export type SubagentUsage = Usage;
32
40
  /** A fresh, isolated subagent run. */
33
41
  export interface SubagentRunRequest<TOutputSchema extends TSchema | undefined = undefined> {
34
42
  task: string;
43
+ /** Opt in to a normalized textual snapshot of the active parent run. Defaults to fresh. */
44
+ parentContext?: SubagentParentContext;
35
45
  systemPrompt?: string;
36
46
  /** JSON-serializable input appended to the task. */
37
47
  input?: unknown;
@@ -51,7 +61,11 @@ interface SubagentRunMetadata {
51
61
  text?: string;
52
62
  model: SubagentModelSpec;
53
63
  turns: number;
64
+ /** Full token and cost breakdown across the run. */
65
+ usage: SubagentUsage;
66
+ /** Aggregate token count; equivalent to `usage.totalTokens`. */
54
67
  tokens: number;
68
+ /** Aggregate provider cost; equivalent to `usage.cost.total`. */
55
69
  costUsd: number;
56
70
  durationMs: number;
57
71
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/harness/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/harness/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/harness/types.ts"],"names":[],"mappings":"AAmCA,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC","sourcesContent":["/**\n * Core types for the mikan agent harness.\n *\n * The harness is built directly on pi-agent-core and pi-ai. Session entries\n * are structurally identical to pi-agent-core's `SessionTreeEntry`, and the\n * on-disk JSONL format stays compatible with the v3 session files mikan has\n * always written, so existing conversation history keeps working unchanged.\n */\nimport type {\n BranchSummaryEntry,\n CompactionEntry,\n CustomEntry,\n CustomMessageEntry,\n MessageEntry,\n SessionContext,\n SessionInfoEntry,\n SessionTreeEntry,\n} from \"@earendil-works/pi-agent-core\";\nimport type { Static, TSchema } from \"@sinclair/typebox\";\n\nexport type {\n BranchSummaryEntry,\n CompactionEntry,\n CustomEntry,\n CustomMessageEntry,\n SessionContext,\n SessionInfoEntry,\n};\n\n/** Message entry as stored in mikan session files. */\nexport type SessionMessageEntry = MessageEntry;\n\n/** Union of entry types mikan reads and writes. Alias of pi-agent-core's tree entry. */\nexport type SessionEntry = SessionTreeEntry;\n\nexport const CURRENT_SESSION_VERSION = 3;\n\nexport interface SubagentModelSpec {\n provider: string;\n id: string;\n}\n\nexport interface SubagentRunBudget {\n /** Maximum assistant/model calls in the subagent run. */\n maxTurns?: number;\n /** Maximum cumulative input/output/cache tokens. */\n maxTokens?: number;\n /** Maximum provider cost in USD. */\n maxCostUsd?: number;\n /** Maximum wall-clock duration. */\n maxDurationMs?: number;\n}\n\nexport type SubagentRunStatus =\n | \"completed\"\n | \"failed\"\n | \"cancelled\"\n | \"timeout\"\n | \"budget_exceeded\"\n | \"invalid_output\";\n\n/** A fresh, isolated subagent run. */\nexport interface SubagentRunRequest<TOutputSchema extends TSchema | undefined = undefined> {\n task: string;\n systemPrompt?: string;\n /** JSON-serializable input appended to the task. */\n input?: unknown;\n /** Defaults to the parent runner's configured model. */\n model?: SubagentModelSpec;\n /** Tool names explicitly granted to the subagent. Defaults to no tools. */\n tools?: string[];\n /** When present, the final response must be JSON matching this schema. */\n outputSchema?: TOutputSchema;\n budget?: SubagentRunBudget;\n signal?: AbortSignal;\n}\n\nexport type SubagentRunOutput<TSchemaOrUndefined extends TSchema | undefined> =\n TSchemaOrUndefined extends TSchema ? Static<TSchemaOrUndefined> : string;\n\ninterface SubagentRunMetadata {\n runId: string;\n /** Raw final assistant text, including when structured validation failed. */\n text?: string;\n model: SubagentModelSpec;\n turns: number;\n tokens: number;\n costUsd: number;\n durationMs: number;\n}\n\ninterface SubagentRunCompletedResult<TOutput> extends SubagentRunMetadata {\n status: \"completed\";\n output: TOutput;\n error?: never;\n}\n\ninterface SubagentRunIncompleteResult extends SubagentRunMetadata {\n status: Exclude<SubagentRunStatus, \"completed\">;\n output?: never;\n error?: string;\n}\n\nexport type SubagentRunResult<TOutput = string> =\n | SubagentRunCompletedResult<TOutput>\n | SubagentRunIncompleteResult;\n\n/**\n * First line of every session file. `cwd` records where the session was\n * started; extra fields (for example mikan's `source` marker) are preserved\n * verbatim on read and rewrite.\n */\nexport interface SessionHeader {\n type: \"session\";\n version?: number;\n id: string;\n timestamp: string;\n cwd: string;\n parentSession?: string;\n [extra: string]: unknown;\n}\n\n/** Raw file line: the header or one session entry. */\nexport type SessionFileEntry = SessionHeader | SessionEntry;\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/harness/types.ts"],"names":[],"mappings":"AAoCA,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC","sourcesContent":["/**\n * Core types for the mikan agent harness.\n *\n * The harness is built directly on pi-agent-core and pi-ai. Session entries\n * are structurally identical to pi-agent-core's `SessionTreeEntry`, and the\n * on-disk JSONL format stays compatible with the v3 session files mikan has\n * always written, so existing conversation history keeps working unchanged.\n */\nimport type {\n BranchSummaryEntry,\n CompactionEntry,\n CustomEntry,\n CustomMessageEntry,\n MessageEntry,\n SessionContext,\n SessionInfoEntry,\n SessionTreeEntry,\n} from \"@earendil-works/pi-agent-core\";\nimport type { Usage } from \"@earendil-works/pi-ai\";\nimport type { Static, TSchema } from \"@sinclair/typebox\";\n\nexport type {\n BranchSummaryEntry,\n CompactionEntry,\n CustomEntry,\n CustomMessageEntry,\n SessionContext,\n SessionInfoEntry,\n};\n\n/** Message entry as stored in mikan session files. */\nexport type SessionMessageEntry = MessageEntry;\n\n/** Union of entry types mikan reads and writes. Alias of pi-agent-core's tree entry. */\nexport type SessionEntry = SessionTreeEntry;\n\nexport const CURRENT_SESSION_VERSION = 3;\n\nexport interface SubagentModelSpec {\n provider: string;\n id: string;\n}\n\nexport interface SubagentRunBudget {\n /** Maximum assistant/model calls in the subagent run. */\n maxTurns?: number;\n /** Maximum cumulative input/output/cache tokens. */\n maxTokens?: number;\n /** Maximum provider cost in USD. */\n maxCostUsd?: number;\n /** Maximum wall-clock duration. */\n maxDurationMs?: number;\n}\n\nexport type SubagentRunStatus =\n | \"completed\"\n | \"failed\"\n | \"cancelled\"\n | \"timeout\"\n | \"budget_exceeded\"\n | \"invalid_output\";\n\nexport interface SubagentParentContext {\n mode: \"normalized\";\n /** Number of recent user/assistant turns to include. Defaults to 3. */\n recentTurns?: number;\n}\n\n/** Aggregated model usage across every assistant turn in a subagent run. */\nexport type SubagentUsage = Usage;\n\n/** A fresh, isolated subagent run. */\nexport interface SubagentRunRequest<TOutputSchema extends TSchema | undefined = undefined> {\n task: string;\n /** Opt in to a normalized textual snapshot of the active parent run. Defaults to fresh. */\n parentContext?: SubagentParentContext;\n systemPrompt?: string;\n /** JSON-serializable input appended to the task. */\n input?: unknown;\n /** Defaults to the parent runner's configured model. */\n model?: SubagentModelSpec;\n /** Tool names explicitly granted to the subagent. Defaults to no tools. */\n tools?: string[];\n /** When present, the final response must be JSON matching this schema. */\n outputSchema?: TOutputSchema;\n budget?: SubagentRunBudget;\n signal?: AbortSignal;\n}\n\nexport type SubagentRunOutput<TSchemaOrUndefined extends TSchema | undefined> =\n TSchemaOrUndefined extends TSchema ? Static<TSchemaOrUndefined> : string;\n\ninterface SubagentRunMetadata {\n runId: string;\n /** Raw final assistant text, including when structured validation failed. */\n text?: string;\n model: SubagentModelSpec;\n turns: number;\n /** Full token and cost breakdown across the run. */\n usage: SubagentUsage;\n /** Aggregate token count; equivalent to `usage.totalTokens`. */\n tokens: number;\n /** Aggregate provider cost; equivalent to `usage.cost.total`. */\n costUsd: number;\n durationMs: number;\n}\n\ninterface SubagentRunCompletedResult<TOutput> extends SubagentRunMetadata {\n status: \"completed\";\n output: TOutput;\n error?: never;\n}\n\ninterface SubagentRunIncompleteResult extends SubagentRunMetadata {\n status: Exclude<SubagentRunStatus, \"completed\">;\n output?: never;\n error?: string;\n}\n\nexport type SubagentRunResult<TOutput = string> =\n | SubagentRunCompletedResult<TOutput>\n | SubagentRunIncompleteResult;\n\n/**\n * First line of every session file. `cwd` records where the session was\n * started; extra fields (for example mikan's `source` marker) are preserved\n * verbatim on read and rewrite.\n */\nexport interface SessionHeader {\n type: \"session\";\n version?: number;\n id: string;\n timestamp: string;\n cwd: string;\n parentSession?: string;\n [extra: string]: unknown;\n}\n\n/** Raw file line: the header or one session entry. */\nexport type SessionFileEntry = SessionHeader | SessionEntry;\n"]}
@@ -0,0 +1,6 @@
1
+ import type { Usage } from "@earendil-works/pi-ai";
2
+ import type { SubagentUsage } from "./types.js";
3
+ export declare function createEmptySubagentUsage(): SubagentUsage;
4
+ export declare function addSubagentUsage(total: SubagentUsage, usage: Usage): void;
5
+ export declare function copySubagentUsage(usage: SubagentUsage): SubagentUsage;
6
+ //# sourceMappingURL=usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/harness/usage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,wBAAgB,wBAAwB,IAAI,aAAa,CASxD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CAkBzE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,GAAG,aAAa,CAErE"}
@@ -0,0 +1,32 @@
1
+ export function createEmptySubagentUsage() {
2
+ return {
3
+ input: 0,
4
+ output: 0,
5
+ cacheRead: 0,
6
+ cacheWrite: 0,
7
+ totalTokens: 0,
8
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
9
+ };
10
+ }
11
+ export function addSubagentUsage(total, usage) {
12
+ total.input += usage.input;
13
+ total.output += usage.output;
14
+ total.cacheRead += usage.cacheRead;
15
+ total.cacheWrite += usage.cacheWrite;
16
+ total.totalTokens += usage.input + usage.output + usage.cacheRead + usage.cacheWrite;
17
+ total.cost.input += usage.cost.input;
18
+ total.cost.output += usage.cost.output;
19
+ total.cost.cacheRead += usage.cost.cacheRead;
20
+ total.cost.cacheWrite += usage.cost.cacheWrite;
21
+ total.cost.total += usage.cost.total;
22
+ if (usage.cacheWrite1h !== undefined) {
23
+ total.cacheWrite1h = (total.cacheWrite1h ?? 0) + usage.cacheWrite1h;
24
+ }
25
+ if (usage.reasoning !== undefined) {
26
+ total.reasoning = (total.reasoning ?? 0) + usage.reasoning;
27
+ }
28
+ }
29
+ export function copySubagentUsage(usage) {
30
+ return { ...usage, cost: { ...usage.cost } };
31
+ }
32
+ //# sourceMappingURL=usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/harness/usage.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,wBAAwB;IACtC,OAAO;QACL,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,CAAC;QACT,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,CAAC;QACb,WAAW,EAAE,CAAC;QACd,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;KACrE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAoB,EAAE,KAAY;IACjE,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC;IAC3B,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC;IAC7B,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC;IACnC,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU,CAAC;IACrC,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC;IACrF,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;IACrC,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;IACvC,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;IAC7C,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;IAC/C,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;IAErC,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACrC,KAAK,CAAC,YAAY,GAAG,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC;IACtE,CAAC;IACD,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QAClC,KAAK,CAAC,SAAS,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC;IAC7D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAoB;IACpD,OAAO,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;AAC/C,CAAC","sourcesContent":["import type { Usage } from \"@earendil-works/pi-ai\";\nimport type { SubagentUsage } from \"./types.js\";\n\nexport function createEmptySubagentUsage(): SubagentUsage {\n return {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n totalTokens: 0,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n };\n}\n\nexport function addSubagentUsage(total: SubagentUsage, usage: Usage): void {\n total.input += usage.input;\n total.output += usage.output;\n total.cacheRead += usage.cacheRead;\n total.cacheWrite += usage.cacheWrite;\n total.totalTokens += usage.input + usage.output + usage.cacheRead + usage.cacheWrite;\n total.cost.input += usage.cost.input;\n total.cost.output += usage.cost.output;\n total.cost.cacheRead += usage.cost.cacheRead;\n total.cost.cacheWrite += usage.cost.cacheWrite;\n total.cost.total += usage.cost.total;\n\n if (usage.cacheWrite1h !== undefined) {\n total.cacheWrite1h = (total.cacheWrite1h ?? 0) + usage.cacheWrite1h;\n }\n if (usage.reasoning !== undefined) {\n total.reasoning = (total.reasoning ?? 0) + usage.reasoning;\n }\n}\n\nexport function copySubagentUsage(usage: SubagentUsage): SubagentUsage {\n return { ...usage, cost: { ...usage.cost } };\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -7,6 +7,7 @@ export * from "./sessions/policy.js";
7
7
  export * from "./sessions/store.js";
8
8
  export { createConversationRuntime, type RunSessionOptions, type ConversationRuntime, type ConversationRuntimeOptions, } from "./runtime/conversation-runtime.js";
9
9
  export type { MessagingBot, ConversationContext, ConversationEvent, MessagingEventHandler, ChatAdapter, ConversationMessage, ConversationResponder, ChatToolResult, ConversationKind, MessagingInfo, RunningSession, } from "./adapter.js";
10
- export { SandboxError, configureGondolinRuntime, createExecutor, getSandboxAdapters, parseSandboxArg, validateSandbox, type GondolinBootstrapOptions, } from "./sandbox/index.js";
11
- export type { CloudflareSandboxConfig, ExecOptions, ExecResult, Executor, SandboxAdapter, SandboxConfig, } from "./sandbox/index.js";
10
+ export { SandboxError, configureAgentSandboxRuntime, createExecutor, getSandboxAdapters, parseSandboxArg, shutdownAgentSandboxes, stopIdleAgentSandboxes, validateSandbox, } from "./sandbox/index.js";
11
+ export type { AgentConfig, AgentSandboxSettings, SandboxSettings } from "./types.js";
12
+ export type { AgentSandboxConfig, AgentSandboxRuntimeOptions, CloudflareSandboxConfig, ExecOptions, ExecResult, Executor, SandboxAdapter, SandboxConfig, } from "./sandbox/index.js";
12
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACjF,cAAc,oBAAoB,CAAC;AACnC,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3F,cAAc,iCAAiC,CAAC;AAChD,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,OAAO,EACL,yBAAyB,EACzB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,0BAA0B,GAChC,MAAM,mCAAmC,CAAC;AAC3C,YAAY,EACV,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,EACrB,WAAW,EACX,mBAAmB,EACnB,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,cAAc,GACf,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,YAAY,EACZ,wBAAwB,EACxB,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,KAAK,wBAAwB,GAC9B,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,uBAAuB,EACvB,WAAW,EACX,UAAU,EACV,QAAQ,EACR,cAAc,EACd,aAAa,GACd,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACjF,cAAc,oBAAoB,CAAC;AACnC,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3F,cAAc,iCAAiC,CAAC;AAChD,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,OAAO,EACL,yBAAyB,EACzB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,0BAA0B,GAChC,MAAM,mCAAmC,CAAC;AAC3C,YAAY,EACV,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,EACrB,WAAW,EACX,mBAAmB,EACnB,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,cAAc,GACf,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,YAAY,EACZ,4BAA4B,EAC5B,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,sBAAsB,EACtB,sBAAsB,EACtB,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,WAAW,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACrF,YAAY,EACV,kBAAkB,EAClB,0BAA0B,EAC1B,uBAAuB,EACvB,WAAW,EACX,UAAU,EACV,QAAQ,EACR,cAAc,EACd,aAAa,GACd,MAAM,oBAAoB,CAAC"}
package/dist/index.js CHANGED
@@ -5,5 +5,5 @@ export * from "./sessions/metadata.js";
5
5
  export * from "./sessions/policy.js";
6
6
  export * from "./sessions/store.js";
7
7
  export { createConversationRuntime, } from "./runtime/conversation-runtime.js";
8
- export { SandboxError, configureGondolinRuntime, createExecutor, getSandboxAdapters, parseSandboxArg, validateSandbox, } from "./sandbox/index.js";
8
+ export { SandboxError, configureAgentSandboxRuntime, createExecutor, getSandboxAdapters, parseSandboxArg, shutdownAgentSandboxes, stopIdleAgentSandboxes, validateSandbox, } from "./sandbox/index.js";
9
9
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACjF,cAAc,oBAAoB,CAAC;AAEnC,cAAc,iCAAiC,CAAC;AAChD,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,OAAO,EACL,yBAAyB,GAI1B,MAAM,mCAAmC,CAAC;AAc3C,OAAO,EACL,YAAY,EACZ,wBAAwB,EACxB,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,eAAe,GAEhB,MAAM,oBAAoB,CAAC","sourcesContent":["export { defaultCommandHandlers, dispatchCommand } from \"./commands/registry.js\";\nexport * from \"./harness/index.js\";\nexport type { CommandContext, CommandHandler, CommandServices } from \"./commands/types.js\";\nexport * from \"./sessions/chat-history-sync.js\";\nexport * from \"./sessions/metadata.js\";\nexport * from \"./sessions/policy.js\";\nexport * from \"./sessions/store.js\";\nexport {\n createConversationRuntime,\n type RunSessionOptions,\n type ConversationRuntime,\n type ConversationRuntimeOptions,\n} from \"./runtime/conversation-runtime.js\";\nexport type {\n MessagingBot,\n ConversationContext,\n ConversationEvent,\n MessagingEventHandler,\n ChatAdapter,\n ConversationMessage,\n ConversationResponder,\n ChatToolResult,\n ConversationKind,\n MessagingInfo,\n RunningSession,\n} from \"./adapter.js\";\nexport {\n SandboxError,\n configureGondolinRuntime,\n createExecutor,\n getSandboxAdapters,\n parseSandboxArg,\n validateSandbox,\n type GondolinBootstrapOptions,\n} from \"./sandbox/index.js\";\nexport type {\n CloudflareSandboxConfig,\n ExecOptions,\n ExecResult,\n Executor,\n SandboxAdapter,\n SandboxConfig,\n} from \"./sandbox/index.js\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACjF,cAAc,oBAAoB,CAAC;AAEnC,cAAc,iCAAiC,CAAC;AAChD,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,OAAO,EACL,yBAAyB,GAI1B,MAAM,mCAAmC,CAAC;AAc3C,OAAO,EACL,YAAY,EACZ,4BAA4B,EAC5B,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,sBAAsB,EACtB,sBAAsB,EACtB,eAAe,GAChB,MAAM,oBAAoB,CAAC","sourcesContent":["export { defaultCommandHandlers, dispatchCommand } from \"./commands/registry.js\";\nexport * from \"./harness/index.js\";\nexport type { CommandContext, CommandHandler, CommandServices } from \"./commands/types.js\";\nexport * from \"./sessions/chat-history-sync.js\";\nexport * from \"./sessions/metadata.js\";\nexport * from \"./sessions/policy.js\";\nexport * from \"./sessions/store.js\";\nexport {\n createConversationRuntime,\n type RunSessionOptions,\n type ConversationRuntime,\n type ConversationRuntimeOptions,\n} from \"./runtime/conversation-runtime.js\";\nexport type {\n MessagingBot,\n ConversationContext,\n ConversationEvent,\n MessagingEventHandler,\n ChatAdapter,\n ConversationMessage,\n ConversationResponder,\n ChatToolResult,\n ConversationKind,\n MessagingInfo,\n RunningSession,\n} from \"./adapter.js\";\nexport {\n SandboxError,\n configureAgentSandboxRuntime,\n createExecutor,\n getSandboxAdapters,\n parseSandboxArg,\n shutdownAgentSandboxes,\n stopIdleAgentSandboxes,\n validateSandbox,\n} from \"./sandbox/index.js\";\nexport type { AgentConfig, AgentSandboxSettings, SandboxSettings } from \"./types.js\";\nexport type {\n AgentSandboxConfig,\n AgentSandboxRuntimeOptions,\n CloudflareSandboxConfig,\n ExecOptions,\n ExecResult,\n Executor,\n SandboxAdapter,\n SandboxConfig,\n} from \"./sandbox/index.js\";\n"]}
package/dist/main.js CHANGED
@@ -17,6 +17,7 @@ import { startWebServer } from "./web/server.js";
17
17
  import { InMemoryAdminTokenStore } from "./web/admin/store.js";
18
18
  import { InMemoryLinkTokenStore } from "./web/login/store.js";
19
19
  import { InMemorySessionViewTokenStore } from "./web/session-view/store.js";
20
+ import { configureAgentSandboxRuntime, shutdownAgentSandboxes, stopIdleAgentSandboxes, } from "./sandbox/agent-sandbox.js";
20
21
  import { DockerContainerManager } from "./provisioner.js";
21
22
  import { assertStateDirOutsideWorkspace, createGlobalSettingsFile, loadGlobalSettings, MissingGlobalSettingsError, resolveLinkBaseUrl, } from "./config.js";
22
23
  import { configureHttpDispatcher, defaultAuthPath, defaultModelsJsonPath, parseHttpIdleTimeoutMs, } from "./harness/index.js";
@@ -26,13 +27,6 @@ import { ensureDirExists, isRecord, readJsonFileIfExists } from "./utils/file-gu
26
27
  import { SandboxError, validateSandbox } from "./sandbox/index.js";
27
28
  import { helpText, resolveBoot } from "./cli/boot.js";
28
29
  import { envReport, noPlatformsMessage, platformIsActive } from "./env-manifest.js";
29
- import { disconnectAllGondolinRuntimes, gondolinResources, stopIdleGondolinVms, sweepUnadoptedGondolinWorkers, } from "./sandbox/gondolin.js";
30
- import { configureGondolinRuntime } from "./sandbox/gondolin-bootstrap.js";
31
- import { gondolinInventory } from "./sandbox/gondolin-inventory.js";
32
- import { gondolinFleet } from "./sandbox/gondolin-fleet.js";
33
- import { gondolinGateway } from "./sandbox/gondolin-gateway.js";
34
- import { gondolinJoin } from "./sandbox/gondolin-join.js";
35
- import { checkWorkspaceExported } from "./sandbox/gondolin-nfs-advisory.js";
36
30
  import { FileVaultManager } from "./vault/index.js";
37
31
  import { runExtCommand } from "./cli/ext.js";
38
32
  import { createConversationRuntime } from "./runtime/conversation-runtime.js";
@@ -153,41 +147,6 @@ if (plan.mode === "version") {
153
147
  console.log(getVersion());
154
148
  process.exit(0);
155
149
  }
156
- // Handle --worker-token: mint a one-time join token for a dial-home worker
157
- if (plan.mode === "worker-token") {
158
- const stateDir = plan.stateDir;
159
- setEnvAliases("STATE_DIR", stateDir);
160
- ensureSecureStateDir(stateDir);
161
- gondolinJoin.configure(join(stateDir, "gondolin-gateway"));
162
- try {
163
- let gatewayPort = 8433;
164
- let gatewayHost;
165
- try {
166
- const gateway = loadGlobalSettings().sandbox?.gondolin?.remote?.gateway;
167
- if (gateway) {
168
- gatewayPort = gateway.port;
169
- gatewayHost = gateway.hostnames?.[0];
170
- }
171
- }
172
- catch {
173
- // settings are optional for minting; the CA lives in the state dir
174
- }
175
- const minted = await gondolinJoin.mintToken();
176
- const host = gatewayHost ?? "<mikan-host>";
177
- console.log("Worker join token (single use, expires in 15 minutes):");
178
- console.log("");
179
- console.log(` mikan-worker join https://${host}:${gatewayPort} \\`);
180
- console.log(` --token ${minted.token} \\`);
181
- console.log(` --ca-pin ${minted.fingerprint} \\`);
182
- console.log(` --name <worker-name> --workspace-root <shared-workspace-path> \\`);
183
- console.log(` --worker-entry /opt/mikan/dist/sandbox/gondolin-worker-main.js`);
184
- process.exit(0);
185
- }
186
- catch (err) {
187
- console.error(err instanceof Error ? err.message : String(err));
188
- process.exit(1);
189
- }
190
- }
191
150
  // Handle --onboard mode
192
151
  if (plan.mode === "onboard") {
193
152
  const stateDir = plan.stateDir;
@@ -248,8 +207,7 @@ if (vaultManager.isEnabled()) {
248
207
  console.log(sandbox.type === "container"
249
208
  ? " Vault system enabled. Container vault active."
250
209
  : sandbox.type === "image" ||
251
- sandbox.type === "gondolin" ||
252
- sandbox.type === "firecracker" ||
210
+ sandbox.type === "agent-sandbox" ||
253
211
  sandbox.type === "cloudflare"
254
212
  ? " Vault system enabled. Conversation-scoped credential routing active."
255
213
  : " Vault system enabled. Host mode will not inject vault env.");
@@ -263,6 +221,13 @@ const startupConfig = (() => {
263
221
  }
264
222
  })();
265
223
  const sandboxSettings = startupConfig.sandbox;
224
+ if (sandbox.type === "agent-sandbox") {
225
+ const settings = sandboxSettings?.agentSandbox;
226
+ if (!settings) {
227
+ handleStartupError(new SandboxError("Error: agent-sandbox requires sandbox.agentSandbox settings with namespace and runtimeClassName"));
228
+ }
229
+ configureAgentSandboxRuntime(settings);
230
+ }
266
231
  const sandboxLimits = sandboxSettings?.cpus || sandboxSettings?.memory
267
232
  ? { cpus: sandboxSettings?.cpus, memory: sandboxSettings?.memory }
268
233
  : undefined;
@@ -275,26 +240,8 @@ const provisioner = sandbox.type === "image"
275
240
  boostLimits: sandboxBoostLimits,
276
241
  })
277
242
  : undefined;
278
- if (sandbox.type === "gondolin") {
279
- try {
280
- configureGondolinRuntime({
281
- stateDir,
282
- limits: sandboxLimits,
283
- boostLimits: sandboxBoostLimits,
284
- remote: sandboxSettings?.gondolin?.remote,
285
- requireRemote: sandbox.profile === "remote",
286
- });
287
- }
288
- catch (error) {
289
- handleStartupError(error);
290
- }
291
- }
292
- const resourceController = sandbox.type === "image"
293
- ? provisioner
294
- : sandbox.type === "gondolin"
295
- ? gondolinResources
296
- : undefined;
297
- if (sandbox.type === "image" || sandbox.type === "gondolin") {
243
+ const resourceController = sandbox.type === "image" ? provisioner : undefined;
244
+ if (sandbox.type === "image" || sandbox.type === "agent-sandbox") {
298
245
  ensureDirExists(join(workingDir, "skills"));
299
246
  ensureDirExists(join(workingDir, "events"));
300
247
  try {
@@ -325,23 +272,9 @@ if (provisioner) {
325
272
  await provisioner.stopIdle(MANAGED_SANDBOX_IDLE_TIMEOUT_MS);
326
273
  setInterval(() => provisioner.stopIdle(MANAGED_SANDBOX_IDLE_TIMEOUT_MS), MANAGED_SANDBOX_IDLE_TIMEOUT_MS).unref();
327
274
  }
328
- if (sandbox.type === "gondolin" && sandbox.profile === "remote") {
329
- checkWorkspaceExported(workingDir, sandboxSettings?.gondolin?.remote?.gateway?.hostnames?.[0]);
330
- await gondolinGateway.start();
331
- await gondolinFleet.reconcile();
332
- setInterval(() => {
333
- void stopIdleGondolinVms(MANAGED_SANDBOX_IDLE_TIMEOUT_MS);
334
- void gondolinFleet.reconcile();
335
- }, MANAGED_SANDBOX_IDLE_TIMEOUT_MS).unref();
336
- }
337
- else if (sandbox.type === "gondolin") {
338
- gondolinInventory.touchHeartbeat();
339
- await gondolinInventory.reconcile();
340
- setInterval(() => {
341
- gondolinInventory.touchHeartbeat();
342
- void stopIdleGondolinVms(MANAGED_SANDBOX_IDLE_TIMEOUT_MS);
343
- void sweepUnadoptedGondolinWorkers();
344
- }, MANAGED_SANDBOX_IDLE_TIMEOUT_MS).unref();
275
+ if (sandbox.type === "agent-sandbox") {
276
+ await stopIdleAgentSandboxes(MANAGED_SANDBOX_IDLE_TIMEOUT_MS);
277
+ setInterval(() => void stopIdleAgentSandboxes(MANAGED_SANDBOX_IDLE_TIMEOUT_MS), MANAGED_SANDBOX_IDLE_TIMEOUT_MS).unref();
345
278
  }
346
279
  const botsByPlatform = {};
347
280
  /**
@@ -432,11 +365,9 @@ const sandboxDesc = sandbox.type === "host"
432
365
  ? `container:${sandbox.container}`
433
366
  : sandbox.type === "image"
434
367
  ? `image:${sandbox.image}`
435
- : sandbox.type === "gondolin"
436
- ? `gondolin:${sandbox.profile}`
437
- : sandbox.type === "firecracker"
438
- ? `firecracker:${sandbox.vmId}`
439
- : `cloudflare:${sandbox.sandboxId}`;
368
+ : sandbox.type === "agent-sandbox"
369
+ ? `agent-sandbox:${sandbox.warmpool}`
370
+ : `cloudflare:${sandbox.sandboxId}`;
440
371
  log.logStartup(workingDir, sandboxDesc);
441
372
  logHarnessStartupSummary();
442
373
  /**
@@ -573,8 +504,9 @@ eventsWatcher.start();
573
504
  // Handle shutdown
574
505
  async function shutdown() {
575
506
  await handler.shutdown();
507
+ if (sandbox.type === "agent-sandbox")
508
+ await shutdownAgentSandboxes();
576
509
  eventsWatcher.stop();
577
- await disconnectAllGondolinRuntimes();
578
510
  await Sentry.close(5000);
579
511
  process.exit(0);
580
512
  }
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\n\nimport \"./observability/instrument.js\";\n\nimport { join } from \"path\";\nimport { mkdirSync, statSync, writeFileSync } from \"fs\";\nimport { fileURLToPath } from \"url\";\nimport { dirname, join as pathJoin } from \"path\";\nimport type {\n MessagingBot,\n PlatformNotifier,\n PlatformReactor,\n PlatformUploader,\n} from \"./adapter.js\";\nimport { DiscordMessagingBot } from \"./adapters/discord/bot.js\";\nimport { GithubMessagingBot } from \"./adapters/github/bot.js\";\nimport { createGithubToolPack } from \"./adapters/github/tool-pack.js\";\nimport type { PlatformGithubOps } from \"./adapters/github/types.js\";\nimport { GcpTokenProvider } from \"./adapters/github/gcp-auth.js\";\nimport { TelegramMessagingBot } from \"./adapters/telegram/bot.js\";\nimport { SlackMessagingBot as SlackMessagingBotClass } from \"./adapters/slack/bot.js\";\nimport type { PlatformToolPackFactory } from \"./tools/types.js\";\nimport { downloadChannel } from \"./cli/download.js\";\nimport { EventsWatcher } from \"./events.js\";\nimport * as log from \"./log.js\";\nimport { startWebServer } from \"./web/server.js\";\nimport { InMemoryAdminTokenStore } from \"./web/admin/store.js\";\nimport { InMemoryLinkTokenStore } from \"./web/login/store.js\";\nimport { InMemorySessionViewTokenStore } from \"./web/session-view/store.js\";\nimport { DockerContainerManager } from \"./provisioner.js\";\nimport {\n assertStateDirOutsideWorkspace,\n createGlobalSettingsFile,\n loadGlobalSettings,\n MissingGlobalSettingsError,\n resolveLinkBaseUrl,\n} from \"./config.js\";\nimport {\n configureHttpDispatcher,\n defaultAuthPath,\n defaultModelsJsonPath,\n parseHttpIdleTimeoutMs,\n} from \"./harness/index.js\";\nimport { existsSync, readFileSync } from \"fs\";\nimport { readEnv, setEnvAliases } from \"./utils/env.js\";\nimport { ensureDirExists, isRecord, readJsonFileIfExists } from \"./utils/file-guards.js\";\nimport { SandboxError, validateSandbox } from \"./sandbox/index.js\";\nimport { helpText, resolveBoot, type BootPlan } from \"./cli/boot.js\";\nimport { envReport, noPlatformsMessage, platformIsActive } from \"./env-manifest.js\";\nimport {\n disconnectAllGondolinRuntimes,\n gondolinResources,\n stopIdleGondolinVms,\n sweepUnadoptedGondolinWorkers,\n} from \"./sandbox/gondolin.js\";\nimport { configureGondolinRuntime } from \"./sandbox/gondolin-bootstrap.js\";\nimport { gondolinInventory } from \"./sandbox/gondolin-inventory.js\";\nimport { gondolinFleet } from \"./sandbox/gondolin-fleet.js\";\nimport { gondolinGateway } from \"./sandbox/gondolin-gateway.js\";\nimport { gondolinJoin } from \"./sandbox/gondolin-join.js\";\nimport { checkWorkspaceExported } from \"./sandbox/gondolin-nfs-advisory.js\";\nimport { FileVaultManager } from \"./vault/index.js\";\nimport { runExtCommand } from \"./cli/ext.js\";\nimport { createConversationRuntime } from \"./runtime/conversation-runtime.js\";\nimport { ChannelStore } from \"./store.js\";\nimport * as Sentry from \"@sentry/node\";\n\nfunction getVersion(): string {\n // Try to find package.json in the dist directory or parent\n const possiblePaths = [\n pathJoin(dirname(fileURLToPath(import.meta.url)), \"package.json\"),\n pathJoin(dirname(fileURLToPath(import.meta.url)), \"..\", \"package.json\"),\n pathJoin(process.cwd(), \"package.json\"),\n ];\n\n for (const pkgPath of possiblePaths) {\n const pkg = readJsonFileIfExists(\n pkgPath,\n (value): value is { version?: unknown } => isRecord(value),\n () => \"Ignoring package.json while resolving version\",\n );\n if (typeof pkg?.version === \"string\" && pkg.version) return pkg.version;\n }\n return \"unknown\";\n}\n\nconst SLACK_APP_TOKEN = readEnv(\"SLACK_APP_TOKEN\");\nconst SLACK_BOT_TOKEN = readEnv(\"SLACK_BOT_TOKEN\");\nconst TELEGRAM_BOT_TOKEN = readEnv(\"TELEGRAM_BOT_TOKEN\");\nconst DISCORD_BOT_TOKEN = readEnv(\"DISCORD_BOT_TOKEN\");\nconst GITHUB_APP_ID = readEnv(\"GITHUB_APP_ID\");\nconst GITHUB_APP_PRIVATE_KEY = readEnv(\"GITHUB_APP_PRIVATE_KEY\");\nconst GITHUB_APP_PRIVATE_KEY_PATH = readEnv(\"GITHUB_APP_PRIVATE_KEY_PATH\");\nconst GITHUB_INSTALLATION_ID = readEnv(\"GITHUB_INSTALLATION_ID\");\nconst GITHUB_REPOS = readEnv(\"GITHUB_REPOS\");\nconst GITHUB_POLL_INTERVAL = readEnv(\"GITHUB_POLL_INTERVAL\");\nconst GOOGLE_APPLICATION_CREDENTIALS = readEnv(\"GOOGLE_APPLICATION_CREDENTIALS\");\nconst GOOGLE_CLOUD_PROJECT = readEnv(\"GOOGLE_CLOUD_PROJECT\");\n// Externally-visible base URL of the link/OAuth server; the env read and\n// trailing-slash normalization live in config.resolveLinkBaseUrl.\nconst LINK_BASE_URL = resolveLinkBaseUrl();\nconst LINK_PORT_RAW = readEnv(\"LINK_PORT\");\nconst LINK_PORT = LINK_PORT_RAW ? parseInt(LINK_PORT_RAW, 10) : LINK_BASE_URL ? 8181 : undefined;\n\nconst WORLD_WRITABLE_MODE = 0o002;\n\nfunction ensureSecureStateDir(path: string): void {\n let stat;\n try {\n stat = statSync(path);\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === \"ENOENT\") {\n mkdirSync(path, { recursive: true, mode: 0o700 });\n return;\n }\n console.error(`Error: cannot access --state-dir ${path}: ${(err as Error).message}`);\n process.exit(1);\n }\n\n if (!stat.isDirectory()) {\n console.error(`Error: --state-dir ${path} exists but is not a directory`);\n process.exit(1);\n }\n\n if (stat.mode & WORLD_WRITABLE_MODE) {\n console.error(\n `Error: --state-dir ${path} is world-writable (mode ${(stat.mode & 0o777).toString(8)}). ` +\n `Credentials stored there would be exposed to other local users. ` +\n `Fix with: chmod 0700 ${path}`,\n );\n process.exit(1);\n }\n\n const euid = typeof process.geteuid === \"function\" ? process.geteuid() : undefined;\n if (euid !== undefined && stat.uid !== euid) {\n console.error(\n `Error: --state-dir ${path} is owned by uid ${stat.uid} but mikan is running as uid ${euid}. ` +\n `Run mikan as the directory owner or point --state-dir at a directory you own.`,\n );\n process.exit(1);\n }\n}\n\nfunction handleStartupError(error: unknown): never {\n if (error instanceof SandboxError) {\n for (const line of error.formatForCli()) {\n console.error(line);\n }\n process.exit(1);\n }\n if (error instanceof MissingGlobalSettingsError) {\n console.error(`Missing global settings: ${error.settingsPath}`);\n console.error(\"\");\n console.error(\"Run onboarding to create it:\");\n console.error(` mikan --onboard --state-dir ${stateDir}`);\n console.error(\"\");\n console.error(\"Then review the generated settings.json and start mikan again.\");\n process.exit(1);\n }\n if (error instanceof Error) {\n console.error(`Error: ${error.message}`);\n process.exit(1);\n }\n console.error(String(error));\n process.exit(1);\n}\n\nlet plan: BootPlan;\ntry {\n plan = resolveBoot();\n} catch (error) {\n handleStartupError(error);\n}\n\n// `mikan ext …` manages extensions and exits; handle it before the normal\n// bot-mode startup (which requires platform tokens).\nif (plan.mode === \"ext\") {\n const code = await runExtCommand(plan.extArgs ?? []);\n process.exit(code);\n}\n\n// Global fetch: proxy support (HTTP_PROXY/HTTPS_PROXY/NO_PROXY) and idle\n// timeouts so a stalled LLM stream errors out instead of hanging a session.\nconst httpIdleTimeoutMs = parseHttpIdleTimeoutMs(readEnv(\"HTTP_IDLE_TIMEOUT\"));\nconfigureHttpDispatcher(httpIdleTimeoutMs);\n\nif (plan.mode === \"help\") {\n console.log(helpText());\n process.exit(0);\n}\n\nif (plan.mode === \"env\") {\n console.log(envReport());\n process.exit(0);\n}\n\nif (plan.mode === \"version\") {\n console.log(getVersion());\n process.exit(0);\n}\n\n// Handle --worker-token: mint a one-time join token for a dial-home worker\nif (plan.mode === \"worker-token\") {\n const stateDir = plan.stateDir;\n setEnvAliases(\"STATE_DIR\", stateDir);\n ensureSecureStateDir(stateDir);\n gondolinJoin.configure(join(stateDir, \"gondolin-gateway\"));\n try {\n let gatewayPort = 8433;\n let gatewayHost: string | undefined;\n try {\n const gateway = loadGlobalSettings().sandbox?.gondolin?.remote?.gateway;\n if (gateway) {\n gatewayPort = gateway.port;\n gatewayHost = gateway.hostnames?.[0];\n }\n } catch {\n // settings are optional for minting; the CA lives in the state dir\n }\n const minted = await gondolinJoin.mintToken();\n const host = gatewayHost ?? \"<mikan-host>\";\n console.log(\"Worker join token (single use, expires in 15 minutes):\");\n console.log(\"\");\n console.log(` mikan-worker join https://${host}:${gatewayPort} \\\\`);\n console.log(` --token ${minted.token} \\\\`);\n console.log(` --ca-pin ${minted.fingerprint} \\\\`);\n console.log(` --name <worker-name> --workspace-root <shared-workspace-path> \\\\`);\n console.log(` --worker-entry /opt/mikan/dist/sandbox/gondolin-worker-main.js`);\n process.exit(0);\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n}\n\n// Handle --onboard mode\nif (plan.mode === \"onboard\") {\n const stateDir = plan.stateDir;\n setEnvAliases(\"STATE_DIR\", stateDir);\n ensureSecureStateDir(stateDir);\n try {\n const settingsPath = createGlobalSettingsFile(stateDir);\n console.log(`Created global settings at ${settingsPath}`);\n console.log(\n `Review the file, then start mikan (workspace defaults to ${join(stateDir, \"workspace\")}).`,\n );\n process.exit(0);\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n}\n\n// Handle --download mode (Slack only)\nif (plan.mode === \"download\" && plan.downloadChannel) {\n if (!SLACK_BOT_TOKEN) {\n console.error(\"Missing env: SLACK_BOT_TOKEN\");\n process.exit(1);\n }\n await downloadChannel(plan.downloadChannel, SLACK_BOT_TOKEN);\n process.exit(0);\n}\n\n// Normal bot mode - working dir is optional and defaults under the state dir\nconst sandbox = plan.sandbox;\nconst stateDir = plan.stateDir;\nconst workingDir = plan.workingDir;\nsetEnvAliases(\"STATE_DIR\", stateDir);\nensureSecureStateDir(stateDir);\nif (!plan.workingDirExplicit) {\n ensureDirExists(workingDir);\n}\ntry {\n assertStateDirOutsideWorkspace(stateDir, workingDir, sandbox.type);\n} catch (error) {\n handleStartupError(error);\n}\n\n// Validate platform tokens — activation rules live in the env manifest.\nconst hasSlack = platformIsActive(\"slack\");\nconst hasTelegram = platformIsActive(\"telegram\");\nconst hasDiscord = platformIsActive(\"discord\");\nconst hasGithub = platformIsActive(\"github\");\n\nif (!hasSlack && !hasTelegram && !hasDiscord && !hasGithub) {\n console.error(noPlatformsMessage());\n process.exit(1);\n}\n\ntry {\n await validateSandbox(sandbox);\n} catch (error) {\n handleStartupError(error);\n}\n\nconst vaultManager = new FileVaultManager(stateDir);\nif (vaultManager.isEnabled()) {\n console.log(\n sandbox.type === \"container\"\n ? \" Vault system enabled. Container vault active.\"\n : sandbox.type === \"image\" ||\n sandbox.type === \"gondolin\" ||\n sandbox.type === \"firecracker\" ||\n sandbox.type === \"cloudflare\"\n ? \" Vault system enabled. Conversation-scoped credential routing active.\"\n : \" Vault system enabled. Host mode will not inject vault env.\",\n );\n}\n\nconst startupConfig = (() => {\n try {\n return loadGlobalSettings();\n } catch (error) {\n handleStartupError(error);\n }\n})();\nconst sandboxSettings = startupConfig.sandbox;\nconst sandboxLimits =\n sandboxSettings?.cpus || sandboxSettings?.memory\n ? { cpus: sandboxSettings?.cpus, memory: sandboxSettings?.memory }\n : undefined;\nconst sandboxBoostLimits =\n sandboxSettings?.boost?.cpus || sandboxSettings?.boost?.memory\n ? { cpus: sandboxSettings?.boost?.cpus, memory: sandboxSettings?.boost?.memory }\n : undefined;\n\nconst provisioner =\n sandbox.type === \"image\"\n ? new DockerContainerManager(sandbox.image, {\n limits: sandboxLimits,\n boostLimits: sandboxBoostLimits,\n })\n : undefined;\nif (sandbox.type === \"gondolin\") {\n try {\n configureGondolinRuntime({\n stateDir,\n limits: sandboxLimits,\n boostLimits: sandboxBoostLimits,\n remote: sandboxSettings?.gondolin?.remote,\n requireRemote: sandbox.profile === \"remote\",\n });\n } catch (error) {\n handleStartupError(error);\n }\n}\nconst resourceController =\n sandbox.type === \"image\"\n ? provisioner\n : sandbox.type === \"gondolin\"\n ? gondolinResources\n : undefined;\n\nif (sandbox.type === \"image\" || sandbox.type === \"gondolin\") {\n ensureDirExists(join(workingDir, \"skills\"));\n ensureDirExists(join(workingDir, \"events\"));\n try {\n writeFileSync(join(workingDir, \"MEMORY.md\"), \"\", { flag: \"wx\" });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"EEXIST\") throw err;\n }\n}\n\nconst linkTokenStore = new InMemoryLinkTokenStore();\nconst sessionViewTokenStore = new InMemorySessionViewTokenStore();\nconst adminTokenStore = new InMemoryAdminTokenStore();\nsetInterval(() => linkTokenStore.purge(), 5 * 60 * 1000).unref();\nsetInterval(() => sessionViewTokenStore.purge(), 5 * 60 * 1000).unref();\nsetInterval(() => adminTokenStore.purge(), 5 * 60 * 1000).unref();\n\nfunction portalBaseUrl(): string | undefined {\n if (LINK_BASE_URL) return LINK_BASE_URL;\n if (LINK_PORT) return `http://localhost:${LINK_PORT}`;\n return undefined;\n}\n/** Idle timeout for managed sandboxes (10 minutes) */\nconst MANAGED_SANDBOX_IDLE_TIMEOUT_MS = 10 * 60 * 1000;\n\nif (provisioner) {\n await provisioner.reconcile();\n await provisioner.stopIdle(MANAGED_SANDBOX_IDLE_TIMEOUT_MS);\n setInterval(\n () => provisioner.stopIdle(MANAGED_SANDBOX_IDLE_TIMEOUT_MS),\n MANAGED_SANDBOX_IDLE_TIMEOUT_MS,\n ).unref();\n}\n\nif (sandbox.type === \"gondolin\" && sandbox.profile === \"remote\") {\n checkWorkspaceExported(workingDir, sandboxSettings?.gondolin?.remote?.gateway?.hostnames?.[0]);\n await gondolinGateway.start();\n await gondolinFleet.reconcile();\n setInterval(() => {\n void stopIdleGondolinVms(MANAGED_SANDBOX_IDLE_TIMEOUT_MS);\n void gondolinFleet.reconcile();\n }, MANAGED_SANDBOX_IDLE_TIMEOUT_MS).unref();\n} else if (sandbox.type === \"gondolin\") {\n gondolinInventory.touchHeartbeat();\n await gondolinInventory.reconcile();\n setInterval(() => {\n gondolinInventory.touchHeartbeat();\n void stopIdleGondolinVms(MANAGED_SANDBOX_IDLE_TIMEOUT_MS);\n void sweepUnadoptedGondolinWorkers();\n }, MANAGED_SANDBOX_IDLE_TIMEOUT_MS).unref();\n}\nconst botsByPlatform: Record<string, MessagingBot> = {};\n\n/**\n * Resolve which platform bot to use: an explicit platform, or the sole\n * running one. Mirrors event-file platform resolution.\n */\nfunction resolvePlatformBot(op: string, platform: string | undefined): [string, MessagingBot] {\n const available = Object.keys(botsByPlatform);\n const key = platform?.trim().toLowerCase() || (available.length === 1 ? available[0] : undefined);\n const bot = key ? botsByPlatform[key] : undefined;\n if (!bot) {\n throw new Error(\n platform\n ? `${op}: unknown platform '${platform}' (available: ${available.join(\", \") || \"none\"})`\n : `${op}: multiple platforms active (${available.join(\", \")}); specify platform`,\n );\n }\n return [key!, bot];\n}\n\n/** Extension `api.notify` backend: post into a conversation without a run. */\nconst platformNotifier: PlatformNotifier = async (conversationId, text, platform) => {\n const [key, bot] = resolvePlatformBot(\"notify\", platform);\n await bot.postMessage(conversationId, text);\n log.logInfo(`[notify] posted to ${key}/${conversationId} (${text.length} chars)`);\n};\n\n/** Extension `api.react` backend: add a reaction to a message. */\nconst platformReactor: PlatformReactor = async (conversationId, messageTs, emoji, platform) => {\n const [key, bot] = resolvePlatformBot(\"react\", platform);\n if (!bot.addReaction) {\n throw new Error(`react: platform '${key}' does not support reactions`);\n }\n await bot.addReaction(conversationId, messageTs, emoji);\n log.logInfo(`[react] :${emoji}: on ${key}/${conversationId}`);\n};\n\n/** Extension `api.uploadFile` backend: send a host file into a conversation. */\nconst platformUploader: PlatformUploader = async (conversationId, filePath, title, platform) => {\n const [key, bot] = resolvePlatformBot(\"upload\", platform);\n if (!bot.uploadFile) {\n throw new Error(`upload: platform '${key}' does not support file uploads`);\n }\n await bot.uploadFile(conversationId, filePath, title);\n log.logInfo(`[upload] ${filePath} to ${key}/${conversationId}`);\n};\n\n/** github_* tool backends: PR push/create and CI checks, host-side. */\nfunction requireGithubBot(op: string): GithubMessagingBot {\n const bot = botsByPlatform.github as GithubMessagingBot | undefined;\n if (!bot) {\n throw new Error(`${op}: the GitHub platform is not running`);\n }\n return bot;\n}\n\n/**\n * Platform capability pack factories — only when the corresponding bot is\n * configured. Factories, not instances: each runner materializes its own\n * pack so per-run bind state never crosses conversations.\n */\nfunction buildPlatformToolPackFactories(): PlatformToolPackFactory[] {\n if (!hasGithub) return [];\n const platformGithubOps: PlatformGithubOps = {\n pushAndCreatePr: (conversationId, request) =>\n requireGithubBot(\"github_pr\").ops.pushAndCreatePr(conversationId, request),\n getChecks: (conversationId, branch) =>\n requireGithubBot(\"github_checks\").ops.getChecks(conversationId, branch),\n getJobLog: (conversationId, jobId) =>\n requireGithubBot(\"github_checks\").ops.getJobLog(conversationId, jobId),\n getBuildLog: (conversationId, buildId) =>\n requireGithubBot(\"github_checks\").ops.getBuildLog(conversationId, buildId),\n replyToReviewThread: (conversationId, commentId, body) =>\n requireGithubBot(\"github_review_reply\").ops.replyToReviewThread(\n conversationId,\n commentId,\n body,\n ),\n syncRepo: (conversationId, branch) =>\n requireGithubBot(\"github_sync\").ops.syncRepo(conversationId, branch),\n readGithub: (conversationId, request) =>\n requireGithubBot(\"github_read\").ops.readGithub(conversationId, request),\n manageIssue: (conversationId, request) =>\n requireGithubBot(\"github_issue\").ops.manageIssue(conversationId, request),\n };\n return [() => createGithubToolPack(platformGithubOps)];\n}\n\nconst handler = createConversationRuntime({\n workingDir,\n sandbox,\n vaultManager,\n provisioner,\n resourceController,\n linkTokenStore,\n sessionViewTokenStore,\n adminTokenStore,\n portalBaseUrl: portalBaseUrl(),\n platformNotifier,\n platformReactor,\n platformUploader,\n platformToolPackFactories: buildPlatformToolPackFactories(),\n});\n\nconst sandboxDesc =\n sandbox.type === \"host\"\n ? \"host\"\n : sandbox.type === \"container\"\n ? `container:${sandbox.container}`\n : sandbox.type === \"image\"\n ? `image:${sandbox.image}`\n : sandbox.type === \"gondolin\"\n ? `gondolin:${sandbox.profile}`\n : sandbox.type === \"firecracker\"\n ? `firecracker:${sandbox.vmId}`\n : `cloudflare:${sandbox.sandboxId}`;\nlog.logStartup(workingDir, sandboxDesc);\nlogHarnessStartupSummary();\n\n/**\n * One-look confirmation of the harness runtime surface, aimed at upgrade\n * verification: config moved from ~/.pi to ~/.mikan with no fallback, so a\n * missing auth.json here is the first thing to check when runs fail.\n */\nfunction logHarnessStartupSummary(): void {\n const proxy =\n process.env.HTTPS_PROXY ??\n process.env.https_proxy ??\n process.env.HTTP_PROXY ??\n process.env.http_proxy;\n log.logInfo(\n `HTTP dispatcher: idle timeout ${httpIdleTimeoutMs}ms${proxy ? `, proxy ${proxy}` : \", no proxy\"}`,\n );\n\n const authPath = defaultAuthPath();\n if (existsSync(authPath)) {\n try {\n const providers = Object.keys(JSON.parse(readFileSync(authPath, \"utf-8\")) as object);\n log.logInfo(`Harness auth: ${authPath} (providers: ${providers.join(\", \") || \"none\"})`);\n } catch {\n log.logWarning(`Harness auth: ${authPath} exists but is not valid JSON`);\n }\n } else {\n log.logInfo(`Harness auth: ${authPath} missing — provider keys come from env vars only`);\n }\n\n const modelsPath = defaultModelsJsonPath();\n log.logInfo(\n existsSync(modelsPath)\n ? `Harness models.json: ${modelsPath}`\n : `Harness models.json: none (${modelsPath}) — built-in providers only`,\n );\n}\n\nif (hasSlack) {\n const slackMessagingBotToken = SLACK_BOT_TOKEN;\n const slackAppToken = SLACK_APP_TOKEN;\n if (!slackMessagingBotToken || !slackAppToken) {\n throw new Error(\"Slack startup requires both SLACK_APP_TOKEN and SLACK_BOT_TOKEN\");\n }\n const sharedStore = new ChannelStore({ workingDir, botToken: slackMessagingBotToken });\n const slackMessagingBot = new SlackMessagingBotClass(handler, {\n appToken: slackAppToken,\n botToken: slackMessagingBotToken,\n workingDir,\n store: sharedStore,\n });\n botsByPlatform.slack = slackMessagingBot;\n log.logInfo(\"Platform: Slack\");\n}\nif (hasTelegram) {\n const telegramToken = TELEGRAM_BOT_TOKEN;\n if (!telegramToken) {\n throw new Error(\"Telegram startup requires TELEGRAM_BOT_TOKEN\");\n }\n const telegramMessagingBot = new TelegramMessagingBot(handler, {\n token: telegramToken,\n workingDir,\n });\n botsByPlatform.telegram = telegramMessagingBot;\n log.logInfo(\"Platform: Telegram\");\n}\nif (hasDiscord) {\n const discordToken = DISCORD_BOT_TOKEN;\n if (!discordToken) {\n throw new Error(\"Discord startup requires DISCORD_BOT_TOKEN\");\n }\n const discordMessagingBot = new DiscordMessagingBot(handler, {\n token: discordToken,\n workingDir,\n });\n botsByPlatform.discord = discordMessagingBot;\n log.logInfo(\"Platform: Discord\");\n}\nif (hasGithub) {\n if (!GITHUB_APP_ID || !GITHUB_INSTALLATION_ID) {\n throw new Error(\"GitHub startup requires GITHUB_APP_ID and GITHUB_INSTALLATION_ID\");\n }\n // Env vars flatten PEM newlines to literal `\\n`; a key file avoids that.\n const githubPrivateKey = GITHUB_APP_PRIVATE_KEY_PATH\n ? readFileSync(GITHUB_APP_PRIVATE_KEY_PATH, \"utf-8\")\n : GITHUB_APP_PRIVATE_KEY?.replace(/\\\\n/g, \"\\n\");\n if (!githubPrivateKey) {\n throw new Error(\n \"GitHub startup requires GITHUB_APP_PRIVATE_KEY or GITHUB_APP_PRIVATE_KEY_PATH\",\n );\n }\n const pollIntervalSeconds = GITHUB_POLL_INTERVAL ? parseInt(GITHUB_POLL_INTERVAL, 10) : NaN;\n const githubMessagingBot = new GithubMessagingBot(handler, {\n appId: GITHUB_APP_ID,\n privateKey: githubPrivateKey,\n installationId: GITHUB_INSTALLATION_ID,\n repos: GITHUB_REPOS\n ? GITHUB_REPOS.split(\",\")\n .map((repo) => repo.trim())\n .filter(Boolean)\n : [],\n pollIntervalMs:\n (Number.isFinite(pollIntervalSeconds) && pollIntervalSeconds > 0 ? pollIntervalSeconds : 60) *\n 1000,\n workingDir,\n syncStatePath: join(stateDir, \"github-sync.json\"),\n // Host-side GCP creds (e.g. a WIF external_account file) unlock Cloud\n // Build logs in github_checks; without them external CI degrades to\n // guidance text. Credentials never enter the sandbox.\n cloudBuild: GOOGLE_APPLICATION_CREDENTIALS\n ? {\n tokenProvider: new GcpTokenProvider({\n credentialsPath: GOOGLE_APPLICATION_CREDENTIALS,\n }),\n projectFallback: GOOGLE_CLOUD_PROJECT,\n }\n : undefined,\n });\n botsByPlatform.github = githubMessagingBot;\n log.logInfo(\n `Platform: GitHub${GOOGLE_APPLICATION_CREDENTIALS ? \" (Cloud Build logs enabled)\" : \"\"}`,\n );\n}\n\nif (LINK_PORT) {\n startWebServer({\n port: LINK_PORT,\n linkTokenStore,\n vaultManager,\n notify: async (platform, conversationId, message) => {\n const bot = botsByPlatform[platform];\n if (bot) await bot.postMessage(conversationId, message);\n },\n sessionViewTokenStore,\n sessionViewInteractive: { handler, botsByPlatform },\n adminOptions: { adminTokenStore, workingDir, runtime: handler, sandbox, botsByPlatform },\n });\n}\n\n// Start events watcher with explicit platform routing\nconst eventsWatcher = new EventsWatcher(join(workingDir, \"events\"), botsByPlatform);\nconst slackMessagingBot = botsByPlatform.slack as SlackMessagingBotClass | undefined;\nif (slackMessagingBot) {\n slackMessagingBot.setEventsWatcher(eventsWatcher);\n}\neventsWatcher.start();\n\n// Handle shutdown\nasync function shutdown(): Promise<void> {\n await handler.shutdown();\n eventsWatcher.stop();\n await disconnectAllGondolinRuntimes();\n await Sentry.close(5000);\n process.exit(0);\n}\n\nprocess.on(\"SIGINT\", shutdown);\nprocess.on(\"SIGTERM\", shutdown);\n\n// Start all bots\nawait Promise.all(\n Object.values(botsByPlatform).map((bot) =>\n bot.start().catch((err) => {\n log.logWarning(\"Failed to start bot\", err instanceof Error ? err.message : String(err));\n process.exit(1);\n }),\n ),\n);\n"]}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\n\nimport \"./observability/instrument.js\";\n\nimport { join } from \"path\";\nimport { mkdirSync, statSync, writeFileSync } from \"fs\";\nimport { fileURLToPath } from \"url\";\nimport { dirname, join as pathJoin } from \"path\";\nimport type {\n MessagingBot,\n PlatformNotifier,\n PlatformReactor,\n PlatformUploader,\n} from \"./adapter.js\";\nimport { DiscordMessagingBot } from \"./adapters/discord/bot.js\";\nimport { GithubMessagingBot } from \"./adapters/github/bot.js\";\nimport { createGithubToolPack } from \"./adapters/github/tool-pack.js\";\nimport type { PlatformGithubOps } from \"./adapters/github/types.js\";\nimport { GcpTokenProvider } from \"./adapters/github/gcp-auth.js\";\nimport { TelegramMessagingBot } from \"./adapters/telegram/bot.js\";\nimport { SlackMessagingBot as SlackMessagingBotClass } from \"./adapters/slack/bot.js\";\nimport type { PlatformToolPackFactory } from \"./tools/types.js\";\nimport { downloadChannel } from \"./cli/download.js\";\nimport { EventsWatcher } from \"./events.js\";\nimport * as log from \"./log.js\";\nimport { startWebServer } from \"./web/server.js\";\nimport { InMemoryAdminTokenStore } from \"./web/admin/store.js\";\nimport { InMemoryLinkTokenStore } from \"./web/login/store.js\";\nimport { InMemorySessionViewTokenStore } from \"./web/session-view/store.js\";\nimport {\n configureAgentSandboxRuntime,\n shutdownAgentSandboxes,\n stopIdleAgentSandboxes,\n} from \"./sandbox/agent-sandbox.js\";\nimport { DockerContainerManager } from \"./provisioner.js\";\nimport {\n assertStateDirOutsideWorkspace,\n createGlobalSettingsFile,\n loadGlobalSettings,\n MissingGlobalSettingsError,\n resolveLinkBaseUrl,\n} from \"./config.js\";\nimport {\n configureHttpDispatcher,\n defaultAuthPath,\n defaultModelsJsonPath,\n parseHttpIdleTimeoutMs,\n} from \"./harness/index.js\";\nimport { existsSync, readFileSync } from \"fs\";\nimport { readEnv, setEnvAliases } from \"./utils/env.js\";\nimport { ensureDirExists, isRecord, readJsonFileIfExists } from \"./utils/file-guards.js\";\nimport { SandboxError, validateSandbox } from \"./sandbox/index.js\";\nimport { helpText, resolveBoot, type BootPlan } from \"./cli/boot.js\";\nimport { envReport, noPlatformsMessage, platformIsActive } from \"./env-manifest.js\";\nimport { FileVaultManager } from \"./vault/index.js\";\nimport { runExtCommand } from \"./cli/ext.js\";\nimport { createConversationRuntime } from \"./runtime/conversation-runtime.js\";\nimport { ChannelStore } from \"./store.js\";\nimport * as Sentry from \"@sentry/node\";\n\nfunction getVersion(): string {\n // Try to find package.json in the dist directory or parent\n const possiblePaths = [\n pathJoin(dirname(fileURLToPath(import.meta.url)), \"package.json\"),\n pathJoin(dirname(fileURLToPath(import.meta.url)), \"..\", \"package.json\"),\n pathJoin(process.cwd(), \"package.json\"),\n ];\n\n for (const pkgPath of possiblePaths) {\n const pkg = readJsonFileIfExists(\n pkgPath,\n (value): value is { version?: unknown } => isRecord(value),\n () => \"Ignoring package.json while resolving version\",\n );\n if (typeof pkg?.version === \"string\" && pkg.version) return pkg.version;\n }\n return \"unknown\";\n}\n\nconst SLACK_APP_TOKEN = readEnv(\"SLACK_APP_TOKEN\");\nconst SLACK_BOT_TOKEN = readEnv(\"SLACK_BOT_TOKEN\");\nconst TELEGRAM_BOT_TOKEN = readEnv(\"TELEGRAM_BOT_TOKEN\");\nconst DISCORD_BOT_TOKEN = readEnv(\"DISCORD_BOT_TOKEN\");\nconst GITHUB_APP_ID = readEnv(\"GITHUB_APP_ID\");\nconst GITHUB_APP_PRIVATE_KEY = readEnv(\"GITHUB_APP_PRIVATE_KEY\");\nconst GITHUB_APP_PRIVATE_KEY_PATH = readEnv(\"GITHUB_APP_PRIVATE_KEY_PATH\");\nconst GITHUB_INSTALLATION_ID = readEnv(\"GITHUB_INSTALLATION_ID\");\nconst GITHUB_REPOS = readEnv(\"GITHUB_REPOS\");\nconst GITHUB_POLL_INTERVAL = readEnv(\"GITHUB_POLL_INTERVAL\");\nconst GOOGLE_APPLICATION_CREDENTIALS = readEnv(\"GOOGLE_APPLICATION_CREDENTIALS\");\nconst GOOGLE_CLOUD_PROJECT = readEnv(\"GOOGLE_CLOUD_PROJECT\");\n// Externally-visible base URL of the link/OAuth server; the env read and\n// trailing-slash normalization live in config.resolveLinkBaseUrl.\nconst LINK_BASE_URL = resolveLinkBaseUrl();\nconst LINK_PORT_RAW = readEnv(\"LINK_PORT\");\nconst LINK_PORT = LINK_PORT_RAW ? parseInt(LINK_PORT_RAW, 10) : LINK_BASE_URL ? 8181 : undefined;\n\nconst WORLD_WRITABLE_MODE = 0o002;\n\nfunction ensureSecureStateDir(path: string): void {\n let stat;\n try {\n stat = statSync(path);\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === \"ENOENT\") {\n mkdirSync(path, { recursive: true, mode: 0o700 });\n return;\n }\n console.error(`Error: cannot access --state-dir ${path}: ${(err as Error).message}`);\n process.exit(1);\n }\n\n if (!stat.isDirectory()) {\n console.error(`Error: --state-dir ${path} exists but is not a directory`);\n process.exit(1);\n }\n\n if (stat.mode & WORLD_WRITABLE_MODE) {\n console.error(\n `Error: --state-dir ${path} is world-writable (mode ${(stat.mode & 0o777).toString(8)}). ` +\n `Credentials stored there would be exposed to other local users. ` +\n `Fix with: chmod 0700 ${path}`,\n );\n process.exit(1);\n }\n\n const euid = typeof process.geteuid === \"function\" ? process.geteuid() : undefined;\n if (euid !== undefined && stat.uid !== euid) {\n console.error(\n `Error: --state-dir ${path} is owned by uid ${stat.uid} but mikan is running as uid ${euid}. ` +\n `Run mikan as the directory owner or point --state-dir at a directory you own.`,\n );\n process.exit(1);\n }\n}\n\nfunction handleStartupError(error: unknown): never {\n if (error instanceof SandboxError) {\n for (const line of error.formatForCli()) {\n console.error(line);\n }\n process.exit(1);\n }\n if (error instanceof MissingGlobalSettingsError) {\n console.error(`Missing global settings: ${error.settingsPath}`);\n console.error(\"\");\n console.error(\"Run onboarding to create it:\");\n console.error(` mikan --onboard --state-dir ${stateDir}`);\n console.error(\"\");\n console.error(\"Then review the generated settings.json and start mikan again.\");\n process.exit(1);\n }\n if (error instanceof Error) {\n console.error(`Error: ${error.message}`);\n process.exit(1);\n }\n console.error(String(error));\n process.exit(1);\n}\n\nlet plan: BootPlan;\ntry {\n plan = resolveBoot();\n} catch (error) {\n handleStartupError(error);\n}\n\n// `mikan ext …` manages extensions and exits; handle it before the normal\n// bot-mode startup (which requires platform tokens).\nif (plan.mode === \"ext\") {\n const code = await runExtCommand(plan.extArgs ?? []);\n process.exit(code);\n}\n\n// Global fetch: proxy support (HTTP_PROXY/HTTPS_PROXY/NO_PROXY) and idle\n// timeouts so a stalled LLM stream errors out instead of hanging a session.\nconst httpIdleTimeoutMs = parseHttpIdleTimeoutMs(readEnv(\"HTTP_IDLE_TIMEOUT\"));\nconfigureHttpDispatcher(httpIdleTimeoutMs);\n\nif (plan.mode === \"help\") {\n console.log(helpText());\n process.exit(0);\n}\n\nif (plan.mode === \"env\") {\n console.log(envReport());\n process.exit(0);\n}\n\nif (plan.mode === \"version\") {\n console.log(getVersion());\n process.exit(0);\n}\n\n// Handle --onboard mode\nif (plan.mode === \"onboard\") {\n const stateDir = plan.stateDir;\n setEnvAliases(\"STATE_DIR\", stateDir);\n ensureSecureStateDir(stateDir);\n try {\n const settingsPath = createGlobalSettingsFile(stateDir);\n console.log(`Created global settings at ${settingsPath}`);\n console.log(\n `Review the file, then start mikan (workspace defaults to ${join(stateDir, \"workspace\")}).`,\n );\n process.exit(0);\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n}\n\n// Handle --download mode (Slack only)\nif (plan.mode === \"download\" && plan.downloadChannel) {\n if (!SLACK_BOT_TOKEN) {\n console.error(\"Missing env: SLACK_BOT_TOKEN\");\n process.exit(1);\n }\n await downloadChannel(plan.downloadChannel, SLACK_BOT_TOKEN);\n process.exit(0);\n}\n\n// Normal bot mode - working dir is optional and defaults under the state dir\nconst sandbox = plan.sandbox;\nconst stateDir = plan.stateDir;\nconst workingDir = plan.workingDir;\nsetEnvAliases(\"STATE_DIR\", stateDir);\nensureSecureStateDir(stateDir);\nif (!plan.workingDirExplicit) {\n ensureDirExists(workingDir);\n}\ntry {\n assertStateDirOutsideWorkspace(stateDir, workingDir, sandbox.type);\n} catch (error) {\n handleStartupError(error);\n}\n\n// Validate platform tokens — activation rules live in the env manifest.\nconst hasSlack = platformIsActive(\"slack\");\nconst hasTelegram = platformIsActive(\"telegram\");\nconst hasDiscord = platformIsActive(\"discord\");\nconst hasGithub = platformIsActive(\"github\");\n\nif (!hasSlack && !hasTelegram && !hasDiscord && !hasGithub) {\n console.error(noPlatformsMessage());\n process.exit(1);\n}\n\ntry {\n await validateSandbox(sandbox);\n} catch (error) {\n handleStartupError(error);\n}\n\nconst vaultManager = new FileVaultManager(stateDir);\nif (vaultManager.isEnabled()) {\n console.log(\n sandbox.type === \"container\"\n ? \" Vault system enabled. Container vault active.\"\n : sandbox.type === \"image\" ||\n sandbox.type === \"agent-sandbox\" ||\n sandbox.type === \"cloudflare\"\n ? \" Vault system enabled. Conversation-scoped credential routing active.\"\n : \" Vault system enabled. Host mode will not inject vault env.\",\n );\n}\n\nconst startupConfig = (() => {\n try {\n return loadGlobalSettings();\n } catch (error) {\n handleStartupError(error);\n }\n})();\nconst sandboxSettings = startupConfig.sandbox;\nif (sandbox.type === \"agent-sandbox\") {\n const settings = sandboxSettings?.agentSandbox;\n if (!settings) {\n handleStartupError(\n new SandboxError(\n \"Error: agent-sandbox requires sandbox.agentSandbox settings with namespace and runtimeClassName\",\n ),\n );\n }\n configureAgentSandboxRuntime(settings);\n}\nconst sandboxLimits =\n sandboxSettings?.cpus || sandboxSettings?.memory\n ? { cpus: sandboxSettings?.cpus, memory: sandboxSettings?.memory }\n : undefined;\nconst sandboxBoostLimits =\n sandboxSettings?.boost?.cpus || sandboxSettings?.boost?.memory\n ? { cpus: sandboxSettings?.boost?.cpus, memory: sandboxSettings?.boost?.memory }\n : undefined;\n\nconst provisioner =\n sandbox.type === \"image\"\n ? new DockerContainerManager(sandbox.image, {\n limits: sandboxLimits,\n boostLimits: sandboxBoostLimits,\n })\n : undefined;\nconst resourceController = sandbox.type === \"image\" ? provisioner : undefined;\n\nif (sandbox.type === \"image\" || sandbox.type === \"agent-sandbox\") {\n ensureDirExists(join(workingDir, \"skills\"));\n ensureDirExists(join(workingDir, \"events\"));\n try {\n writeFileSync(join(workingDir, \"MEMORY.md\"), \"\", { flag: \"wx\" });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"EEXIST\") throw err;\n }\n}\n\nconst linkTokenStore = new InMemoryLinkTokenStore();\nconst sessionViewTokenStore = new InMemorySessionViewTokenStore();\nconst adminTokenStore = new InMemoryAdminTokenStore();\nsetInterval(() => linkTokenStore.purge(), 5 * 60 * 1000).unref();\nsetInterval(() => sessionViewTokenStore.purge(), 5 * 60 * 1000).unref();\nsetInterval(() => adminTokenStore.purge(), 5 * 60 * 1000).unref();\n\nfunction portalBaseUrl(): string | undefined {\n if (LINK_BASE_URL) return LINK_BASE_URL;\n if (LINK_PORT) return `http://localhost:${LINK_PORT}`;\n return undefined;\n}\n/** Idle timeout for managed sandboxes (10 minutes) */\nconst MANAGED_SANDBOX_IDLE_TIMEOUT_MS = 10 * 60 * 1000;\n\nif (provisioner) {\n await provisioner.reconcile();\n await provisioner.stopIdle(MANAGED_SANDBOX_IDLE_TIMEOUT_MS);\n setInterval(\n () => provisioner.stopIdle(MANAGED_SANDBOX_IDLE_TIMEOUT_MS),\n MANAGED_SANDBOX_IDLE_TIMEOUT_MS,\n ).unref();\n}\n\nif (sandbox.type === \"agent-sandbox\") {\n await stopIdleAgentSandboxes(MANAGED_SANDBOX_IDLE_TIMEOUT_MS);\n setInterval(\n () => void stopIdleAgentSandboxes(MANAGED_SANDBOX_IDLE_TIMEOUT_MS),\n MANAGED_SANDBOX_IDLE_TIMEOUT_MS,\n ).unref();\n}\nconst botsByPlatform: Record<string, MessagingBot> = {};\n\n/**\n * Resolve which platform bot to use: an explicit platform, or the sole\n * running one. Mirrors event-file platform resolution.\n */\nfunction resolvePlatformBot(op: string, platform: string | undefined): [string, MessagingBot] {\n const available = Object.keys(botsByPlatform);\n const key = platform?.trim().toLowerCase() || (available.length === 1 ? available[0] : undefined);\n const bot = key ? botsByPlatform[key] : undefined;\n if (!bot) {\n throw new Error(\n platform\n ? `${op}: unknown platform '${platform}' (available: ${available.join(\", \") || \"none\"})`\n : `${op}: multiple platforms active (${available.join(\", \")}); specify platform`,\n );\n }\n return [key!, bot];\n}\n\n/** Extension `api.notify` backend: post into a conversation without a run. */\nconst platformNotifier: PlatformNotifier = async (conversationId, text, platform) => {\n const [key, bot] = resolvePlatformBot(\"notify\", platform);\n await bot.postMessage(conversationId, text);\n log.logInfo(`[notify] posted to ${key}/${conversationId} (${text.length} chars)`);\n};\n\n/** Extension `api.react` backend: add a reaction to a message. */\nconst platformReactor: PlatformReactor = async (conversationId, messageTs, emoji, platform) => {\n const [key, bot] = resolvePlatformBot(\"react\", platform);\n if (!bot.addReaction) {\n throw new Error(`react: platform '${key}' does not support reactions`);\n }\n await bot.addReaction(conversationId, messageTs, emoji);\n log.logInfo(`[react] :${emoji}: on ${key}/${conversationId}`);\n};\n\n/** Extension `api.uploadFile` backend: send a host file into a conversation. */\nconst platformUploader: PlatformUploader = async (conversationId, filePath, title, platform) => {\n const [key, bot] = resolvePlatformBot(\"upload\", platform);\n if (!bot.uploadFile) {\n throw new Error(`upload: platform '${key}' does not support file uploads`);\n }\n await bot.uploadFile(conversationId, filePath, title);\n log.logInfo(`[upload] ${filePath} to ${key}/${conversationId}`);\n};\n\n/** github_* tool backends: PR push/create and CI checks, host-side. */\nfunction requireGithubBot(op: string): GithubMessagingBot {\n const bot = botsByPlatform.github as GithubMessagingBot | undefined;\n if (!bot) {\n throw new Error(`${op}: the GitHub platform is not running`);\n }\n return bot;\n}\n\n/**\n * Platform capability pack factories — only when the corresponding bot is\n * configured. Factories, not instances: each runner materializes its own\n * pack so per-run bind state never crosses conversations.\n */\nfunction buildPlatformToolPackFactories(): PlatformToolPackFactory[] {\n if (!hasGithub) return [];\n const platformGithubOps: PlatformGithubOps = {\n pushAndCreatePr: (conversationId, request) =>\n requireGithubBot(\"github_pr\").ops.pushAndCreatePr(conversationId, request),\n getChecks: (conversationId, branch) =>\n requireGithubBot(\"github_checks\").ops.getChecks(conversationId, branch),\n getJobLog: (conversationId, jobId) =>\n requireGithubBot(\"github_checks\").ops.getJobLog(conversationId, jobId),\n getBuildLog: (conversationId, buildId) =>\n requireGithubBot(\"github_checks\").ops.getBuildLog(conversationId, buildId),\n replyToReviewThread: (conversationId, commentId, body) =>\n requireGithubBot(\"github_review_reply\").ops.replyToReviewThread(\n conversationId,\n commentId,\n body,\n ),\n syncRepo: (conversationId, branch) =>\n requireGithubBot(\"github_sync\").ops.syncRepo(conversationId, branch),\n readGithub: (conversationId, request) =>\n requireGithubBot(\"github_read\").ops.readGithub(conversationId, request),\n manageIssue: (conversationId, request) =>\n requireGithubBot(\"github_issue\").ops.manageIssue(conversationId, request),\n };\n return [() => createGithubToolPack(platformGithubOps)];\n}\n\nconst handler = createConversationRuntime({\n workingDir,\n sandbox,\n vaultManager,\n provisioner,\n resourceController,\n linkTokenStore,\n sessionViewTokenStore,\n adminTokenStore,\n portalBaseUrl: portalBaseUrl(),\n platformNotifier,\n platformReactor,\n platformUploader,\n platformToolPackFactories: buildPlatformToolPackFactories(),\n});\n\nconst sandboxDesc =\n sandbox.type === \"host\"\n ? \"host\"\n : sandbox.type === \"container\"\n ? `container:${sandbox.container}`\n : sandbox.type === \"image\"\n ? `image:${sandbox.image}`\n : sandbox.type === \"agent-sandbox\"\n ? `agent-sandbox:${sandbox.warmpool}`\n : `cloudflare:${sandbox.sandboxId}`;\nlog.logStartup(workingDir, sandboxDesc);\nlogHarnessStartupSummary();\n\n/**\n * One-look confirmation of the harness runtime surface, aimed at upgrade\n * verification: config moved from ~/.pi to ~/.mikan with no fallback, so a\n * missing auth.json here is the first thing to check when runs fail.\n */\nfunction logHarnessStartupSummary(): void {\n const proxy =\n process.env.HTTPS_PROXY ??\n process.env.https_proxy ??\n process.env.HTTP_PROXY ??\n process.env.http_proxy;\n log.logInfo(\n `HTTP dispatcher: idle timeout ${httpIdleTimeoutMs}ms${proxy ? `, proxy ${proxy}` : \", no proxy\"}`,\n );\n\n const authPath = defaultAuthPath();\n if (existsSync(authPath)) {\n try {\n const providers = Object.keys(JSON.parse(readFileSync(authPath, \"utf-8\")) as object);\n log.logInfo(`Harness auth: ${authPath} (providers: ${providers.join(\", \") || \"none\"})`);\n } catch {\n log.logWarning(`Harness auth: ${authPath} exists but is not valid JSON`);\n }\n } else {\n log.logInfo(`Harness auth: ${authPath} missing — provider keys come from env vars only`);\n }\n\n const modelsPath = defaultModelsJsonPath();\n log.logInfo(\n existsSync(modelsPath)\n ? `Harness models.json: ${modelsPath}`\n : `Harness models.json: none (${modelsPath}) — built-in providers only`,\n );\n}\n\nif (hasSlack) {\n const slackMessagingBotToken = SLACK_BOT_TOKEN;\n const slackAppToken = SLACK_APP_TOKEN;\n if (!slackMessagingBotToken || !slackAppToken) {\n throw new Error(\"Slack startup requires both SLACK_APP_TOKEN and SLACK_BOT_TOKEN\");\n }\n const sharedStore = new ChannelStore({ workingDir, botToken: slackMessagingBotToken });\n const slackMessagingBot = new SlackMessagingBotClass(handler, {\n appToken: slackAppToken,\n botToken: slackMessagingBotToken,\n workingDir,\n store: sharedStore,\n });\n botsByPlatform.slack = slackMessagingBot;\n log.logInfo(\"Platform: Slack\");\n}\nif (hasTelegram) {\n const telegramToken = TELEGRAM_BOT_TOKEN;\n if (!telegramToken) {\n throw new Error(\"Telegram startup requires TELEGRAM_BOT_TOKEN\");\n }\n const telegramMessagingBot = new TelegramMessagingBot(handler, {\n token: telegramToken,\n workingDir,\n });\n botsByPlatform.telegram = telegramMessagingBot;\n log.logInfo(\"Platform: Telegram\");\n}\nif (hasDiscord) {\n const discordToken = DISCORD_BOT_TOKEN;\n if (!discordToken) {\n throw new Error(\"Discord startup requires DISCORD_BOT_TOKEN\");\n }\n const discordMessagingBot = new DiscordMessagingBot(handler, {\n token: discordToken,\n workingDir,\n });\n botsByPlatform.discord = discordMessagingBot;\n log.logInfo(\"Platform: Discord\");\n}\nif (hasGithub) {\n if (!GITHUB_APP_ID || !GITHUB_INSTALLATION_ID) {\n throw new Error(\"GitHub startup requires GITHUB_APP_ID and GITHUB_INSTALLATION_ID\");\n }\n // Env vars flatten PEM newlines to literal `\\n`; a key file avoids that.\n const githubPrivateKey = GITHUB_APP_PRIVATE_KEY_PATH\n ? readFileSync(GITHUB_APP_PRIVATE_KEY_PATH, \"utf-8\")\n : GITHUB_APP_PRIVATE_KEY?.replace(/\\\\n/g, \"\\n\");\n if (!githubPrivateKey) {\n throw new Error(\n \"GitHub startup requires GITHUB_APP_PRIVATE_KEY or GITHUB_APP_PRIVATE_KEY_PATH\",\n );\n }\n const pollIntervalSeconds = GITHUB_POLL_INTERVAL ? parseInt(GITHUB_POLL_INTERVAL, 10) : NaN;\n const githubMessagingBot = new GithubMessagingBot(handler, {\n appId: GITHUB_APP_ID,\n privateKey: githubPrivateKey,\n installationId: GITHUB_INSTALLATION_ID,\n repos: GITHUB_REPOS\n ? GITHUB_REPOS.split(\",\")\n .map((repo) => repo.trim())\n .filter(Boolean)\n : [],\n pollIntervalMs:\n (Number.isFinite(pollIntervalSeconds) && pollIntervalSeconds > 0 ? pollIntervalSeconds : 60) *\n 1000,\n workingDir,\n syncStatePath: join(stateDir, \"github-sync.json\"),\n // Host-side GCP creds (e.g. a WIF external_account file) unlock Cloud\n // Build logs in github_checks; without them external CI degrades to\n // guidance text. Credentials never enter the sandbox.\n cloudBuild: GOOGLE_APPLICATION_CREDENTIALS\n ? {\n tokenProvider: new GcpTokenProvider({\n credentialsPath: GOOGLE_APPLICATION_CREDENTIALS,\n }),\n projectFallback: GOOGLE_CLOUD_PROJECT,\n }\n : undefined,\n });\n botsByPlatform.github = githubMessagingBot;\n log.logInfo(\n `Platform: GitHub${GOOGLE_APPLICATION_CREDENTIALS ? \" (Cloud Build logs enabled)\" : \"\"}`,\n );\n}\n\nif (LINK_PORT) {\n startWebServer({\n port: LINK_PORT,\n linkTokenStore,\n vaultManager,\n notify: async (platform, conversationId, message) => {\n const bot = botsByPlatform[platform];\n if (bot) await bot.postMessage(conversationId, message);\n },\n sessionViewTokenStore,\n sessionViewInteractive: { handler, botsByPlatform },\n adminOptions: { adminTokenStore, workingDir, runtime: handler, sandbox, botsByPlatform },\n });\n}\n\n// Start events watcher with explicit platform routing\nconst eventsWatcher = new EventsWatcher(join(workingDir, \"events\"), botsByPlatform);\nconst slackMessagingBot = botsByPlatform.slack as SlackMessagingBotClass | undefined;\nif (slackMessagingBot) {\n slackMessagingBot.setEventsWatcher(eventsWatcher);\n}\neventsWatcher.start();\n\n// Handle shutdown\nasync function shutdown(): Promise<void> {\n await handler.shutdown();\n if (sandbox.type === \"agent-sandbox\") await shutdownAgentSandboxes();\n eventsWatcher.stop();\n await Sentry.close(5000);\n process.exit(0);\n}\n\nprocess.on(\"SIGINT\", shutdown);\nprocess.on(\"SIGTERM\", shutdown);\n\n// Start all bots\nawait Promise.all(\n Object.values(botsByPlatform).map((bot) =>\n bot.start().catch((err) => {\n log.logWarning(\"Failed to start bot\", err instanceof Error ? err.message : String(err));\n process.exit(1);\n }),\n ),\n);\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-runtime.d.ts","sourceRoot":"","sources":["../../src/runtime/conversation-runtime.ts"],"names":[],"mappings":"AAkCA,YAAY,EACV,iBAAiB,EACjB,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAEV,mBAAmB,EACnB,0BAA0B,EAE3B,MAAM,YAAY,CAAC;AA8BpB,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,0BAA0B,GAClC,mBAAmB,CAErB"}
1
+ {"version":3,"file":"conversation-runtime.d.ts","sourceRoot":"","sources":["../../src/runtime/conversation-runtime.ts"],"names":[],"mappings":"AAsCA,YAAY,EACV,iBAAiB,EACjB,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAEV,mBAAmB,EACnB,0BAA0B,EAE3B,MAAM,YAAY,CAAC;AA2BpB,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,0BAA0B,GAClC,mBAAmB,CAErB"}