@asm-agent/coding-agent 0.8.7 → 0.9.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 (195) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +2 -7
  3. package/dist/asm-agent-runtime/src/__pycache__/asm_cm_driver.cpython-313.pyc +0 -0
  4. package/dist/asm-agent-runtime/src/__pycache__/phase76_address_head.cpython-313.pyc +0 -0
  5. package/dist/asm-agent-runtime/src/rlm/__init__.py +1 -1
  6. package/dist/asm-agent-runtime/src/rlm/__pycache__/__init__.cpython-312.pyc +0 -0
  7. package/dist/asm-agent-runtime/src/rlm/__pycache__/__init__.cpython-313.pyc +0 -0
  8. package/dist/asm-agent-runtime/src/rlm/__pycache__/_winjob.cpython-313.pyc +0 -0
  9. package/dist/asm-agent-runtime/src/rlm/__pycache__/bash.cpython-312.pyc +0 -0
  10. package/dist/asm-agent-runtime/src/rlm/__pycache__/bash.cpython-313.pyc +0 -0
  11. package/dist/asm-agent-runtime/src/rlm/__pycache__/harness.cpython-313.pyc +0 -0
  12. package/dist/asm-agent-runtime/src/rlm/__pycache__/mcp.cpython-312.pyc +0 -0
  13. package/dist/asm-agent-runtime/src/rlm/__pycache__/mcp.cpython-313.pyc +0 -0
  14. package/dist/asm-agent-runtime/src/rlm/__pycache__/mcp_base.cpython-312.pyc +0 -0
  15. package/dist/asm-agent-runtime/src/rlm/__pycache__/mcp_base.cpython-313.pyc +0 -0
  16. package/dist/asm-agent-runtime/src/rlm/__pycache__/repl.cpython-312.pyc +0 -0
  17. package/dist/asm-agent-runtime/src/rlm/__pycache__/repl.cpython-313.pyc +0 -0
  18. package/dist/asm-agent-runtime/src/rlm/__pycache__/skill.cpython-313.pyc +0 -0
  19. package/dist/asm-agent-runtime/src/rlm/bash.py +94 -31
  20. package/dist/asm-agent-runtime/src/rlm/repl.md +3 -3
  21. package/dist/asm-agent-runtime/src/rlm/repl.py +46 -45
  22. package/dist/asm-agent-runtime/test/__pycache__/test_agent_message_skill.cpython-313.pyc +0 -0
  23. package/dist/asm-agent-runtime/test/__pycache__/test_bash.cpython-313.pyc +0 -0
  24. package/dist/asm-agent-runtime/test/__pycache__/test_harness.cpython-313.pyc +0 -0
  25. package/dist/asm-agent-runtime/test/__pycache__/test_mcp.cpython-313.pyc +0 -0
  26. package/dist/asm-agent-runtime/test/__pycache__/test_mcp_base.cpython-313.pyc +0 -0
  27. package/dist/asm-agent-runtime/test/__pycache__/test_repl.cpython-313.pyc +0 -0
  28. package/dist/asm-agent-runtime/test/__pycache__/test_subagent_registry.cpython-313.pyc +0 -0
  29. package/dist/asm-agent-runtime/test/__pycache__/test_winjob.cpython-313.pyc +0 -0
  30. package/dist/asm-agent-runtime/test/test_bash.py +74 -19
  31. package/dist/asm-agent-runtime/test/test_repl.py +67 -3
  32. package/dist/asm-agent-runtime/uv.lock +446 -155
  33. package/dist/bundle/{anthropic-XSMQHGYB.js → anthropic-ZOZNPFXS.js} +2 -2
  34. package/dist/bundle/{azure-openai-responses-XLQAIKKH.js → azure-openai-responses-TDHCU647.js} +2 -2
  35. package/dist/bundle/{bundled-modules-5OCN73BM.js → bundled-modules-Q2YODC4B.js} +3 -3
  36. package/dist/bundle/{chunk-IAQLPSMN.js → chunk-AMKLNEAK.js} +47 -47
  37. package/dist/bundle/{chunk-2LPSALBF.js → chunk-FPY7FFJS.js} +978 -1821
  38. package/dist/bundle/{chunk-E3YE2Q7A.js → chunk-G6SC4YYW.js} +4973 -1926
  39. package/dist/bundle/{chunk-YPNK4MRU.js → chunk-QLHAP3FT.js} +1 -1
  40. package/dist/bundle/{cli-main-QYX5R3LF.js → cli-main-277AG2BR.js} +3 -3
  41. package/dist/bundle/cli.js +1 -1
  42. package/dist/bundle/{google-ZXJEPWJA.js → google-Q3AJWUOY.js} +1 -1
  43. package/dist/bundle/{google-vertex-WAF3RIJ6.js → google-vertex-2CSNOUBS.js} +1 -1
  44. package/dist/bundle/{main-EOUAQCJH.js → main-TNXWJXIU.js} +3 -3
  45. package/dist/bundle/{mistral-GDZXSXRS.js → mistral-XRYJGLLG.js} +1 -1
  46. package/dist/bundle/{openai-codex-responses-7XMPW4LG.js → openai-codex-responses-C6BRO2BN.js} +2 -2
  47. package/dist/bundle/{openai-completions-LNSVGDMF.js → openai-completions-DNXCK2JW.js} +4 -4
  48. package/dist/bundle/{openai-responses-MFZOBMIT.js → openai-responses-BEMWVIXE.js} +2 -2
  49. package/dist/config.d.ts +0 -1
  50. package/dist/config.d.ts.map +1 -1
  51. package/dist/config.js +0 -3
  52. package/dist/config.js.map +1 -1
  53. package/dist/core/agent-session-config.d.ts +1 -2
  54. package/dist/core/agent-session-config.d.ts.map +1 -1
  55. package/dist/core/agent-session-config.js +0 -3
  56. package/dist/core/agent-session-config.js.map +1 -1
  57. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  58. package/dist/core/agent-session-runtime.js +0 -8
  59. package/dist/core/agent-session-runtime.js.map +1 -1
  60. package/dist/core/agent-session-services.d.ts +0 -2
  61. package/dist/core/agent-session-services.d.ts.map +1 -1
  62. package/dist/core/agent-session-services.js +0 -22
  63. package/dist/core/agent-session-services.js.map +1 -1
  64. package/dist/core/agent-session.d.ts +8 -1
  65. package/dist/core/agent-session.d.ts.map +1 -1
  66. package/dist/core/agent-session.js +100 -22
  67. package/dist/core/agent-session.js.map +1 -1
  68. package/dist/core/kernel/bootstrap.d.ts.map +1 -1
  69. package/dist/core/kernel/bootstrap.js +1 -1
  70. package/dist/core/kernel/bootstrap.js.map +1 -1
  71. package/dist/core/kernel/repl-manager.d.ts +32 -8
  72. package/dist/core/kernel/repl-manager.d.ts.map +1 -1
  73. package/dist/core/kernel/repl-manager.js +401 -102
  74. package/dist/core/kernel/repl-manager.js.map +1 -1
  75. package/dist/core/kernel/shared.d.ts +11 -7
  76. package/dist/core/kernel/shared.d.ts.map +1 -1
  77. package/dist/core/kernel/shared.js +2 -5
  78. package/dist/core/kernel/shared.js.map +1 -1
  79. package/dist/core/mcp/mcp-manager.d.ts +4 -2
  80. package/dist/core/mcp/mcp-manager.d.ts.map +1 -1
  81. package/dist/core/mcp/mcp-manager.js +9 -7
  82. package/dist/core/mcp/mcp-manager.js.map +1 -1
  83. package/dist/core/model-registry.d.ts.map +1 -1
  84. package/dist/core/model-registry.js +1 -1
  85. package/dist/core/model-registry.js.map +1 -1
  86. package/dist/core/ollama-models.d.ts +3 -1
  87. package/dist/core/ollama-models.d.ts.map +1 -1
  88. package/dist/core/ollama-models.js +31 -10
  89. package/dist/core/ollama-models.js.map +1 -1
  90. package/dist/core/prime-inference-auth.d.ts +0 -9
  91. package/dist/core/prime-inference-auth.d.ts.map +1 -1
  92. package/dist/core/prime-inference-auth.js +0 -50
  93. package/dist/core/prime-inference-auth.js.map +1 -1
  94. package/dist/core/provider-display-names.d.ts.map +1 -1
  95. package/dist/core/provider-display-names.js +0 -1
  96. package/dist/core/provider-display-names.js.map +1 -1
  97. package/dist/core/session-manager.d.ts +0 -4
  98. package/dist/core/session-manager.d.ts.map +1 -1
  99. package/dist/core/session-manager.js +0 -22
  100. package/dist/core/session-manager.js.map +1 -1
  101. package/dist/core/settings-manager.d.ts +4 -16
  102. package/dist/core/settings-manager.d.ts.map +1 -1
  103. package/dist/core/settings-manager.js +13 -43
  104. package/dist/core/settings-manager.js.map +1 -1
  105. package/dist/core/slash-commands.d.ts.map +1 -1
  106. package/dist/core/slash-commands.js +0 -5
  107. package/dist/core/slash-commands.js.map +1 -1
  108. package/dist/core/tools/acp-mcp.d.ts +6 -0
  109. package/dist/core/tools/acp-mcp.d.ts.map +1 -0
  110. package/dist/core/tools/acp-mcp.js +86 -0
  111. package/dist/core/tools/acp-mcp.js.map +1 -0
  112. package/dist/core/tools/index.d.ts +1 -0
  113. package/dist/core/tools/index.d.ts.map +1 -1
  114. package/dist/core/tools/index.js +1 -0
  115. package/dist/core/tools/index.js.map +1 -1
  116. package/dist/core/tools/ipython.d.ts.map +1 -1
  117. package/dist/core/tools/ipython.js +9 -4
  118. package/dist/core/tools/ipython.js.map +1 -1
  119. package/dist/main.d.ts.map +1 -1
  120. package/dist/main.js +2 -11
  121. package/dist/main.js.map +1 -1
  122. package/dist/modes/acp/acp-mode.d.ts.map +1 -1
  123. package/dist/modes/acp/acp-mode.js +1 -1
  124. package/dist/modes/acp/acp-mode.js.map +1 -1
  125. package/dist/modes/agent-connection/daemon-agent-connection.d.ts +0 -2
  126. package/dist/modes/agent-connection/daemon-agent-connection.d.ts.map +1 -1
  127. package/dist/modes/agent-connection/daemon-agent-connection.js +0 -2
  128. package/dist/modes/agent-connection/daemon-agent-connection.js.map +1 -1
  129. package/dist/modes/agents-view/agents-view-mode.d.ts.map +1 -1
  130. package/dist/modes/agents-view/agents-view-mode.js +0 -19
  131. package/dist/modes/agents-view/agents-view-mode.js.map +1 -1
  132. package/dist/modes/daemon/daemon-mode.d.ts +1 -10
  133. package/dist/modes/daemon/daemon-mode.d.ts.map +1 -1
  134. package/dist/modes/daemon/daemon-mode.js +134 -274
  135. package/dist/modes/daemon/daemon-mode.js.map +1 -1
  136. package/dist/modes/daemon/daemon-protocol.d.ts +11 -5
  137. package/dist/modes/daemon/daemon-protocol.d.ts.map +1 -1
  138. package/dist/modes/daemon/daemon-protocol.js +6 -8
  139. package/dist/modes/daemon/daemon-protocol.js.map +1 -1
  140. package/dist/modes/daemon/daemon-supervisor.d.ts +0 -3
  141. package/dist/modes/daemon/daemon-supervisor.d.ts.map +1 -1
  142. package/dist/modes/daemon/daemon-supervisor.js +18 -52
  143. package/dist/modes/daemon/daemon-supervisor.js.map +1 -1
  144. package/dist/modes/daemon/daemon-worker-protocol.d.ts +1 -6
  145. package/dist/modes/daemon/daemon-worker-protocol.d.ts.map +1 -1
  146. package/dist/modes/daemon/daemon-worker-protocol.js +0 -2
  147. package/dist/modes/daemon/daemon-worker-protocol.js.map +1 -1
  148. package/dist/modes/interactive/auth-flows.d.ts +0 -2
  149. package/dist/modes/interactive/auth-flows.d.ts.map +1 -1
  150. package/dist/modes/interactive/auth-flows.js +1 -101
  151. package/dist/modes/interactive/auth-flows.js.map +1 -1
  152. package/dist/modes/interactive/components/assistant-message.d.ts +6 -1
  153. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  154. package/dist/modes/interactive/components/assistant-message.js +13 -3
  155. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  156. package/dist/modes/interactive/components/footer.d.ts +1 -1
  157. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  158. package/dist/modes/interactive/components/footer.js +2 -2
  159. package/dist/modes/interactive/components/footer.js.map +1 -1
  160. package/dist/modes/interactive/components/mermaid.d.ts +12 -0
  161. package/dist/modes/interactive/components/mermaid.d.ts.map +1 -0
  162. package/dist/modes/interactive/components/mermaid.js +63 -0
  163. package/dist/modes/interactive/components/mermaid.js.map +1 -0
  164. package/dist/modes/interactive/components/settings-selector.d.ts +3 -1
  165. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  166. package/dist/modes/interactive/components/settings-selector.js +10 -0
  167. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  168. package/dist/modes/interactive/feature-hints.d.ts.map +1 -1
  169. package/dist/modes/interactive/feature-hints.js +0 -4
  170. package/dist/modes/interactive/feature-hints.js.map +1 -1
  171. package/dist/modes/interactive/interactive-mode.d.ts +1 -7
  172. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  173. package/dist/modes/interactive/interactive-mode.js +23 -279
  174. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  175. package/dist/utils/version-check.d.ts.map +1 -1
  176. package/dist/utils/version-check.js +1 -1
  177. package/dist/utils/version-check.js.map +1 -1
  178. package/docs/settings.md +1 -31
  179. package/docs/usage.md +1 -4
  180. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  181. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  182. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  183. package/examples/extensions/sandbox/package-lock.json +2 -2
  184. package/examples/extensions/sandbox/package.json +1 -1
  185. package/examples/extensions/with-deps/package-lock.json +2 -2
  186. package/examples/extensions/with-deps/package.json +1 -1
  187. package/package.json +6 -5
  188. package/dist/core/agent-traces.d.ts +0 -130
  189. package/dist/core/agent-traces.d.ts.map +0 -1
  190. package/dist/core/agent-traces.js +0 -746
  191. package/dist/core/agent-traces.js.map +0 -1
  192. package/dist/core/telemetry.d.ts +0 -92
  193. package/dist/core/telemetry.d.ts.map +0 -1
  194. package/dist/core/telemetry.js +0 -633
  195. package/dist/core/telemetry.js.map +0 -1
@@ -15,7 +15,7 @@ import {
15
15
  } from "./chunk-GG7GAQ5N.js";
16
16
  import {
17
17
  calculateCost
18
- } from "./chunk-IAQLPSMN.js";
18
+ } from "./chunk-AMKLNEAK.js";
19
19
 
20
20
  // ../ai/src/providers/openai-responses-shared.ts
21
21
  function encodeTextSignatureV1(id, phase) {
@@ -7,7 +7,7 @@ import {
7
7
  isOwnedSessionWorkerProcess,
8
8
  maybeRunOwnedSessionWorkerFrontend,
9
9
  maybeStartDaemonEarly
10
- } from "./chunk-2LPSALBF.js";
10
+ } from "./chunk-FPY7FFJS.js";
11
11
  import "./chunk-5QCJ5DQU.js";
12
12
  import "./chunk-CMMSLBAW.js";
13
13
  import "./chunk-2T7M7VJ4.js";
@@ -15,7 +15,7 @@ import "./chunk-UIRUOAIQ.js";
15
15
  import "./chunk-HXOBFFJX.js";
16
16
  import "./chunk-6GUVYK6P.js";
17
17
  import "./chunk-UPDAFKL5.js";
18
- import "./chunk-IAQLPSMN.js";
18
+ import "./chunk-AMKLNEAK.js";
19
19
  import "./chunk-BAWSWWEU.js";
20
20
 
21
21
  // dist/cli-main.js
@@ -182,7 +182,7 @@ async function runCli() {
182
182
  }
183
183
  const [{ EnvHttpProxyAgent, setGlobalDispatcher }, { main }] = await Promise.all([
184
184
  import("undici"),
185
- import("./main-EOUAQCJH.js")
185
+ import("./main-TNXWJXIU.js")
186
186
  ]);
187
187
  setGlobalDispatcher(new EnvHttpProxyAgent({ bodyTimeout: 0, headersTimeout: 0 }));
188
188
  try {
@@ -49,6 +49,6 @@ var supported = assertNodeVersion({
49
49
  exit: (code) => process.exit(code)
50
50
  });
51
51
  if (supported) {
52
- const { runCli } = await import("./cli-main-QYX5R3LF.js");
52
+ const { runCli } = await import("./cli-main-277AG2BR.js");
53
53
  await runCli();
54
54
  }
@@ -25,7 +25,7 @@ import {
25
25
  AssistantMessageEventStream,
26
26
  calculateCost,
27
27
  clampThinkingLevel
28
- } from "./chunk-IAQLPSMN.js";
28
+ } from "./chunk-AMKLNEAK.js";
29
29
  import "./chunk-BAWSWWEU.js";
30
30
 
31
31
  // ../ai/src/providers/google.ts
@@ -24,7 +24,7 @@ import {
24
24
  AssistantMessageEventStream,
25
25
  calculateCost,
26
26
  clampThinkingLevel
27
- } from "./chunk-IAQLPSMN.js";
27
+ } from "./chunk-AMKLNEAK.js";
28
28
  import "./chunk-BAWSWWEU.js";
29
29
 
30
30
  // ../ai/src/providers/google-vertex.ts
@@ -17,8 +17,8 @@ import {
17
17
  shouldUseDaemonClientRuntime,
18
18
  shouldUseDaemonInteractive,
19
19
  shouldUseEphemeralSessionManagerForDaemonInteractive
20
- } from "./chunk-E3YE2Q7A.js";
21
- import "./chunk-2LPSALBF.js";
20
+ } from "./chunk-G6SC4YYW.js";
21
+ import "./chunk-FPY7FFJS.js";
22
22
  import "./chunk-VWR3YFK5.js";
23
23
  import "./chunk-N2CSAETN.js";
24
24
  import "./chunk-5QCJ5DQU.js";
@@ -28,7 +28,7 @@ import "./chunk-UIRUOAIQ.js";
28
28
  import "./chunk-HXOBFFJX.js";
29
29
  import "./chunk-6GUVYK6P.js";
30
30
  import "./chunk-UPDAFKL5.js";
31
- import "./chunk-IAQLPSMN.js";
31
+ import "./chunk-AMKLNEAK.js";
32
32
  import "./chunk-BAWSWWEU.js";
33
33
  export {
34
34
  createSessionManager,
@@ -84,7 +84,7 @@ import {
84
84
  AssistantMessageEventStream,
85
85
  calculateCost,
86
86
  clampThinkingLevel
87
- } from "./chunk-IAQLPSMN.js";
87
+ } from "./chunk-AMKLNEAK.js";
88
88
  import "./chunk-BAWSWWEU.js";
89
89
 
90
90
  // ../../node_modules/@mistralai/mistralai/esm/lib/url.js
@@ -6,7 +6,7 @@ import {
6
6
  convertResponsesMessages,
7
7
  convertResponsesTools,
8
8
  processResponsesStream
9
- } from "./chunk-YPNK4MRU.js";
9
+ } from "./chunk-QLHAP3FT.js";
10
10
  import "./chunk-NQB5DCFC.js";
11
11
  import {
12
12
  headersToRecord
@@ -26,7 +26,7 @@ import {
26
26
  import {
27
27
  AssistantMessageEventStream,
28
28
  clampThinkingLevel
29
- } from "./chunk-IAQLPSMN.js";
29
+ } from "./chunk-AMKLNEAK.js";
30
30
  import "./chunk-BAWSWWEU.js";
31
31
 
32
32
  // ../ai/src/providers/openai-codex-responses.ts
@@ -31,7 +31,7 @@ import {
31
31
  AssistantMessageEventStream,
32
32
  calculateCost,
33
33
  clampThinkingLevel
34
- } from "./chunk-IAQLPSMN.js";
34
+ } from "./chunk-AMKLNEAK.js";
35
35
  import "./chunk-BAWSWWEU.js";
36
36
 
37
37
  // ../ai/src/providers/openai-completions.ts
@@ -379,7 +379,7 @@ ${rawMetadata}`;
379
379
  return stream;
380
380
  };
381
381
  var streamSimpleOpenAICompletions = (model, context, options) => {
382
- const apiKey = options?.apiKey || getEnvApiKey(model.provider);
382
+ const apiKey = options?.apiKey || getEnvApiKey(model.provider) || (model.provider === "ollama" ? "ollama" : void 0);
383
383
  if (!apiKey) {
384
384
  throw new Error(`No API key for provider: ${model.provider}`);
385
385
  }
@@ -550,7 +550,7 @@ function addCacheControlToSystemPrompt(messages, cacheControl) {
550
550
  function addCacheControlToLastConversationMessage(messages, cacheControl) {
551
551
  for (let i = messages.length - 1; i >= 0; i--) {
552
552
  const message = messages[i];
553
- if (message.role === "user" || message.role === "assistant") {
553
+ if (message.role === "user" || message.role === "assistant" || message.role === "tool") {
554
554
  if (addCacheControlToMessage(message, cacheControl)) {
555
555
  return;
556
556
  }
@@ -568,7 +568,7 @@ function addCacheControlToInstructionMessage(message, cacheControl) {
568
568
  return addCacheControlToTextContent(message, cacheControl);
569
569
  }
570
570
  function addCacheControlToMessage(message, cacheControl) {
571
- if (message.role === "user" || message.role === "assistant") {
571
+ if (message.role === "user" || message.role === "assistant" || message.role === "tool") {
572
572
  return addCacheControlToTextContent(message, cacheControl);
573
573
  }
574
574
  return false;
@@ -9,7 +9,7 @@ import {
9
9
  convertResponsesMessages,
10
10
  convertResponsesTools,
11
11
  processResponsesStream
12
- } from "./chunk-YPNK4MRU.js";
12
+ } from "./chunk-QLHAP3FT.js";
13
13
  import "./chunk-NQB5DCFC.js";
14
14
  import {
15
15
  OpenAI
@@ -32,7 +32,7 @@ import {
32
32
  import {
33
33
  AssistantMessageEventStream,
34
34
  clampThinkingLevel
35
- } from "./chunk-IAQLPSMN.js";
35
+ } from "./chunk-AMKLNEAK.js";
36
36
  import "./chunk-BAWSWWEU.js";
37
37
 
38
38
  // ../ai/src/providers/openai-responses.ts
package/dist/config.d.ts CHANGED
@@ -82,7 +82,6 @@ export declare function getCustomThemesDir(): string;
82
82
  export declare function getLogsDir(): string;
83
83
  /** Log file capturing client-side agent-open failures. */
84
84
  export declare function getClientErrorLogPath(): string;
85
- export declare function getAgentTracesLogPath(): string;
86
85
  /** Shared structured (JSON lines) log for client, daemon, and provider diagnostics. */
87
86
  export declare function getAgentLogPath(): string;
88
87
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawnSync } from \"child_process\";\nimport { createHash } from \"crypto\";\nimport {\n\taccessSync,\n\tappendFileSync,\n\tconstants,\n\texistsSync,\n\tmkdirSync,\n\treadFileSync,\n\trealpathSync,\n\trenameSync,\n\trmSync,\n\tstatSync,\n} from \"fs\";\nimport { homedir } from \"os\";\nimport { basename, dirname, join, resolve, sep, win32 } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { shouldUseWindowsShell } from \"./utils/child-process.js\";\nimport { normalizeSocketPath } from \"./utils/daemon-socket-path.js\";\n\n// =============================================================================\n// Package Detection\n// =============================================================================\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Detect if we're running as a Bun compiled binary.\n * Bun binaries have import.meta.url containing \"$bunfs\", \"~BUN\", or \"%7EBUN\" (Bun's virtual filesystem path)\n */\nexport const isBunBinary =\n\timport.meta.url.includes(\"$bunfs\") || import.meta.url.includes(\"~BUN\") || import.meta.url.includes(\"%7EBUN\");\n\n/** Detect if Bun is the runtime (compiled binary or bun run) */\nexport const isBunRuntime = !!process.versions.bun;\n\nexport const SELF_UPDATE_INTERACTIVE_CHILD_ENV = \"ASM_AGENT_INTERACTIVE_SELF_UPDATE\";\nexport const SELF_UPDATE_NOT_ATTEMPTED_EXIT_CODE = 75;\n\n// =============================================================================\n// Install Method Detection\n// =============================================================================\n\nexport type InstallMethod = \"bun-binary\" | \"homebrew\" | \"npm\" | \"pnpm\" | \"yarn\" | \"bun\" | \"unknown\";\n\ninterface SelfUpdateCommandStep {\n\tcommand: string;\n\targs: string[];\n\tdisplay: string;\n}\n\nexport interface SelfUpdateCommand extends SelfUpdateCommandStep {\n\tsteps?: SelfUpdateCommandStep[];\n}\n\nfunction makeSelfUpdateCommand(\n\tinstallStep: SelfUpdateCommandStep,\n\tuninstallStep?: SelfUpdateCommandStep,\n\toptions: { uninstallAfterInstall?: boolean } = {},\n): SelfUpdateCommand {\n\tif (!uninstallStep) return installStep;\n\tif (options.uninstallAfterInstall) {\n\t\treturn {\n\t\t\t...installStep,\n\t\t\tdisplay: `${installStep.display} && ${uninstallStep.display}`,\n\t\t\tsteps: [installStep, uninstallStep],\n\t\t};\n\t}\n\treturn {\n\t\t...installStep,\n\t\tdisplay: `${uninstallStep.display} && ${installStep.display}`,\n\t\tsteps: [uninstallStep, installStep],\n\t};\n}\n\nfunction makeSelfUpdateCommandStep(command: string, args: string[]): SelfUpdateCommandStep {\n\treturn {\n\t\tcommand,\n\t\targs,\n\t\tdisplay: [command, ...args].map((arg) => (/\\s/.test(arg) ? `\"${arg}\"` : arg)).join(\" \"),\n\t};\n}\n\nexport function detectInstallMethod(): InstallMethod {\n\tif (isBunBinary) {\n\t\treturn \"bun-binary\";\n\t}\n\tif (isHomebrewInstall()) {\n\t\treturn \"homebrew\";\n\t}\n\n\tconst resolvedPath = `${__dirname}\\0${process.execPath || \"\"}`.toLowerCase().replace(/\\\\/g, \"/\");\n\n\tif (resolvedPath.includes(\"/pnpm/\") || resolvedPath.includes(\"/.pnpm/\")) {\n\t\treturn \"pnpm\";\n\t}\n\tif (resolvedPath.includes(\"/yarn/\") || resolvedPath.includes(\"/.yarn/\")) {\n\t\treturn \"yarn\";\n\t}\n\tif (isBunRuntime || resolvedPath.includes(\"/install/global/node_modules/\")) {\n\t\treturn \"bun\";\n\t}\n\tif (resolvedPath.includes(\"/npm/\") || resolvedPath.includes(\"/node_modules/\")) {\n\t\treturn \"npm\";\n\t}\n\n\treturn \"unknown\";\n}\n\nfunction isHomebrewInstall(): boolean {\n\tconst packageDir = getPackageDir().toLowerCase().replace(/\\\\/g, \"/\");\n\treturn packageDir.includes(\"/cellar/\") && packageDir.includes(\"/libexec/lib/node_modules/\");\n}\n\nfunction getInferredNpmInstall(): { root: string; prefix: string } | undefined {\n\tconst packageDir = getPackageDir();\n\tconst path = process.platform === \"win32\" || packageDir.includes(\"\\\\\") ? win32 : { basename, dirname };\n\tconst parent = path.dirname(packageDir);\n\tlet root: string | undefined;\n\tif (path.basename(parent).startsWith(\"@\") && path.basename(path.dirname(parent)) === \"node_modules\") {\n\t\troot = path.dirname(parent);\n\t} else if (path.basename(parent) === \"node_modules\") {\n\t\troot = parent;\n\t}\n\tif (!root) return undefined;\n\tconst rootParent = path.dirname(root);\n\tif (path.basename(rootParent) === \"lib\") return { root, prefix: path.dirname(rootParent) };\n\t// Windows global npm prefixes use `<prefix>\\\\node_modules`, which is\n\t// indistinguishable from local project installs by path shape alone. Do not\n\t// infer unsupported Windows custom prefixes without `npm root -g` evidence.\n\treturn undefined;\n}\n\nfunction isDirectPackageArtifactSpec(updateSpec: string): boolean {\n\tconst spec = updateSpec.trim().toLowerCase();\n\treturn (\n\t\tspec.startsWith(\"http://\") ||\n\t\tspec.startsWith(\"https://\") ||\n\t\tspec.startsWith(\"file:\") ||\n\t\tspec.endsWith(\".tgz\") ||\n\t\tspec.endsWith(\".tar.gz\")\n\t);\n}\n\nfunction getDefaultUpdatePackageName(installedPackageName: string, updateSpec: string): string {\n\tif (isDirectPackageArtifactSpec(updateSpec)) {\n\t\treturn installedPackageName;\n\t}\n\treturn updateSpec;\n}\n\nfunction getSelfUpdateCommandForMethod(\n\tmethod: InstallMethod,\n\tinstalledPackageName: string,\n\tupdateSpec = installedPackageName,\n\tnpmCommand?: string[],\n\tupdatePackageName = getDefaultUpdatePackageName(installedPackageName, updateSpec),\n): SelfUpdateCommand | undefined {\n\tconst uninstallAfterInstall = isDirectPackageArtifactSpec(updateSpec);\n\tswitch (method) {\n\t\tcase \"bun-binary\":\n\t\tcase \"homebrew\":\n\t\t\treturn undefined;\n\t\tcase \"pnpm\":\n\t\t\treturn makeSelfUpdateCommand(\n\t\t\t\tmakeSelfUpdateCommandStep(\"pnpm\", [\"install\", \"-g\", updateSpec]),\n\t\t\t\tupdatePackageName === installedPackageName\n\t\t\t\t\t? undefined\n\t\t\t\t\t: makeSelfUpdateCommandStep(\"pnpm\", [\"remove\", \"-g\", installedPackageName]),\n\t\t\t\t{ uninstallAfterInstall },\n\t\t\t);\n\t\tcase \"yarn\":\n\t\t\treturn makeSelfUpdateCommand(\n\t\t\t\tmakeSelfUpdateCommandStep(\"yarn\", [\"global\", \"add\", updateSpec]),\n\t\t\t\tupdatePackageName === installedPackageName\n\t\t\t\t\t? undefined\n\t\t\t\t\t: makeSelfUpdateCommandStep(\"yarn\", [\"global\", \"remove\", installedPackageName]),\n\t\t\t\t{ uninstallAfterInstall },\n\t\t\t);\n\t\tcase \"bun\":\n\t\t\treturn makeSelfUpdateCommand(\n\t\t\t\tmakeSelfUpdateCommandStep(\"bun\", [\"install\", \"-g\", updateSpec]),\n\t\t\t\tupdatePackageName === installedPackageName\n\t\t\t\t\t? undefined\n\t\t\t\t\t: makeSelfUpdateCommandStep(\"bun\", [\"uninstall\", \"-g\", installedPackageName]),\n\t\t\t\t{ uninstallAfterInstall },\n\t\t\t);\n\t\tcase \"npm\": {\n\t\t\tconst [command = \"npm\", ...npmArgs] = npmCommand ?? [];\n\t\t\tconst inferred = npmCommand?.length ? undefined : getInferredNpmInstall();\n\t\t\tconst prefixArgs = [...npmArgs, ...(inferred ? [\"--prefix\", inferred.prefix] : [])];\n\t\t\tconst installStep = makeSelfUpdateCommandStep(command, [...prefixArgs, \"install\", \"-g\", updateSpec]);\n\t\t\tconst uninstallStep =\n\t\t\t\tupdatePackageName === installedPackageName\n\t\t\t\t\t? undefined\n\t\t\t\t\t: makeSelfUpdateCommandStep(command, [...prefixArgs, \"uninstall\", \"-g\", installedPackageName]);\n\t\t\treturn makeSelfUpdateCommand(installStep, uninstallStep, { uninstallAfterInstall });\n\t\t}\n\t\tcase \"unknown\":\n\t\t\treturn undefined;\n\t}\n}\n\nfunction readCommandOutput(\n\tcommand: string,\n\targs: string[],\n\toptions: { requireSuccess?: boolean } = {},\n): string | undefined {\n\tconst result = spawnSync(command, args, {\n\t\tencoding: \"utf-8\",\n\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\tshell: shouldUseWindowsShell(command),\n\t});\n\tif (result.status === 0) return result.stdout.trim() || undefined;\n\tif (options.requireSuccess) {\n\t\tconst reason = result.error?.message || result.stderr.trim() || `exit code ${result.status ?? \"unknown\"}`;\n\t\tthrow new Error(`Failed to run ${[command, ...args].join(\" \")}: ${reason}`);\n\t}\n\treturn undefined;\n}\n\nfunction getGlobalPackageRoots(method: InstallMethod, _packageName: string, npmCommand?: string[]): string[] {\n\tswitch (method) {\n\t\tcase \"npm\": {\n\t\t\tconst configured = !!npmCommand?.length;\n\t\t\tconst [command = \"npm\", ...npmArgs] = npmCommand ?? [];\n\t\t\tif (configured && command === \"bun\") {\n\t\t\t\tconst bunBin = readCommandOutput(command, [...npmArgs, \"pm\", \"bin\", \"-g\"], {\n\t\t\t\t\trequireSuccess: true,\n\t\t\t\t});\n\t\t\t\tconst roots = [join(homedir(), \".bun\", \"install\", \"global\", \"node_modules\")];\n\t\t\t\tif (bunBin) {\n\t\t\t\t\troots.push(join(dirname(bunBin), \"install\", \"global\", \"node_modules\"));\n\t\t\t\t}\n\t\t\t\treturn roots;\n\t\t\t}\n\t\t\tconst root = readCommandOutput(command, [...npmArgs, \"root\", \"-g\"], {\n\t\t\t\trequireSuccess: configured,\n\t\t\t});\n\t\t\tconst inferred = configured ? undefined : getInferredNpmInstall();\n\t\t\treturn [root, inferred?.root].filter((x): x is string => !!x);\n\t\t}\n\t\tcase \"pnpm\": {\n\t\t\tconst root = readCommandOutput(\"pnpm\", [\"root\", \"-g\"]);\n\t\t\treturn root ? [root, dirname(root)] : [];\n\t\t}\n\t\tcase \"yarn\": {\n\t\t\tconst dir = readCommandOutput(\"yarn\", [\"global\", \"dir\"]);\n\t\t\treturn dir ? [dir, join(dir, \"node_modules\")] : [];\n\t\t}\n\t\tcase \"bun\": {\n\t\t\tconst bunBin = readCommandOutput(\"bun\", [\"pm\", \"bin\", \"-g\"]);\n\t\t\tconst roots = [join(homedir(), \".bun\", \"install\", \"global\", \"node_modules\")];\n\t\t\tif (bunBin) {\n\t\t\t\troots.push(join(dirname(bunBin), \"install\", \"global\", \"node_modules\"));\n\t\t\t}\n\t\t\treturn roots;\n\t\t}\n\t\tcase \"bun-binary\":\n\t\tcase \"homebrew\":\n\t\tcase \"unknown\":\n\t\t\treturn [];\n\t}\n}\n\nfunction normalizeExistingPathForComparison(path: string): string | undefined {\n\tconst resolvedPath = resolve(path);\n\tif (!existsSync(resolvedPath)) {\n\t\treturn undefined;\n\t}\n\tlet normalizedPath: string;\n\ttry {\n\t\tnormalizedPath = realpathSync(resolvedPath);\n\t} catch {\n\t\treturn undefined;\n\t}\n\tif (process.platform === \"win32\") {\n\t\tnormalizedPath = normalizedPath.toLowerCase();\n\t}\n\treturn normalizedPath;\n}\n\nfunction isSelfUpdatePathWritable(): boolean {\n\tconst packageDir = getPackageDir();\n\ttry {\n\t\taccessSync(packageDir, constants.W_OK);\n\t\taccessSync(dirname(packageDir), constants.W_OK);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction isManagedByGlobalPackageManager(method: InstallMethod, packageName: string, npmCommand?: string[]): boolean {\n\tconst packageDir = normalizeExistingPathForComparison(getPackageDir());\n\treturn (\n\t\t!!packageDir &&\n\t\tgetGlobalPackageRoots(method, packageName, npmCommand).some((root) => {\n\t\t\tconst normalizedRoot = normalizeExistingPathForComparison(root);\n\t\t\treturn (\n\t\t\t\t!!normalizedRoot &&\n\t\t\t\tpackageDir.startsWith(normalizedRoot.endsWith(sep) ? normalizedRoot : `${normalizedRoot}${sep}`)\n\t\t\t);\n\t\t})\n\t);\n}\n\nexport function getSelfUpdateCommand(\n\tpackageName: string,\n\tnpmCommand?: string[],\n\tupdateSpec = packageName,\n\tupdatePackageName = getDefaultUpdatePackageName(packageName, updateSpec),\n): SelfUpdateCommand | undefined {\n\tconst method = detectInstallMethod();\n\tconst command = getSelfUpdateCommandForMethod(method, packageName, updateSpec, npmCommand, updatePackageName);\n\tif (!command || !isManagedByGlobalPackageManager(method, packageName, npmCommand) || !isSelfUpdatePathWritable()) {\n\t\treturn undefined;\n\t}\n\treturn command;\n}\n\nexport function getSelfUpdateUnavailableInstruction(\n\tpackageName: string,\n\tnpmCommand?: string[],\n\tupdateSpec = packageName,\n\tupdatePackageName = getDefaultUpdatePackageName(packageName, updateSpec),\n): string {\n\tconst method = detectInstallMethod();\n\tif (method === \"bun-binary\") {\n\t\treturn `Download from: https://github.com/AletheionAGI/asm-agent/releases/latest`;\n\t}\n\tif (method === \"homebrew\") {\n\t\treturn `Update with: brew upgrade ${APP_NAME}`;\n\t}\n\tconst command = getSelfUpdateCommandForMethod(method, packageName, updateSpec, npmCommand, updatePackageName);\n\tif (command) {\n\t\tif (isManagedByGlobalPackageManager(method, packageName, npmCommand) && !isSelfUpdatePathWritable()) {\n\t\t\treturn `This installation is managed by a global ${method} install, but the install path is not writable. Update it yourself with: ${command.display}`;\n\t\t}\n\t\treturn `This installation is not managed by a global ${method} install. Update it with the package manager, wrapper, or source checkout that provides it.`;\n\t}\n\treturn `Update ${updateSpec} using the package manager, wrapper, or source checkout that provides this installation.`;\n}\n\nexport function getUpdateInstruction(packageName: string): string {\n\tconst method = detectInstallMethod();\n\tconst command = getSelfUpdateCommandForMethod(method, packageName);\n\tif (command) {\n\t\treturn `Run: ${command.display}`;\n\t}\n\treturn getSelfUpdateUnavailableInstruction(packageName);\n}\n\n// =============================================================================\n// Package Asset Paths (shipped with executable)\n// =============================================================================\n\n/**\n * Get the base directory for resolving package assets (themes, package.json, README.md, CHANGELOG.md).\n * - For Bun binary: returns the directory containing the executable\n * - For Node.js (dist/): returns __dirname (the dist/ directory)\n * - For tsx (src/): returns parent directory (the package root)\n */\nexport function getPackageDir(): string {\n\t// Allow override via environment variable (useful for Nix/Guix where store paths tokenize poorly)\n\tconst envDir = process.env.PI_PACKAGE_DIR;\n\tif (envDir) {\n\t\tif (envDir === \"~\") return homedir();\n\t\tif (envDir.startsWith(\"~/\")) return homedir() + envDir.slice(1);\n\t\treturn envDir;\n\t}\n\n\tif (isBunBinary) {\n\t\t// Bun binary: process.execPath points to the compiled executable\n\t\treturn dirname(process.execPath);\n\t}\n\t// Node.js: walk up from __dirname until we find package.json\n\tlet dir = __dirname;\n\twhile (dir !== dirname(dir)) {\n\t\tif (existsSync(join(dir, \"package.json\"))) {\n\t\t\treturn dir;\n\t\t}\n\t\tdir = dirname(dir);\n\t}\n\t// Fallback (shouldn't happen)\n\treturn __dirname;\n}\n\n/**\n * Get path to built-in themes directory (shipped with package)\n * - For Bun binary: theme/ next to executable\n * - For Node.js (dist/): dist/modes/interactive/theme/\n * - For tsx (src/): src/modes/interactive/theme/\n */\nexport function getThemesDir(): string {\n\tif (isBunBinary) {\n\t\treturn join(getPackageDir(), \"theme\");\n\t}\n\t// Theme is in modes/interactive/theme/ relative to src/ or dist/\n\tconst packageDir = getPackageDir();\n\tconst srcOrDist = existsSync(join(packageDir, \"src\")) ? \"src\" : \"dist\";\n\treturn join(packageDir, srcOrDist, \"modes\", \"interactive\", \"theme\");\n}\n\n/**\n * Get path to HTML export template directory (shipped with package)\n * - For Bun binary: export-html/ next to executable\n * - For Node.js (dist/): dist/core/export-html/\n * - For tsx (src/): src/core/export-html/\n */\nexport function getExportTemplateDir(): string {\n\tif (isBunBinary) {\n\t\treturn join(getPackageDir(), \"export-html\");\n\t}\n\tconst packageDir = getPackageDir();\n\tconst srcOrDist = existsSync(join(packageDir, \"src\")) ? \"src\" : \"dist\";\n\treturn join(packageDir, srcOrDist, \"core\", \"export-html\");\n}\n\n/** Get path to package.json */\nexport function getPackageJsonPath(): string {\n\treturn join(getPackageDir(), \"package.json\");\n}\n\n/** Get path to docs directory */\nexport function getDocsPath(): string {\n\treturn resolve(join(getPackageDir(), \"docs\"));\n}\n\n/** Get path to CHANGELOG.md */\nexport function getChangelogPath(): string {\n\treturn resolve(join(getPackageDir(), \"CHANGELOG.md\"));\n}\n\n/**\n * Get path to built-in interactive assets directory.\n * - For Bun binary: assets/ next to executable\n * - For Node.js (dist/): dist/modes/interactive/assets/\n * - For tsx (src/): src/modes/interactive/assets/\n */\nexport function getInteractiveAssetsDir(): string {\n\tif (isBunBinary) {\n\t\treturn join(getPackageDir(), \"assets\");\n\t}\n\tconst packageDir = getPackageDir();\n\tconst srcOrDist = existsSync(join(packageDir, \"src\")) ? \"src\" : \"dist\";\n\treturn join(packageDir, srcOrDist, \"modes\", \"interactive\", \"assets\");\n}\n\n/** Get path to a bundled interactive asset */\nexport function getBundledInteractiveAssetPath(name: string): string {\n\treturn join(getInteractiveAssetsDir(), name);\n}\n\n/**\n * Get the directory containing built-in skills shipped with the package.\n * - For Bun binary: skills/ next to executable\n * - For Node.js (dist/): dist/skills/\n * - For tsx (src/): skills/ at the package root\n */\nexport function getBundledSkillsDir(): string {\n\tif (isBunBinary) {\n\t\treturn join(getPackageDir(), \"skills\");\n\t}\n\tconst packageDir = getPackageDir();\n\t// Source checkouts (tsx) keep built-in skills at the package root; built\n\t// packages copy them to dist/skills. Decide by whether src/ is present so a\n\t// stale dist/ from a prior build never shadows live source edits.\n\tconst isSourceCheckout = existsSync(join(packageDir, \"src\"));\n\treturn isSourceCheckout ? join(packageDir, \"skills\") : join(packageDir, \"dist\", \"skills\");\n}\n\n// =============================================================================\n// App Config (from package.json asmAgentConfig)\n// =============================================================================\n\ninterface PackageJson {\n\tname?: string;\n\tversion?: string;\n\tasmAgentConfig?: {\n\t\tname?: string;\n\t\tconfigDir?: string;\n\t};\n}\n\nconst pkg = JSON.parse(readFileSync(getPackageJsonPath(), \"utf-8\")) as PackageJson;\n\nconst configuredAppName: string | undefined = pkg.asmAgentConfig?.name;\nconst envPrefix =\n\t(configuredAppName || \"asm-agent\")\n\t\t.toUpperCase()\n\t\t.replace(/[^A-Z0-9]+/g, \"_\")\n\t\t.replace(/^_+|_+$/g, \"\") || \"PI\";\nexport const PACKAGE_NAME: string = pkg.name || \"@asm-agent/coding-agent\";\nexport const APP_NAME: string = configuredAppName || \"asm-agent\";\nexport const APP_TITLE: string = \"ASM Agent\";\nexport const CONFIG_DIR_NAME: string = pkg.asmAgentConfig?.configDir || \".asm-agent\";\nexport const VERSION: string = pkg.version || \"0.0.0\";\n\n// e.g., PI_CODING_AGENT_DIR or ASM_AGENT_CODING_AGENT_DIR\nexport const ENV_AGENT_DIR = `${envPrefix}_CODING_AGENT_DIR`;\nexport const ENV_SESSION_DIR = `${envPrefix}_SESSION_DIR`;\nexport const ENV_LEGACY_SESSION_DIR = `${envPrefix}_CODING_AGENT_SESSION_DIR`;\n\nexport function expandTildePath(path: string): string {\n\tif (path === \"~\") return homedir();\n\tif (path.startsWith(\"~/\")) return homedir() + path.slice(1);\n\treturn path;\n}\n\nconst DEFAULT_SHARE_VIEWER_URL = \"https://pi.dev/session/\";\n\n/** Get the share viewer URL for a gist ID */\nexport function getShareViewerUrl(gistId: string): string {\n\tconst baseUrl = process.env.PI_SHARE_VIEWER_URL || DEFAULT_SHARE_VIEWER_URL;\n\treturn `${baseUrl}#${gistId}`;\n}\n\n// =============================================================================\n// User Config Paths (~/.asm-agent/*)\n// =============================================================================\n\n/** Get the agent config directory (e.g., ~/.asm-agent/) */\nexport function getAgentDir(): string {\n\tconst envDir = process.env[ENV_AGENT_DIR];\n\tif (envDir) {\n\t\treturn expandTildePath(envDir);\n\t}\n\treturn join(homedir(), CONFIG_DIR_NAME);\n}\n\n/** Get path to user's custom themes directory */\nexport function getCustomThemesDir(): string {\n\treturn join(getAgentDir(), \"themes\");\n}\n\n/** Directory where daemon and client diagnostic logs are written (e.g. ~/.asm-agent/logs/). */\nexport function getLogsDir(): string {\n\treturn join(getAgentDir(), \"logs\");\n}\n\n/** Log file capturing client-side agent-open failures. */\nexport function getClientErrorLogPath(): string {\n\treturn join(getLogsDir(), \"client-errors.log\");\n}\n\nexport function getAgentTracesLogPath(): string {\n\treturn join(getLogsDir(), \"agent-traces.log\");\n}\n\n/** Shared structured (JSON lines) log for client, daemon, and provider diagnostics. */\nexport function getAgentLogPath(): string {\n\treturn join(getLogsDir(), \"agent.jsonl\");\n}\n\n/**\n * Log file for a daemon. The basename keeps it readable; a hash of the full\n * socket path makes it unique so two sockets that share a basename (e.g.\n * daemon.sock in different dirs) don't interleave into one file.\n */\nexport function getDaemonLogPath(socketPath: string): string {\n\tconst normalized = normalizeSocketPath(socketPath);\n\tconst hash = createHash(\"sha256\").update(normalized).digest(\"hex\").slice(0, 8);\n\treturn join(getLogsDir(), `${basename(normalized)}.${hash}.log`);\n}\n\nexport function getDaemonUpdateRestartManifestPath(socketPath: string, agentDir: string = getAgentDir()): string {\n\tconst normalizedSocketPath = normalizeSocketPath(socketPath);\n\tconst socketHash = createHash(\"sha256\").update(normalizedSocketPath).digest(\"hex\");\n\treturn join(agentDir, \"daemon-update-restarts\", `${socketHash}.json`);\n}\n\nexport function getLegacyDaemonUpdateRestartManifestPath(agentDir: string = getAgentDir()): string {\n\treturn join(agentDir, \"daemon-update-restart.json\");\n}\n\nconst MAX_LOG_BYTES = 5 * 1024 * 1024;\n\n/**\n * Append a line to a log file, keeping its size bounded with a single-generation\n * rotation. Opens and closes per call (no held fd), so rotation works at runtime\n * — a long-lived writer rotates on the write that crosses the cap, not only at\n * startup. Best-effort: diagnostics must never throw into the caller.\n */\nexport function appendRotatingLog(logPath: string, message: string, maxBytes: number = MAX_LOG_BYTES): void {\n\ttry {\n\t\tmkdirSync(dirname(logPath), { recursive: true });\n\t\ttry {\n\t\t\tif (existsSync(logPath) && statSync(logPath).size > maxBytes) {\n\t\t\t\t// Drop any prior .old first: renameSync fails on Windows if it exists.\n\t\t\t\trmSync(`${logPath}.old`, { force: true });\n\t\t\t\trenameSync(logPath, `${logPath}.old`);\n\t\t\t}\n\t\t} catch {\n\t\t\t// Keep appending rather than dropping the log on a rotation failure.\n\t\t}\n\t\tappendFileSync(logPath, `${message}\\n`);\n\t} catch {\n\t\t// A read-only or missing log dir must never break the caller.\n\t}\n}\n\n/** Get path to auth.json */\nexport function getAuthPath(): string {\n\treturn join(getAgentDir(), \"auth.json\");\n}\n\n/** Get path to cron jobs store */\nexport function getCronJobsPath(agentDir: string = getAgentDir()): string {\n\treturn join(agentDir, \"cron-jobs.json\");\n}\n\n/** Get path to managed binaries directory (fd, rg) */\nexport function getBinDir(): string {\n\treturn join(getAgentDir(), \"bin\");\n}\n\n/** Get path to sessions directory */\nexport function getSessionsDir(agentDir: string = getAgentDir()): string {\n\tconst envDir = getSessionDirEnvOverride();\n\tif (envDir) {\n\t\treturn envDir;\n\t}\n\treturn join(agentDir, \"sessions\");\n}\n\nexport function getSessionDirEnvOverride(): string | undefined {\n\tconst envDir = process.env[ENV_SESSION_DIR] ?? process.env[ENV_LEGACY_SESSION_DIR];\n\treturn envDir ? expandTildePath(envDir) : undefined;\n}\n\n/** Get path to debug log file */\nexport function getDebugLogPath(): string {\n\treturn join(getAgentDir(), `${APP_NAME}-debug.log`);\n}\n"]}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawnSync } from \"child_process\";\nimport { createHash } from \"crypto\";\nimport {\n\taccessSync,\n\tappendFileSync,\n\tconstants,\n\texistsSync,\n\tmkdirSync,\n\treadFileSync,\n\trealpathSync,\n\trenameSync,\n\trmSync,\n\tstatSync,\n} from \"fs\";\nimport { homedir } from \"os\";\nimport { basename, dirname, join, resolve, sep, win32 } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { shouldUseWindowsShell } from \"./utils/child-process.js\";\nimport { normalizeSocketPath } from \"./utils/daemon-socket-path.js\";\n\n// =============================================================================\n// Package Detection\n// =============================================================================\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Detect if we're running as a Bun compiled binary.\n * Bun binaries have import.meta.url containing \"$bunfs\", \"~BUN\", or \"%7EBUN\" (Bun's virtual filesystem path)\n */\nexport const isBunBinary =\n\timport.meta.url.includes(\"$bunfs\") || import.meta.url.includes(\"~BUN\") || import.meta.url.includes(\"%7EBUN\");\n\n/** Detect if Bun is the runtime (compiled binary or bun run) */\nexport const isBunRuntime = !!process.versions.bun;\n\nexport const SELF_UPDATE_INTERACTIVE_CHILD_ENV = \"ASM_AGENT_INTERACTIVE_SELF_UPDATE\";\nexport const SELF_UPDATE_NOT_ATTEMPTED_EXIT_CODE = 75;\n\n// =============================================================================\n// Install Method Detection\n// =============================================================================\n\nexport type InstallMethod = \"bun-binary\" | \"homebrew\" | \"npm\" | \"pnpm\" | \"yarn\" | \"bun\" | \"unknown\";\n\ninterface SelfUpdateCommandStep {\n\tcommand: string;\n\targs: string[];\n\tdisplay: string;\n}\n\nexport interface SelfUpdateCommand extends SelfUpdateCommandStep {\n\tsteps?: SelfUpdateCommandStep[];\n}\n\nfunction makeSelfUpdateCommand(\n\tinstallStep: SelfUpdateCommandStep,\n\tuninstallStep?: SelfUpdateCommandStep,\n\toptions: { uninstallAfterInstall?: boolean } = {},\n): SelfUpdateCommand {\n\tif (!uninstallStep) return installStep;\n\tif (options.uninstallAfterInstall) {\n\t\treturn {\n\t\t\t...installStep,\n\t\t\tdisplay: `${installStep.display} && ${uninstallStep.display}`,\n\t\t\tsteps: [installStep, uninstallStep],\n\t\t};\n\t}\n\treturn {\n\t\t...installStep,\n\t\tdisplay: `${uninstallStep.display} && ${installStep.display}`,\n\t\tsteps: [uninstallStep, installStep],\n\t};\n}\n\nfunction makeSelfUpdateCommandStep(command: string, args: string[]): SelfUpdateCommandStep {\n\treturn {\n\t\tcommand,\n\t\targs,\n\t\tdisplay: [command, ...args].map((arg) => (/\\s/.test(arg) ? `\"${arg}\"` : arg)).join(\" \"),\n\t};\n}\n\nexport function detectInstallMethod(): InstallMethod {\n\tif (isBunBinary) {\n\t\treturn \"bun-binary\";\n\t}\n\tif (isHomebrewInstall()) {\n\t\treturn \"homebrew\";\n\t}\n\n\tconst resolvedPath = `${__dirname}\\0${process.execPath || \"\"}`.toLowerCase().replace(/\\\\/g, \"/\");\n\n\tif (resolvedPath.includes(\"/pnpm/\") || resolvedPath.includes(\"/.pnpm/\")) {\n\t\treturn \"pnpm\";\n\t}\n\tif (resolvedPath.includes(\"/yarn/\") || resolvedPath.includes(\"/.yarn/\")) {\n\t\treturn \"yarn\";\n\t}\n\tif (isBunRuntime || resolvedPath.includes(\"/install/global/node_modules/\")) {\n\t\treturn \"bun\";\n\t}\n\tif (resolvedPath.includes(\"/npm/\") || resolvedPath.includes(\"/node_modules/\")) {\n\t\treturn \"npm\";\n\t}\n\n\treturn \"unknown\";\n}\n\nfunction isHomebrewInstall(): boolean {\n\tconst packageDir = getPackageDir().toLowerCase().replace(/\\\\/g, \"/\");\n\treturn packageDir.includes(\"/cellar/\") && packageDir.includes(\"/libexec/lib/node_modules/\");\n}\n\nfunction getInferredNpmInstall(): { root: string; prefix: string } | undefined {\n\tconst packageDir = getPackageDir();\n\tconst path = process.platform === \"win32\" || packageDir.includes(\"\\\\\") ? win32 : { basename, dirname };\n\tconst parent = path.dirname(packageDir);\n\tlet root: string | undefined;\n\tif (path.basename(parent).startsWith(\"@\") && path.basename(path.dirname(parent)) === \"node_modules\") {\n\t\troot = path.dirname(parent);\n\t} else if (path.basename(parent) === \"node_modules\") {\n\t\troot = parent;\n\t}\n\tif (!root) return undefined;\n\tconst rootParent = path.dirname(root);\n\tif (path.basename(rootParent) === \"lib\") return { root, prefix: path.dirname(rootParent) };\n\t// Windows global npm prefixes use `<prefix>\\\\node_modules`, which is\n\t// indistinguishable from local project installs by path shape alone. Do not\n\t// infer unsupported Windows custom prefixes without `npm root -g` evidence.\n\treturn undefined;\n}\n\nfunction isDirectPackageArtifactSpec(updateSpec: string): boolean {\n\tconst spec = updateSpec.trim().toLowerCase();\n\treturn (\n\t\tspec.startsWith(\"http://\") ||\n\t\tspec.startsWith(\"https://\") ||\n\t\tspec.startsWith(\"file:\") ||\n\t\tspec.endsWith(\".tgz\") ||\n\t\tspec.endsWith(\".tar.gz\")\n\t);\n}\n\nfunction getDefaultUpdatePackageName(installedPackageName: string, updateSpec: string): string {\n\tif (isDirectPackageArtifactSpec(updateSpec)) {\n\t\treturn installedPackageName;\n\t}\n\treturn updateSpec;\n}\n\nfunction getSelfUpdateCommandForMethod(\n\tmethod: InstallMethod,\n\tinstalledPackageName: string,\n\tupdateSpec = installedPackageName,\n\tnpmCommand?: string[],\n\tupdatePackageName = getDefaultUpdatePackageName(installedPackageName, updateSpec),\n): SelfUpdateCommand | undefined {\n\tconst uninstallAfterInstall = isDirectPackageArtifactSpec(updateSpec);\n\tswitch (method) {\n\t\tcase \"bun-binary\":\n\t\tcase \"homebrew\":\n\t\t\treturn undefined;\n\t\tcase \"pnpm\":\n\t\t\treturn makeSelfUpdateCommand(\n\t\t\t\tmakeSelfUpdateCommandStep(\"pnpm\", [\"install\", \"-g\", updateSpec]),\n\t\t\t\tupdatePackageName === installedPackageName\n\t\t\t\t\t? undefined\n\t\t\t\t\t: makeSelfUpdateCommandStep(\"pnpm\", [\"remove\", \"-g\", installedPackageName]),\n\t\t\t\t{ uninstallAfterInstall },\n\t\t\t);\n\t\tcase \"yarn\":\n\t\t\treturn makeSelfUpdateCommand(\n\t\t\t\tmakeSelfUpdateCommandStep(\"yarn\", [\"global\", \"add\", updateSpec]),\n\t\t\t\tupdatePackageName === installedPackageName\n\t\t\t\t\t? undefined\n\t\t\t\t\t: makeSelfUpdateCommandStep(\"yarn\", [\"global\", \"remove\", installedPackageName]),\n\t\t\t\t{ uninstallAfterInstall },\n\t\t\t);\n\t\tcase \"bun\":\n\t\t\treturn makeSelfUpdateCommand(\n\t\t\t\tmakeSelfUpdateCommandStep(\"bun\", [\"install\", \"-g\", updateSpec]),\n\t\t\t\tupdatePackageName === installedPackageName\n\t\t\t\t\t? undefined\n\t\t\t\t\t: makeSelfUpdateCommandStep(\"bun\", [\"uninstall\", \"-g\", installedPackageName]),\n\t\t\t\t{ uninstallAfterInstall },\n\t\t\t);\n\t\tcase \"npm\": {\n\t\t\tconst [command = \"npm\", ...npmArgs] = npmCommand ?? [];\n\t\t\tconst inferred = npmCommand?.length ? undefined : getInferredNpmInstall();\n\t\t\tconst prefixArgs = [...npmArgs, ...(inferred ? [\"--prefix\", inferred.prefix] : [])];\n\t\t\tconst installStep = makeSelfUpdateCommandStep(command, [...prefixArgs, \"install\", \"-g\", updateSpec]);\n\t\t\tconst uninstallStep =\n\t\t\t\tupdatePackageName === installedPackageName\n\t\t\t\t\t? undefined\n\t\t\t\t\t: makeSelfUpdateCommandStep(command, [...prefixArgs, \"uninstall\", \"-g\", installedPackageName]);\n\t\t\treturn makeSelfUpdateCommand(installStep, uninstallStep, { uninstallAfterInstall });\n\t\t}\n\t\tcase \"unknown\":\n\t\t\treturn undefined;\n\t}\n}\n\nfunction readCommandOutput(\n\tcommand: string,\n\targs: string[],\n\toptions: { requireSuccess?: boolean } = {},\n): string | undefined {\n\tconst result = spawnSync(command, args, {\n\t\tencoding: \"utf-8\",\n\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\tshell: shouldUseWindowsShell(command),\n\t});\n\tif (result.status === 0) return result.stdout.trim() || undefined;\n\tif (options.requireSuccess) {\n\t\tconst reason = result.error?.message || result.stderr.trim() || `exit code ${result.status ?? \"unknown\"}`;\n\t\tthrow new Error(`Failed to run ${[command, ...args].join(\" \")}: ${reason}`);\n\t}\n\treturn undefined;\n}\n\nfunction getGlobalPackageRoots(method: InstallMethod, _packageName: string, npmCommand?: string[]): string[] {\n\tswitch (method) {\n\t\tcase \"npm\": {\n\t\t\tconst configured = !!npmCommand?.length;\n\t\t\tconst [command = \"npm\", ...npmArgs] = npmCommand ?? [];\n\t\t\tif (configured && command === \"bun\") {\n\t\t\t\tconst bunBin = readCommandOutput(command, [...npmArgs, \"pm\", \"bin\", \"-g\"], {\n\t\t\t\t\trequireSuccess: true,\n\t\t\t\t});\n\t\t\t\tconst roots = [join(homedir(), \".bun\", \"install\", \"global\", \"node_modules\")];\n\t\t\t\tif (bunBin) {\n\t\t\t\t\troots.push(join(dirname(bunBin), \"install\", \"global\", \"node_modules\"));\n\t\t\t\t}\n\t\t\t\treturn roots;\n\t\t\t}\n\t\t\tconst root = readCommandOutput(command, [...npmArgs, \"root\", \"-g\"], {\n\t\t\t\trequireSuccess: configured,\n\t\t\t});\n\t\t\tconst inferred = configured ? undefined : getInferredNpmInstall();\n\t\t\treturn [root, inferred?.root].filter((x): x is string => !!x);\n\t\t}\n\t\tcase \"pnpm\": {\n\t\t\tconst root = readCommandOutput(\"pnpm\", [\"root\", \"-g\"]);\n\t\t\treturn root ? [root, dirname(root)] : [];\n\t\t}\n\t\tcase \"yarn\": {\n\t\t\tconst dir = readCommandOutput(\"yarn\", [\"global\", \"dir\"]);\n\t\t\treturn dir ? [dir, join(dir, \"node_modules\")] : [];\n\t\t}\n\t\tcase \"bun\": {\n\t\t\tconst bunBin = readCommandOutput(\"bun\", [\"pm\", \"bin\", \"-g\"]);\n\t\t\tconst roots = [join(homedir(), \".bun\", \"install\", \"global\", \"node_modules\")];\n\t\t\tif (bunBin) {\n\t\t\t\troots.push(join(dirname(bunBin), \"install\", \"global\", \"node_modules\"));\n\t\t\t}\n\t\t\treturn roots;\n\t\t}\n\t\tcase \"bun-binary\":\n\t\tcase \"homebrew\":\n\t\tcase \"unknown\":\n\t\t\treturn [];\n\t}\n}\n\nfunction normalizeExistingPathForComparison(path: string): string | undefined {\n\tconst resolvedPath = resolve(path);\n\tif (!existsSync(resolvedPath)) {\n\t\treturn undefined;\n\t}\n\tlet normalizedPath: string;\n\ttry {\n\t\tnormalizedPath = realpathSync(resolvedPath);\n\t} catch {\n\t\treturn undefined;\n\t}\n\tif (process.platform === \"win32\") {\n\t\tnormalizedPath = normalizedPath.toLowerCase();\n\t}\n\treturn normalizedPath;\n}\n\nfunction isSelfUpdatePathWritable(): boolean {\n\tconst packageDir = getPackageDir();\n\ttry {\n\t\taccessSync(packageDir, constants.W_OK);\n\t\taccessSync(dirname(packageDir), constants.W_OK);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction isManagedByGlobalPackageManager(method: InstallMethod, packageName: string, npmCommand?: string[]): boolean {\n\tconst packageDir = normalizeExistingPathForComparison(getPackageDir());\n\treturn (\n\t\t!!packageDir &&\n\t\tgetGlobalPackageRoots(method, packageName, npmCommand).some((root) => {\n\t\t\tconst normalizedRoot = normalizeExistingPathForComparison(root);\n\t\t\treturn (\n\t\t\t\t!!normalizedRoot &&\n\t\t\t\tpackageDir.startsWith(normalizedRoot.endsWith(sep) ? normalizedRoot : `${normalizedRoot}${sep}`)\n\t\t\t);\n\t\t})\n\t);\n}\n\nexport function getSelfUpdateCommand(\n\tpackageName: string,\n\tnpmCommand?: string[],\n\tupdateSpec = packageName,\n\tupdatePackageName = getDefaultUpdatePackageName(packageName, updateSpec),\n): SelfUpdateCommand | undefined {\n\tconst method = detectInstallMethod();\n\tconst command = getSelfUpdateCommandForMethod(method, packageName, updateSpec, npmCommand, updatePackageName);\n\tif (!command || !isManagedByGlobalPackageManager(method, packageName, npmCommand) || !isSelfUpdatePathWritable()) {\n\t\treturn undefined;\n\t}\n\treturn command;\n}\n\nexport function getSelfUpdateUnavailableInstruction(\n\tpackageName: string,\n\tnpmCommand?: string[],\n\tupdateSpec = packageName,\n\tupdatePackageName = getDefaultUpdatePackageName(packageName, updateSpec),\n): string {\n\tconst method = detectInstallMethod();\n\tif (method === \"bun-binary\") {\n\t\treturn `Download from: https://github.com/AletheionAGI/asm-agent/releases/latest`;\n\t}\n\tif (method === \"homebrew\") {\n\t\treturn `Update with: brew upgrade ${APP_NAME}`;\n\t}\n\tconst command = getSelfUpdateCommandForMethod(method, packageName, updateSpec, npmCommand, updatePackageName);\n\tif (command) {\n\t\tif (isManagedByGlobalPackageManager(method, packageName, npmCommand) && !isSelfUpdatePathWritable()) {\n\t\t\treturn `This installation is managed by a global ${method} install, but the install path is not writable. Update it yourself with: ${command.display}`;\n\t\t}\n\t\treturn `This installation is not managed by a global ${method} install. Update it with the package manager, wrapper, or source checkout that provides it.`;\n\t}\n\treturn `Update ${updateSpec} using the package manager, wrapper, or source checkout that provides this installation.`;\n}\n\nexport function getUpdateInstruction(packageName: string): string {\n\tconst method = detectInstallMethod();\n\tconst command = getSelfUpdateCommandForMethod(method, packageName);\n\tif (command) {\n\t\treturn `Run: ${command.display}`;\n\t}\n\treturn getSelfUpdateUnavailableInstruction(packageName);\n}\n\n// =============================================================================\n// Package Asset Paths (shipped with executable)\n// =============================================================================\n\n/**\n * Get the base directory for resolving package assets (themes, package.json, README.md, CHANGELOG.md).\n * - For Bun binary: returns the directory containing the executable\n * - For Node.js (dist/): returns __dirname (the dist/ directory)\n * - For tsx (src/): returns parent directory (the package root)\n */\nexport function getPackageDir(): string {\n\t// Allow override via environment variable (useful for Nix/Guix where store paths tokenize poorly)\n\tconst envDir = process.env.PI_PACKAGE_DIR;\n\tif (envDir) {\n\t\tif (envDir === \"~\") return homedir();\n\t\tif (envDir.startsWith(\"~/\")) return homedir() + envDir.slice(1);\n\t\treturn envDir;\n\t}\n\n\tif (isBunBinary) {\n\t\t// Bun binary: process.execPath points to the compiled executable\n\t\treturn dirname(process.execPath);\n\t}\n\t// Node.js: walk up from __dirname until we find package.json\n\tlet dir = __dirname;\n\twhile (dir !== dirname(dir)) {\n\t\tif (existsSync(join(dir, \"package.json\"))) {\n\t\t\treturn dir;\n\t\t}\n\t\tdir = dirname(dir);\n\t}\n\t// Fallback (shouldn't happen)\n\treturn __dirname;\n}\n\n/**\n * Get path to built-in themes directory (shipped with package)\n * - For Bun binary: theme/ next to executable\n * - For Node.js (dist/): dist/modes/interactive/theme/\n * - For tsx (src/): src/modes/interactive/theme/\n */\nexport function getThemesDir(): string {\n\tif (isBunBinary) {\n\t\treturn join(getPackageDir(), \"theme\");\n\t}\n\t// Theme is in modes/interactive/theme/ relative to src/ or dist/\n\tconst packageDir = getPackageDir();\n\tconst srcOrDist = existsSync(join(packageDir, \"src\")) ? \"src\" : \"dist\";\n\treturn join(packageDir, srcOrDist, \"modes\", \"interactive\", \"theme\");\n}\n\n/**\n * Get path to HTML export template directory (shipped with package)\n * - For Bun binary: export-html/ next to executable\n * - For Node.js (dist/): dist/core/export-html/\n * - For tsx (src/): src/core/export-html/\n */\nexport function getExportTemplateDir(): string {\n\tif (isBunBinary) {\n\t\treturn join(getPackageDir(), \"export-html\");\n\t}\n\tconst packageDir = getPackageDir();\n\tconst srcOrDist = existsSync(join(packageDir, \"src\")) ? \"src\" : \"dist\";\n\treturn join(packageDir, srcOrDist, \"core\", \"export-html\");\n}\n\n/** Get path to package.json */\nexport function getPackageJsonPath(): string {\n\treturn join(getPackageDir(), \"package.json\");\n}\n\n/** Get path to docs directory */\nexport function getDocsPath(): string {\n\treturn resolve(join(getPackageDir(), \"docs\"));\n}\n\n/** Get path to CHANGELOG.md */\nexport function getChangelogPath(): string {\n\treturn resolve(join(getPackageDir(), \"CHANGELOG.md\"));\n}\n\n/**\n * Get path to built-in interactive assets directory.\n * - For Bun binary: assets/ next to executable\n * - For Node.js (dist/): dist/modes/interactive/assets/\n * - For tsx (src/): src/modes/interactive/assets/\n */\nexport function getInteractiveAssetsDir(): string {\n\tif (isBunBinary) {\n\t\treturn join(getPackageDir(), \"assets\");\n\t}\n\tconst packageDir = getPackageDir();\n\tconst srcOrDist = existsSync(join(packageDir, \"src\")) ? \"src\" : \"dist\";\n\treturn join(packageDir, srcOrDist, \"modes\", \"interactive\", \"assets\");\n}\n\n/** Get path to a bundled interactive asset */\nexport function getBundledInteractiveAssetPath(name: string): string {\n\treturn join(getInteractiveAssetsDir(), name);\n}\n\n/**\n * Get the directory containing built-in skills shipped with the package.\n * - For Bun binary: skills/ next to executable\n * - For Node.js (dist/): dist/skills/\n * - For tsx (src/): skills/ at the package root\n */\nexport function getBundledSkillsDir(): string {\n\tif (isBunBinary) {\n\t\treturn join(getPackageDir(), \"skills\");\n\t}\n\tconst packageDir = getPackageDir();\n\t// Source checkouts (tsx) keep built-in skills at the package root; built\n\t// packages copy them to dist/skills. Decide by whether src/ is present so a\n\t// stale dist/ from a prior build never shadows live source edits.\n\tconst isSourceCheckout = existsSync(join(packageDir, \"src\"));\n\treturn isSourceCheckout ? join(packageDir, \"skills\") : join(packageDir, \"dist\", \"skills\");\n}\n\n// =============================================================================\n// App Config (from package.json asmAgentConfig)\n// =============================================================================\n\ninterface PackageJson {\n\tname?: string;\n\tversion?: string;\n\tasmAgentConfig?: {\n\t\tname?: string;\n\t\tconfigDir?: string;\n\t};\n}\n\nconst pkg = JSON.parse(readFileSync(getPackageJsonPath(), \"utf-8\")) as PackageJson;\n\nconst configuredAppName: string | undefined = pkg.asmAgentConfig?.name;\nconst envPrefix =\n\t(configuredAppName || \"asm-agent\")\n\t\t.toUpperCase()\n\t\t.replace(/[^A-Z0-9]+/g, \"_\")\n\t\t.replace(/^_+|_+$/g, \"\") || \"PI\";\nexport const PACKAGE_NAME: string = pkg.name || \"@asm-agent/coding-agent\";\nexport const APP_NAME: string = configuredAppName || \"asm-agent\";\nexport const APP_TITLE: string = \"ASM Agent\";\nexport const CONFIG_DIR_NAME: string = pkg.asmAgentConfig?.configDir || \".asm-agent\";\nexport const VERSION: string = pkg.version || \"0.0.0\";\n\n// e.g., PI_CODING_AGENT_DIR or ASM_AGENT_CODING_AGENT_DIR\nexport const ENV_AGENT_DIR = `${envPrefix}_CODING_AGENT_DIR`;\nexport const ENV_SESSION_DIR = `${envPrefix}_SESSION_DIR`;\nexport const ENV_LEGACY_SESSION_DIR = `${envPrefix}_CODING_AGENT_SESSION_DIR`;\n\nexport function expandTildePath(path: string): string {\n\tif (path === \"~\") return homedir();\n\tif (path.startsWith(\"~/\")) return homedir() + path.slice(1);\n\treturn path;\n}\n\nconst DEFAULT_SHARE_VIEWER_URL = \"https://pi.dev/session/\";\n\n/** Get the share viewer URL for a gist ID */\nexport function getShareViewerUrl(gistId: string): string {\n\tconst baseUrl = process.env.PI_SHARE_VIEWER_URL || DEFAULT_SHARE_VIEWER_URL;\n\treturn `${baseUrl}#${gistId}`;\n}\n\n// =============================================================================\n// User Config Paths (~/.asm-agent/*)\n// =============================================================================\n\n/** Get the agent config directory (e.g., ~/.asm-agent/) */\nexport function getAgentDir(): string {\n\tconst envDir = process.env[ENV_AGENT_DIR];\n\tif (envDir) {\n\t\treturn expandTildePath(envDir);\n\t}\n\treturn join(homedir(), CONFIG_DIR_NAME);\n}\n\n/** Get path to user's custom themes directory */\nexport function getCustomThemesDir(): string {\n\treturn join(getAgentDir(), \"themes\");\n}\n\n/** Directory where daemon and client diagnostic logs are written (e.g. ~/.asm-agent/logs/). */\nexport function getLogsDir(): string {\n\treturn join(getAgentDir(), \"logs\");\n}\n\n/** Log file capturing client-side agent-open failures. */\nexport function getClientErrorLogPath(): string {\n\treturn join(getLogsDir(), \"client-errors.log\");\n}\n\n/** Shared structured (JSON lines) log for client, daemon, and provider diagnostics. */\nexport function getAgentLogPath(): string {\n\treturn join(getLogsDir(), \"agent.jsonl\");\n}\n\n/**\n * Log file for a daemon. The basename keeps it readable; a hash of the full\n * socket path makes it unique so two sockets that share a basename (e.g.\n * daemon.sock in different dirs) don't interleave into one file.\n */\nexport function getDaemonLogPath(socketPath: string): string {\n\tconst normalized = normalizeSocketPath(socketPath);\n\tconst hash = createHash(\"sha256\").update(normalized).digest(\"hex\").slice(0, 8);\n\treturn join(getLogsDir(), `${basename(normalized)}.${hash}.log`);\n}\n\nexport function getDaemonUpdateRestartManifestPath(socketPath: string, agentDir: string = getAgentDir()): string {\n\tconst normalizedSocketPath = normalizeSocketPath(socketPath);\n\tconst socketHash = createHash(\"sha256\").update(normalizedSocketPath).digest(\"hex\");\n\treturn join(agentDir, \"daemon-update-restarts\", `${socketHash}.json`);\n}\n\nexport function getLegacyDaemonUpdateRestartManifestPath(agentDir: string = getAgentDir()): string {\n\treturn join(agentDir, \"daemon-update-restart.json\");\n}\n\nconst MAX_LOG_BYTES = 5 * 1024 * 1024;\n\n/**\n * Append a line to a log file, keeping its size bounded with a single-generation\n * rotation. Opens and closes per call (no held fd), so rotation works at runtime\n * — a long-lived writer rotates on the write that crosses the cap, not only at\n * startup. Best-effort: diagnostics must never throw into the caller.\n */\nexport function appendRotatingLog(logPath: string, message: string, maxBytes: number = MAX_LOG_BYTES): void {\n\ttry {\n\t\tmkdirSync(dirname(logPath), { recursive: true });\n\t\ttry {\n\t\t\tif (existsSync(logPath) && statSync(logPath).size > maxBytes) {\n\t\t\t\t// Drop any prior .old first: renameSync fails on Windows if it exists.\n\t\t\t\trmSync(`${logPath}.old`, { force: true });\n\t\t\t\trenameSync(logPath, `${logPath}.old`);\n\t\t\t}\n\t\t} catch {\n\t\t\t// Keep appending rather than dropping the log on a rotation failure.\n\t\t}\n\t\tappendFileSync(logPath, `${message}\\n`);\n\t} catch {\n\t\t// A read-only or missing log dir must never break the caller.\n\t}\n}\n\n/** Get path to auth.json */\nexport function getAuthPath(): string {\n\treturn join(getAgentDir(), \"auth.json\");\n}\n\n/** Get path to cron jobs store */\nexport function getCronJobsPath(agentDir: string = getAgentDir()): string {\n\treturn join(agentDir, \"cron-jobs.json\");\n}\n\n/** Get path to managed binaries directory (fd, rg) */\nexport function getBinDir(): string {\n\treturn join(getAgentDir(), \"bin\");\n}\n\n/** Get path to sessions directory */\nexport function getSessionsDir(agentDir: string = getAgentDir()): string {\n\tconst envDir = getSessionDirEnvOverride();\n\tif (envDir) {\n\t\treturn envDir;\n\t}\n\treturn join(agentDir, \"sessions\");\n}\n\nexport function getSessionDirEnvOverride(): string | undefined {\n\tconst envDir = process.env[ENV_SESSION_DIR] ?? process.env[ENV_LEGACY_SESSION_DIR];\n\treturn envDir ? expandTildePath(envDir) : undefined;\n}\n\n/** Get path to debug log file */\nexport function getDebugLogPath(): string {\n\treturn join(getAgentDir(), `${APP_NAME}-debug.log`);\n}\n"]}
package/dist/config.js CHANGED
@@ -424,9 +424,6 @@ export function getLogsDir() {
424
424
  export function getClientErrorLogPath() {
425
425
  return join(getLogsDir(), "client-errors.log");
426
426
  }
427
- export function getAgentTracesLogPath() {
428
- return join(getLogsDir(), "agent-traces.log");
429
- }
430
427
  /** Shared structured (JSON lines) log for client, daemon, and provider diagnostics. */
431
428
  export function getAgentLogPath() {
432
429
  return join(getLogsDir(), "agent.jsonl");
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawnSync } from \"child_process\";\nimport { createHash } from \"crypto\";\nimport {\n\taccessSync,\n\tappendFileSync,\n\tconstants,\n\texistsSync,\n\tmkdirSync,\n\treadFileSync,\n\trealpathSync,\n\trenameSync,\n\trmSync,\n\tstatSync,\n} from \"fs\";\nimport { homedir } from \"os\";\nimport { basename, dirname, join, resolve, sep, win32 } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { shouldUseWindowsShell } from \"./utils/child-process.js\";\nimport { normalizeSocketPath } from \"./utils/daemon-socket-path.js\";\n\n// =============================================================================\n// Package Detection\n// =============================================================================\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Detect if we're running as a Bun compiled binary.\n * Bun binaries have import.meta.url containing \"$bunfs\", \"~BUN\", or \"%7EBUN\" (Bun's virtual filesystem path)\n */\nexport const isBunBinary =\n\timport.meta.url.includes(\"$bunfs\") || import.meta.url.includes(\"~BUN\") || import.meta.url.includes(\"%7EBUN\");\n\n/** Detect if Bun is the runtime (compiled binary or bun run) */\nexport const isBunRuntime = !!process.versions.bun;\n\nexport const SELF_UPDATE_INTERACTIVE_CHILD_ENV = \"ASM_AGENT_INTERACTIVE_SELF_UPDATE\";\nexport const SELF_UPDATE_NOT_ATTEMPTED_EXIT_CODE = 75;\n\n// =============================================================================\n// Install Method Detection\n// =============================================================================\n\nexport type InstallMethod = \"bun-binary\" | \"homebrew\" | \"npm\" | \"pnpm\" | \"yarn\" | \"bun\" | \"unknown\";\n\ninterface SelfUpdateCommandStep {\n\tcommand: string;\n\targs: string[];\n\tdisplay: string;\n}\n\nexport interface SelfUpdateCommand extends SelfUpdateCommandStep {\n\tsteps?: SelfUpdateCommandStep[];\n}\n\nfunction makeSelfUpdateCommand(\n\tinstallStep: SelfUpdateCommandStep,\n\tuninstallStep?: SelfUpdateCommandStep,\n\toptions: { uninstallAfterInstall?: boolean } = {},\n): SelfUpdateCommand {\n\tif (!uninstallStep) return installStep;\n\tif (options.uninstallAfterInstall) {\n\t\treturn {\n\t\t\t...installStep,\n\t\t\tdisplay: `${installStep.display} && ${uninstallStep.display}`,\n\t\t\tsteps: [installStep, uninstallStep],\n\t\t};\n\t}\n\treturn {\n\t\t...installStep,\n\t\tdisplay: `${uninstallStep.display} && ${installStep.display}`,\n\t\tsteps: [uninstallStep, installStep],\n\t};\n}\n\nfunction makeSelfUpdateCommandStep(command: string, args: string[]): SelfUpdateCommandStep {\n\treturn {\n\t\tcommand,\n\t\targs,\n\t\tdisplay: [command, ...args].map((arg) => (/\\s/.test(arg) ? `\"${arg}\"` : arg)).join(\" \"),\n\t};\n}\n\nexport function detectInstallMethod(): InstallMethod {\n\tif (isBunBinary) {\n\t\treturn \"bun-binary\";\n\t}\n\tif (isHomebrewInstall()) {\n\t\treturn \"homebrew\";\n\t}\n\n\tconst resolvedPath = `${__dirname}\\0${process.execPath || \"\"}`.toLowerCase().replace(/\\\\/g, \"/\");\n\n\tif (resolvedPath.includes(\"/pnpm/\") || resolvedPath.includes(\"/.pnpm/\")) {\n\t\treturn \"pnpm\";\n\t}\n\tif (resolvedPath.includes(\"/yarn/\") || resolvedPath.includes(\"/.yarn/\")) {\n\t\treturn \"yarn\";\n\t}\n\tif (isBunRuntime || resolvedPath.includes(\"/install/global/node_modules/\")) {\n\t\treturn \"bun\";\n\t}\n\tif (resolvedPath.includes(\"/npm/\") || resolvedPath.includes(\"/node_modules/\")) {\n\t\treturn \"npm\";\n\t}\n\n\treturn \"unknown\";\n}\n\nfunction isHomebrewInstall(): boolean {\n\tconst packageDir = getPackageDir().toLowerCase().replace(/\\\\/g, \"/\");\n\treturn packageDir.includes(\"/cellar/\") && packageDir.includes(\"/libexec/lib/node_modules/\");\n}\n\nfunction getInferredNpmInstall(): { root: string; prefix: string } | undefined {\n\tconst packageDir = getPackageDir();\n\tconst path = process.platform === \"win32\" || packageDir.includes(\"\\\\\") ? win32 : { basename, dirname };\n\tconst parent = path.dirname(packageDir);\n\tlet root: string | undefined;\n\tif (path.basename(parent).startsWith(\"@\") && path.basename(path.dirname(parent)) === \"node_modules\") {\n\t\troot = path.dirname(parent);\n\t} else if (path.basename(parent) === \"node_modules\") {\n\t\troot = parent;\n\t}\n\tif (!root) return undefined;\n\tconst rootParent = path.dirname(root);\n\tif (path.basename(rootParent) === \"lib\") return { root, prefix: path.dirname(rootParent) };\n\t// Windows global npm prefixes use `<prefix>\\\\node_modules`, which is\n\t// indistinguishable from local project installs by path shape alone. Do not\n\t// infer unsupported Windows custom prefixes without `npm root -g` evidence.\n\treturn undefined;\n}\n\nfunction isDirectPackageArtifactSpec(updateSpec: string): boolean {\n\tconst spec = updateSpec.trim().toLowerCase();\n\treturn (\n\t\tspec.startsWith(\"http://\") ||\n\t\tspec.startsWith(\"https://\") ||\n\t\tspec.startsWith(\"file:\") ||\n\t\tspec.endsWith(\".tgz\") ||\n\t\tspec.endsWith(\".tar.gz\")\n\t);\n}\n\nfunction getDefaultUpdatePackageName(installedPackageName: string, updateSpec: string): string {\n\tif (isDirectPackageArtifactSpec(updateSpec)) {\n\t\treturn installedPackageName;\n\t}\n\treturn updateSpec;\n}\n\nfunction getSelfUpdateCommandForMethod(\n\tmethod: InstallMethod,\n\tinstalledPackageName: string,\n\tupdateSpec = installedPackageName,\n\tnpmCommand?: string[],\n\tupdatePackageName = getDefaultUpdatePackageName(installedPackageName, updateSpec),\n): SelfUpdateCommand | undefined {\n\tconst uninstallAfterInstall = isDirectPackageArtifactSpec(updateSpec);\n\tswitch (method) {\n\t\tcase \"bun-binary\":\n\t\tcase \"homebrew\":\n\t\t\treturn undefined;\n\t\tcase \"pnpm\":\n\t\t\treturn makeSelfUpdateCommand(\n\t\t\t\tmakeSelfUpdateCommandStep(\"pnpm\", [\"install\", \"-g\", updateSpec]),\n\t\t\t\tupdatePackageName === installedPackageName\n\t\t\t\t\t? undefined\n\t\t\t\t\t: makeSelfUpdateCommandStep(\"pnpm\", [\"remove\", \"-g\", installedPackageName]),\n\t\t\t\t{ uninstallAfterInstall },\n\t\t\t);\n\t\tcase \"yarn\":\n\t\t\treturn makeSelfUpdateCommand(\n\t\t\t\tmakeSelfUpdateCommandStep(\"yarn\", [\"global\", \"add\", updateSpec]),\n\t\t\t\tupdatePackageName === installedPackageName\n\t\t\t\t\t? undefined\n\t\t\t\t\t: makeSelfUpdateCommandStep(\"yarn\", [\"global\", \"remove\", installedPackageName]),\n\t\t\t\t{ uninstallAfterInstall },\n\t\t\t);\n\t\tcase \"bun\":\n\t\t\treturn makeSelfUpdateCommand(\n\t\t\t\tmakeSelfUpdateCommandStep(\"bun\", [\"install\", \"-g\", updateSpec]),\n\t\t\t\tupdatePackageName === installedPackageName\n\t\t\t\t\t? undefined\n\t\t\t\t\t: makeSelfUpdateCommandStep(\"bun\", [\"uninstall\", \"-g\", installedPackageName]),\n\t\t\t\t{ uninstallAfterInstall },\n\t\t\t);\n\t\tcase \"npm\": {\n\t\t\tconst [command = \"npm\", ...npmArgs] = npmCommand ?? [];\n\t\t\tconst inferred = npmCommand?.length ? undefined : getInferredNpmInstall();\n\t\t\tconst prefixArgs = [...npmArgs, ...(inferred ? [\"--prefix\", inferred.prefix] : [])];\n\t\t\tconst installStep = makeSelfUpdateCommandStep(command, [...prefixArgs, \"install\", \"-g\", updateSpec]);\n\t\t\tconst uninstallStep =\n\t\t\t\tupdatePackageName === installedPackageName\n\t\t\t\t\t? undefined\n\t\t\t\t\t: makeSelfUpdateCommandStep(command, [...prefixArgs, \"uninstall\", \"-g\", installedPackageName]);\n\t\t\treturn makeSelfUpdateCommand(installStep, uninstallStep, { uninstallAfterInstall });\n\t\t}\n\t\tcase \"unknown\":\n\t\t\treturn undefined;\n\t}\n}\n\nfunction readCommandOutput(\n\tcommand: string,\n\targs: string[],\n\toptions: { requireSuccess?: boolean } = {},\n): string | undefined {\n\tconst result = spawnSync(command, args, {\n\t\tencoding: \"utf-8\",\n\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\tshell: shouldUseWindowsShell(command),\n\t});\n\tif (result.status === 0) return result.stdout.trim() || undefined;\n\tif (options.requireSuccess) {\n\t\tconst reason = result.error?.message || result.stderr.trim() || `exit code ${result.status ?? \"unknown\"}`;\n\t\tthrow new Error(`Failed to run ${[command, ...args].join(\" \")}: ${reason}`);\n\t}\n\treturn undefined;\n}\n\nfunction getGlobalPackageRoots(method: InstallMethod, _packageName: string, npmCommand?: string[]): string[] {\n\tswitch (method) {\n\t\tcase \"npm\": {\n\t\t\tconst configured = !!npmCommand?.length;\n\t\t\tconst [command = \"npm\", ...npmArgs] = npmCommand ?? [];\n\t\t\tif (configured && command === \"bun\") {\n\t\t\t\tconst bunBin = readCommandOutput(command, [...npmArgs, \"pm\", \"bin\", \"-g\"], {\n\t\t\t\t\trequireSuccess: true,\n\t\t\t\t});\n\t\t\t\tconst roots = [join(homedir(), \".bun\", \"install\", \"global\", \"node_modules\")];\n\t\t\t\tif (bunBin) {\n\t\t\t\t\troots.push(join(dirname(bunBin), \"install\", \"global\", \"node_modules\"));\n\t\t\t\t}\n\t\t\t\treturn roots;\n\t\t\t}\n\t\t\tconst root = readCommandOutput(command, [...npmArgs, \"root\", \"-g\"], {\n\t\t\t\trequireSuccess: configured,\n\t\t\t});\n\t\t\tconst inferred = configured ? undefined : getInferredNpmInstall();\n\t\t\treturn [root, inferred?.root].filter((x): x is string => !!x);\n\t\t}\n\t\tcase \"pnpm\": {\n\t\t\tconst root = readCommandOutput(\"pnpm\", [\"root\", \"-g\"]);\n\t\t\treturn root ? [root, dirname(root)] : [];\n\t\t}\n\t\tcase \"yarn\": {\n\t\t\tconst dir = readCommandOutput(\"yarn\", [\"global\", \"dir\"]);\n\t\t\treturn dir ? [dir, join(dir, \"node_modules\")] : [];\n\t\t}\n\t\tcase \"bun\": {\n\t\t\tconst bunBin = readCommandOutput(\"bun\", [\"pm\", \"bin\", \"-g\"]);\n\t\t\tconst roots = [join(homedir(), \".bun\", \"install\", \"global\", \"node_modules\")];\n\t\t\tif (bunBin) {\n\t\t\t\troots.push(join(dirname(bunBin), \"install\", \"global\", \"node_modules\"));\n\t\t\t}\n\t\t\treturn roots;\n\t\t}\n\t\tcase \"bun-binary\":\n\t\tcase \"homebrew\":\n\t\tcase \"unknown\":\n\t\t\treturn [];\n\t}\n}\n\nfunction normalizeExistingPathForComparison(path: string): string | undefined {\n\tconst resolvedPath = resolve(path);\n\tif (!existsSync(resolvedPath)) {\n\t\treturn undefined;\n\t}\n\tlet normalizedPath: string;\n\ttry {\n\t\tnormalizedPath = realpathSync(resolvedPath);\n\t} catch {\n\t\treturn undefined;\n\t}\n\tif (process.platform === \"win32\") {\n\t\tnormalizedPath = normalizedPath.toLowerCase();\n\t}\n\treturn normalizedPath;\n}\n\nfunction isSelfUpdatePathWritable(): boolean {\n\tconst packageDir = getPackageDir();\n\ttry {\n\t\taccessSync(packageDir, constants.W_OK);\n\t\taccessSync(dirname(packageDir), constants.W_OK);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction isManagedByGlobalPackageManager(method: InstallMethod, packageName: string, npmCommand?: string[]): boolean {\n\tconst packageDir = normalizeExistingPathForComparison(getPackageDir());\n\treturn (\n\t\t!!packageDir &&\n\t\tgetGlobalPackageRoots(method, packageName, npmCommand).some((root) => {\n\t\t\tconst normalizedRoot = normalizeExistingPathForComparison(root);\n\t\t\treturn (\n\t\t\t\t!!normalizedRoot &&\n\t\t\t\tpackageDir.startsWith(normalizedRoot.endsWith(sep) ? normalizedRoot : `${normalizedRoot}${sep}`)\n\t\t\t);\n\t\t})\n\t);\n}\n\nexport function getSelfUpdateCommand(\n\tpackageName: string,\n\tnpmCommand?: string[],\n\tupdateSpec = packageName,\n\tupdatePackageName = getDefaultUpdatePackageName(packageName, updateSpec),\n): SelfUpdateCommand | undefined {\n\tconst method = detectInstallMethod();\n\tconst command = getSelfUpdateCommandForMethod(method, packageName, updateSpec, npmCommand, updatePackageName);\n\tif (!command || !isManagedByGlobalPackageManager(method, packageName, npmCommand) || !isSelfUpdatePathWritable()) {\n\t\treturn undefined;\n\t}\n\treturn command;\n}\n\nexport function getSelfUpdateUnavailableInstruction(\n\tpackageName: string,\n\tnpmCommand?: string[],\n\tupdateSpec = packageName,\n\tupdatePackageName = getDefaultUpdatePackageName(packageName, updateSpec),\n): string {\n\tconst method = detectInstallMethod();\n\tif (method === \"bun-binary\") {\n\t\treturn `Download from: https://github.com/AletheionAGI/asm-agent/releases/latest`;\n\t}\n\tif (method === \"homebrew\") {\n\t\treturn `Update with: brew upgrade ${APP_NAME}`;\n\t}\n\tconst command = getSelfUpdateCommandForMethod(method, packageName, updateSpec, npmCommand, updatePackageName);\n\tif (command) {\n\t\tif (isManagedByGlobalPackageManager(method, packageName, npmCommand) && !isSelfUpdatePathWritable()) {\n\t\t\treturn `This installation is managed by a global ${method} install, but the install path is not writable. Update it yourself with: ${command.display}`;\n\t\t}\n\t\treturn `This installation is not managed by a global ${method} install. Update it with the package manager, wrapper, or source checkout that provides it.`;\n\t}\n\treturn `Update ${updateSpec} using the package manager, wrapper, or source checkout that provides this installation.`;\n}\n\nexport function getUpdateInstruction(packageName: string): string {\n\tconst method = detectInstallMethod();\n\tconst command = getSelfUpdateCommandForMethod(method, packageName);\n\tif (command) {\n\t\treturn `Run: ${command.display}`;\n\t}\n\treturn getSelfUpdateUnavailableInstruction(packageName);\n}\n\n// =============================================================================\n// Package Asset Paths (shipped with executable)\n// =============================================================================\n\n/**\n * Get the base directory for resolving package assets (themes, package.json, README.md, CHANGELOG.md).\n * - For Bun binary: returns the directory containing the executable\n * - For Node.js (dist/): returns __dirname (the dist/ directory)\n * - For tsx (src/): returns parent directory (the package root)\n */\nexport function getPackageDir(): string {\n\t// Allow override via environment variable (useful for Nix/Guix where store paths tokenize poorly)\n\tconst envDir = process.env.PI_PACKAGE_DIR;\n\tif (envDir) {\n\t\tif (envDir === \"~\") return homedir();\n\t\tif (envDir.startsWith(\"~/\")) return homedir() + envDir.slice(1);\n\t\treturn envDir;\n\t}\n\n\tif (isBunBinary) {\n\t\t// Bun binary: process.execPath points to the compiled executable\n\t\treturn dirname(process.execPath);\n\t}\n\t// Node.js: walk up from __dirname until we find package.json\n\tlet dir = __dirname;\n\twhile (dir !== dirname(dir)) {\n\t\tif (existsSync(join(dir, \"package.json\"))) {\n\t\t\treturn dir;\n\t\t}\n\t\tdir = dirname(dir);\n\t}\n\t// Fallback (shouldn't happen)\n\treturn __dirname;\n}\n\n/**\n * Get path to built-in themes directory (shipped with package)\n * - For Bun binary: theme/ next to executable\n * - For Node.js (dist/): dist/modes/interactive/theme/\n * - For tsx (src/): src/modes/interactive/theme/\n */\nexport function getThemesDir(): string {\n\tif (isBunBinary) {\n\t\treturn join(getPackageDir(), \"theme\");\n\t}\n\t// Theme is in modes/interactive/theme/ relative to src/ or dist/\n\tconst packageDir = getPackageDir();\n\tconst srcOrDist = existsSync(join(packageDir, \"src\")) ? \"src\" : \"dist\";\n\treturn join(packageDir, srcOrDist, \"modes\", \"interactive\", \"theme\");\n}\n\n/**\n * Get path to HTML export template directory (shipped with package)\n * - For Bun binary: export-html/ next to executable\n * - For Node.js (dist/): dist/core/export-html/\n * - For tsx (src/): src/core/export-html/\n */\nexport function getExportTemplateDir(): string {\n\tif (isBunBinary) {\n\t\treturn join(getPackageDir(), \"export-html\");\n\t}\n\tconst packageDir = getPackageDir();\n\tconst srcOrDist = existsSync(join(packageDir, \"src\")) ? \"src\" : \"dist\";\n\treturn join(packageDir, srcOrDist, \"core\", \"export-html\");\n}\n\n/** Get path to package.json */\nexport function getPackageJsonPath(): string {\n\treturn join(getPackageDir(), \"package.json\");\n}\n\n/** Get path to docs directory */\nexport function getDocsPath(): string {\n\treturn resolve(join(getPackageDir(), \"docs\"));\n}\n\n/** Get path to CHANGELOG.md */\nexport function getChangelogPath(): string {\n\treturn resolve(join(getPackageDir(), \"CHANGELOG.md\"));\n}\n\n/**\n * Get path to built-in interactive assets directory.\n * - For Bun binary: assets/ next to executable\n * - For Node.js (dist/): dist/modes/interactive/assets/\n * - For tsx (src/): src/modes/interactive/assets/\n */\nexport function getInteractiveAssetsDir(): string {\n\tif (isBunBinary) {\n\t\treturn join(getPackageDir(), \"assets\");\n\t}\n\tconst packageDir = getPackageDir();\n\tconst srcOrDist = existsSync(join(packageDir, \"src\")) ? \"src\" : \"dist\";\n\treturn join(packageDir, srcOrDist, \"modes\", \"interactive\", \"assets\");\n}\n\n/** Get path to a bundled interactive asset */\nexport function getBundledInteractiveAssetPath(name: string): string {\n\treturn join(getInteractiveAssetsDir(), name);\n}\n\n/**\n * Get the directory containing built-in skills shipped with the package.\n * - For Bun binary: skills/ next to executable\n * - For Node.js (dist/): dist/skills/\n * - For tsx (src/): skills/ at the package root\n */\nexport function getBundledSkillsDir(): string {\n\tif (isBunBinary) {\n\t\treturn join(getPackageDir(), \"skills\");\n\t}\n\tconst packageDir = getPackageDir();\n\t// Source checkouts (tsx) keep built-in skills at the package root; built\n\t// packages copy them to dist/skills. Decide by whether src/ is present so a\n\t// stale dist/ from a prior build never shadows live source edits.\n\tconst isSourceCheckout = existsSync(join(packageDir, \"src\"));\n\treturn isSourceCheckout ? join(packageDir, \"skills\") : join(packageDir, \"dist\", \"skills\");\n}\n\n// =============================================================================\n// App Config (from package.json asmAgentConfig)\n// =============================================================================\n\ninterface PackageJson {\n\tname?: string;\n\tversion?: string;\n\tasmAgentConfig?: {\n\t\tname?: string;\n\t\tconfigDir?: string;\n\t};\n}\n\nconst pkg = JSON.parse(readFileSync(getPackageJsonPath(), \"utf-8\")) as PackageJson;\n\nconst configuredAppName: string | undefined = pkg.asmAgentConfig?.name;\nconst envPrefix =\n\t(configuredAppName || \"asm-agent\")\n\t\t.toUpperCase()\n\t\t.replace(/[^A-Z0-9]+/g, \"_\")\n\t\t.replace(/^_+|_+$/g, \"\") || \"PI\";\nexport const PACKAGE_NAME: string = pkg.name || \"@asm-agent/coding-agent\";\nexport const APP_NAME: string = configuredAppName || \"asm-agent\";\nexport const APP_TITLE: string = \"ASM Agent\";\nexport const CONFIG_DIR_NAME: string = pkg.asmAgentConfig?.configDir || \".asm-agent\";\nexport const VERSION: string = pkg.version || \"0.0.0\";\n\n// e.g., PI_CODING_AGENT_DIR or ASM_AGENT_CODING_AGENT_DIR\nexport const ENV_AGENT_DIR = `${envPrefix}_CODING_AGENT_DIR`;\nexport const ENV_SESSION_DIR = `${envPrefix}_SESSION_DIR`;\nexport const ENV_LEGACY_SESSION_DIR = `${envPrefix}_CODING_AGENT_SESSION_DIR`;\n\nexport function expandTildePath(path: string): string {\n\tif (path === \"~\") return homedir();\n\tif (path.startsWith(\"~/\")) return homedir() + path.slice(1);\n\treturn path;\n}\n\nconst DEFAULT_SHARE_VIEWER_URL = \"https://pi.dev/session/\";\n\n/** Get the share viewer URL for a gist ID */\nexport function getShareViewerUrl(gistId: string): string {\n\tconst baseUrl = process.env.PI_SHARE_VIEWER_URL || DEFAULT_SHARE_VIEWER_URL;\n\treturn `${baseUrl}#${gistId}`;\n}\n\n// =============================================================================\n// User Config Paths (~/.asm-agent/*)\n// =============================================================================\n\n/** Get the agent config directory (e.g., ~/.asm-agent/) */\nexport function getAgentDir(): string {\n\tconst envDir = process.env[ENV_AGENT_DIR];\n\tif (envDir) {\n\t\treturn expandTildePath(envDir);\n\t}\n\treturn join(homedir(), CONFIG_DIR_NAME);\n}\n\n/** Get path to user's custom themes directory */\nexport function getCustomThemesDir(): string {\n\treturn join(getAgentDir(), \"themes\");\n}\n\n/** Directory where daemon and client diagnostic logs are written (e.g. ~/.asm-agent/logs/). */\nexport function getLogsDir(): string {\n\treturn join(getAgentDir(), \"logs\");\n}\n\n/** Log file capturing client-side agent-open failures. */\nexport function getClientErrorLogPath(): string {\n\treturn join(getLogsDir(), \"client-errors.log\");\n}\n\nexport function getAgentTracesLogPath(): string {\n\treturn join(getLogsDir(), \"agent-traces.log\");\n}\n\n/** Shared structured (JSON lines) log for client, daemon, and provider diagnostics. */\nexport function getAgentLogPath(): string {\n\treturn join(getLogsDir(), \"agent.jsonl\");\n}\n\n/**\n * Log file for a daemon. The basename keeps it readable; a hash of the full\n * socket path makes it unique so two sockets that share a basename (e.g.\n * daemon.sock in different dirs) don't interleave into one file.\n */\nexport function getDaemonLogPath(socketPath: string): string {\n\tconst normalized = normalizeSocketPath(socketPath);\n\tconst hash = createHash(\"sha256\").update(normalized).digest(\"hex\").slice(0, 8);\n\treturn join(getLogsDir(), `${basename(normalized)}.${hash}.log`);\n}\n\nexport function getDaemonUpdateRestartManifestPath(socketPath: string, agentDir: string = getAgentDir()): string {\n\tconst normalizedSocketPath = normalizeSocketPath(socketPath);\n\tconst socketHash = createHash(\"sha256\").update(normalizedSocketPath).digest(\"hex\");\n\treturn join(agentDir, \"daemon-update-restarts\", `${socketHash}.json`);\n}\n\nexport function getLegacyDaemonUpdateRestartManifestPath(agentDir: string = getAgentDir()): string {\n\treturn join(agentDir, \"daemon-update-restart.json\");\n}\n\nconst MAX_LOG_BYTES = 5 * 1024 * 1024;\n\n/**\n * Append a line to a log file, keeping its size bounded with a single-generation\n * rotation. Opens and closes per call (no held fd), so rotation works at runtime\n * — a long-lived writer rotates on the write that crosses the cap, not only at\n * startup. Best-effort: diagnostics must never throw into the caller.\n */\nexport function appendRotatingLog(logPath: string, message: string, maxBytes: number = MAX_LOG_BYTES): void {\n\ttry {\n\t\tmkdirSync(dirname(logPath), { recursive: true });\n\t\ttry {\n\t\t\tif (existsSync(logPath) && statSync(logPath).size > maxBytes) {\n\t\t\t\t// Drop any prior .old first: renameSync fails on Windows if it exists.\n\t\t\t\trmSync(`${logPath}.old`, { force: true });\n\t\t\t\trenameSync(logPath, `${logPath}.old`);\n\t\t\t}\n\t\t} catch {\n\t\t\t// Keep appending rather than dropping the log on a rotation failure.\n\t\t}\n\t\tappendFileSync(logPath, `${message}\\n`);\n\t} catch {\n\t\t// A read-only or missing log dir must never break the caller.\n\t}\n}\n\n/** Get path to auth.json */\nexport function getAuthPath(): string {\n\treturn join(getAgentDir(), \"auth.json\");\n}\n\n/** Get path to cron jobs store */\nexport function getCronJobsPath(agentDir: string = getAgentDir()): string {\n\treturn join(agentDir, \"cron-jobs.json\");\n}\n\n/** Get path to managed binaries directory (fd, rg) */\nexport function getBinDir(): string {\n\treturn join(getAgentDir(), \"bin\");\n}\n\n/** Get path to sessions directory */\nexport function getSessionsDir(agentDir: string = getAgentDir()): string {\n\tconst envDir = getSessionDirEnvOverride();\n\tif (envDir) {\n\t\treturn envDir;\n\t}\n\treturn join(agentDir, \"sessions\");\n}\n\nexport function getSessionDirEnvOverride(): string | undefined {\n\tconst envDir = process.env[ENV_SESSION_DIR] ?? process.env[ENV_LEGACY_SESSION_DIR];\n\treturn envDir ? expandTildePath(envDir) : undefined;\n}\n\n/** Get path to debug log file */\nexport function getDebugLogPath(): string {\n\treturn join(getAgentDir(), `${APP_NAME}-debug.log`);\n}\n"]}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawnSync } from \"child_process\";\nimport { createHash } from \"crypto\";\nimport {\n\taccessSync,\n\tappendFileSync,\n\tconstants,\n\texistsSync,\n\tmkdirSync,\n\treadFileSync,\n\trealpathSync,\n\trenameSync,\n\trmSync,\n\tstatSync,\n} from \"fs\";\nimport { homedir } from \"os\";\nimport { basename, dirname, join, resolve, sep, win32 } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { shouldUseWindowsShell } from \"./utils/child-process.js\";\nimport { normalizeSocketPath } from \"./utils/daemon-socket-path.js\";\n\n// =============================================================================\n// Package Detection\n// =============================================================================\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Detect if we're running as a Bun compiled binary.\n * Bun binaries have import.meta.url containing \"$bunfs\", \"~BUN\", or \"%7EBUN\" (Bun's virtual filesystem path)\n */\nexport const isBunBinary =\n\timport.meta.url.includes(\"$bunfs\") || import.meta.url.includes(\"~BUN\") || import.meta.url.includes(\"%7EBUN\");\n\n/** Detect if Bun is the runtime (compiled binary or bun run) */\nexport const isBunRuntime = !!process.versions.bun;\n\nexport const SELF_UPDATE_INTERACTIVE_CHILD_ENV = \"ASM_AGENT_INTERACTIVE_SELF_UPDATE\";\nexport const SELF_UPDATE_NOT_ATTEMPTED_EXIT_CODE = 75;\n\n// =============================================================================\n// Install Method Detection\n// =============================================================================\n\nexport type InstallMethod = \"bun-binary\" | \"homebrew\" | \"npm\" | \"pnpm\" | \"yarn\" | \"bun\" | \"unknown\";\n\ninterface SelfUpdateCommandStep {\n\tcommand: string;\n\targs: string[];\n\tdisplay: string;\n}\n\nexport interface SelfUpdateCommand extends SelfUpdateCommandStep {\n\tsteps?: SelfUpdateCommandStep[];\n}\n\nfunction makeSelfUpdateCommand(\n\tinstallStep: SelfUpdateCommandStep,\n\tuninstallStep?: SelfUpdateCommandStep,\n\toptions: { uninstallAfterInstall?: boolean } = {},\n): SelfUpdateCommand {\n\tif (!uninstallStep) return installStep;\n\tif (options.uninstallAfterInstall) {\n\t\treturn {\n\t\t\t...installStep,\n\t\t\tdisplay: `${installStep.display} && ${uninstallStep.display}`,\n\t\t\tsteps: [installStep, uninstallStep],\n\t\t};\n\t}\n\treturn {\n\t\t...installStep,\n\t\tdisplay: `${uninstallStep.display} && ${installStep.display}`,\n\t\tsteps: [uninstallStep, installStep],\n\t};\n}\n\nfunction makeSelfUpdateCommandStep(command: string, args: string[]): SelfUpdateCommandStep {\n\treturn {\n\t\tcommand,\n\t\targs,\n\t\tdisplay: [command, ...args].map((arg) => (/\\s/.test(arg) ? `\"${arg}\"` : arg)).join(\" \"),\n\t};\n}\n\nexport function detectInstallMethod(): InstallMethod {\n\tif (isBunBinary) {\n\t\treturn \"bun-binary\";\n\t}\n\tif (isHomebrewInstall()) {\n\t\treturn \"homebrew\";\n\t}\n\n\tconst resolvedPath = `${__dirname}\\0${process.execPath || \"\"}`.toLowerCase().replace(/\\\\/g, \"/\");\n\n\tif (resolvedPath.includes(\"/pnpm/\") || resolvedPath.includes(\"/.pnpm/\")) {\n\t\treturn \"pnpm\";\n\t}\n\tif (resolvedPath.includes(\"/yarn/\") || resolvedPath.includes(\"/.yarn/\")) {\n\t\treturn \"yarn\";\n\t}\n\tif (isBunRuntime || resolvedPath.includes(\"/install/global/node_modules/\")) {\n\t\treturn \"bun\";\n\t}\n\tif (resolvedPath.includes(\"/npm/\") || resolvedPath.includes(\"/node_modules/\")) {\n\t\treturn \"npm\";\n\t}\n\n\treturn \"unknown\";\n}\n\nfunction isHomebrewInstall(): boolean {\n\tconst packageDir = getPackageDir().toLowerCase().replace(/\\\\/g, \"/\");\n\treturn packageDir.includes(\"/cellar/\") && packageDir.includes(\"/libexec/lib/node_modules/\");\n}\n\nfunction getInferredNpmInstall(): { root: string; prefix: string } | undefined {\n\tconst packageDir = getPackageDir();\n\tconst path = process.platform === \"win32\" || packageDir.includes(\"\\\\\") ? win32 : { basename, dirname };\n\tconst parent = path.dirname(packageDir);\n\tlet root: string | undefined;\n\tif (path.basename(parent).startsWith(\"@\") && path.basename(path.dirname(parent)) === \"node_modules\") {\n\t\troot = path.dirname(parent);\n\t} else if (path.basename(parent) === \"node_modules\") {\n\t\troot = parent;\n\t}\n\tif (!root) return undefined;\n\tconst rootParent = path.dirname(root);\n\tif (path.basename(rootParent) === \"lib\") return { root, prefix: path.dirname(rootParent) };\n\t// Windows global npm prefixes use `<prefix>\\\\node_modules`, which is\n\t// indistinguishable from local project installs by path shape alone. Do not\n\t// infer unsupported Windows custom prefixes without `npm root -g` evidence.\n\treturn undefined;\n}\n\nfunction isDirectPackageArtifactSpec(updateSpec: string): boolean {\n\tconst spec = updateSpec.trim().toLowerCase();\n\treturn (\n\t\tspec.startsWith(\"http://\") ||\n\t\tspec.startsWith(\"https://\") ||\n\t\tspec.startsWith(\"file:\") ||\n\t\tspec.endsWith(\".tgz\") ||\n\t\tspec.endsWith(\".tar.gz\")\n\t);\n}\n\nfunction getDefaultUpdatePackageName(installedPackageName: string, updateSpec: string): string {\n\tif (isDirectPackageArtifactSpec(updateSpec)) {\n\t\treturn installedPackageName;\n\t}\n\treturn updateSpec;\n}\n\nfunction getSelfUpdateCommandForMethod(\n\tmethod: InstallMethod,\n\tinstalledPackageName: string,\n\tupdateSpec = installedPackageName,\n\tnpmCommand?: string[],\n\tupdatePackageName = getDefaultUpdatePackageName(installedPackageName, updateSpec),\n): SelfUpdateCommand | undefined {\n\tconst uninstallAfterInstall = isDirectPackageArtifactSpec(updateSpec);\n\tswitch (method) {\n\t\tcase \"bun-binary\":\n\t\tcase \"homebrew\":\n\t\t\treturn undefined;\n\t\tcase \"pnpm\":\n\t\t\treturn makeSelfUpdateCommand(\n\t\t\t\tmakeSelfUpdateCommandStep(\"pnpm\", [\"install\", \"-g\", updateSpec]),\n\t\t\t\tupdatePackageName === installedPackageName\n\t\t\t\t\t? undefined\n\t\t\t\t\t: makeSelfUpdateCommandStep(\"pnpm\", [\"remove\", \"-g\", installedPackageName]),\n\t\t\t\t{ uninstallAfterInstall },\n\t\t\t);\n\t\tcase \"yarn\":\n\t\t\treturn makeSelfUpdateCommand(\n\t\t\t\tmakeSelfUpdateCommandStep(\"yarn\", [\"global\", \"add\", updateSpec]),\n\t\t\t\tupdatePackageName === installedPackageName\n\t\t\t\t\t? undefined\n\t\t\t\t\t: makeSelfUpdateCommandStep(\"yarn\", [\"global\", \"remove\", installedPackageName]),\n\t\t\t\t{ uninstallAfterInstall },\n\t\t\t);\n\t\tcase \"bun\":\n\t\t\treturn makeSelfUpdateCommand(\n\t\t\t\tmakeSelfUpdateCommandStep(\"bun\", [\"install\", \"-g\", updateSpec]),\n\t\t\t\tupdatePackageName === installedPackageName\n\t\t\t\t\t? undefined\n\t\t\t\t\t: makeSelfUpdateCommandStep(\"bun\", [\"uninstall\", \"-g\", installedPackageName]),\n\t\t\t\t{ uninstallAfterInstall },\n\t\t\t);\n\t\tcase \"npm\": {\n\t\t\tconst [command = \"npm\", ...npmArgs] = npmCommand ?? [];\n\t\t\tconst inferred = npmCommand?.length ? undefined : getInferredNpmInstall();\n\t\t\tconst prefixArgs = [...npmArgs, ...(inferred ? [\"--prefix\", inferred.prefix] : [])];\n\t\t\tconst installStep = makeSelfUpdateCommandStep(command, [...prefixArgs, \"install\", \"-g\", updateSpec]);\n\t\t\tconst uninstallStep =\n\t\t\t\tupdatePackageName === installedPackageName\n\t\t\t\t\t? undefined\n\t\t\t\t\t: makeSelfUpdateCommandStep(command, [...prefixArgs, \"uninstall\", \"-g\", installedPackageName]);\n\t\t\treturn makeSelfUpdateCommand(installStep, uninstallStep, { uninstallAfterInstall });\n\t\t}\n\t\tcase \"unknown\":\n\t\t\treturn undefined;\n\t}\n}\n\nfunction readCommandOutput(\n\tcommand: string,\n\targs: string[],\n\toptions: { requireSuccess?: boolean } = {},\n): string | undefined {\n\tconst result = spawnSync(command, args, {\n\t\tencoding: \"utf-8\",\n\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\tshell: shouldUseWindowsShell(command),\n\t});\n\tif (result.status === 0) return result.stdout.trim() || undefined;\n\tif (options.requireSuccess) {\n\t\tconst reason = result.error?.message || result.stderr.trim() || `exit code ${result.status ?? \"unknown\"}`;\n\t\tthrow new Error(`Failed to run ${[command, ...args].join(\" \")}: ${reason}`);\n\t}\n\treturn undefined;\n}\n\nfunction getGlobalPackageRoots(method: InstallMethod, _packageName: string, npmCommand?: string[]): string[] {\n\tswitch (method) {\n\t\tcase \"npm\": {\n\t\t\tconst configured = !!npmCommand?.length;\n\t\t\tconst [command = \"npm\", ...npmArgs] = npmCommand ?? [];\n\t\t\tif (configured && command === \"bun\") {\n\t\t\t\tconst bunBin = readCommandOutput(command, [...npmArgs, \"pm\", \"bin\", \"-g\"], {\n\t\t\t\t\trequireSuccess: true,\n\t\t\t\t});\n\t\t\t\tconst roots = [join(homedir(), \".bun\", \"install\", \"global\", \"node_modules\")];\n\t\t\t\tif (bunBin) {\n\t\t\t\t\troots.push(join(dirname(bunBin), \"install\", \"global\", \"node_modules\"));\n\t\t\t\t}\n\t\t\t\treturn roots;\n\t\t\t}\n\t\t\tconst root = readCommandOutput(command, [...npmArgs, \"root\", \"-g\"], {\n\t\t\t\trequireSuccess: configured,\n\t\t\t});\n\t\t\tconst inferred = configured ? undefined : getInferredNpmInstall();\n\t\t\treturn [root, inferred?.root].filter((x): x is string => !!x);\n\t\t}\n\t\tcase \"pnpm\": {\n\t\t\tconst root = readCommandOutput(\"pnpm\", [\"root\", \"-g\"]);\n\t\t\treturn root ? [root, dirname(root)] : [];\n\t\t}\n\t\tcase \"yarn\": {\n\t\t\tconst dir = readCommandOutput(\"yarn\", [\"global\", \"dir\"]);\n\t\t\treturn dir ? [dir, join(dir, \"node_modules\")] : [];\n\t\t}\n\t\tcase \"bun\": {\n\t\t\tconst bunBin = readCommandOutput(\"bun\", [\"pm\", \"bin\", \"-g\"]);\n\t\t\tconst roots = [join(homedir(), \".bun\", \"install\", \"global\", \"node_modules\")];\n\t\t\tif (bunBin) {\n\t\t\t\troots.push(join(dirname(bunBin), \"install\", \"global\", \"node_modules\"));\n\t\t\t}\n\t\t\treturn roots;\n\t\t}\n\t\tcase \"bun-binary\":\n\t\tcase \"homebrew\":\n\t\tcase \"unknown\":\n\t\t\treturn [];\n\t}\n}\n\nfunction normalizeExistingPathForComparison(path: string): string | undefined {\n\tconst resolvedPath = resolve(path);\n\tif (!existsSync(resolvedPath)) {\n\t\treturn undefined;\n\t}\n\tlet normalizedPath: string;\n\ttry {\n\t\tnormalizedPath = realpathSync(resolvedPath);\n\t} catch {\n\t\treturn undefined;\n\t}\n\tif (process.platform === \"win32\") {\n\t\tnormalizedPath = normalizedPath.toLowerCase();\n\t}\n\treturn normalizedPath;\n}\n\nfunction isSelfUpdatePathWritable(): boolean {\n\tconst packageDir = getPackageDir();\n\ttry {\n\t\taccessSync(packageDir, constants.W_OK);\n\t\taccessSync(dirname(packageDir), constants.W_OK);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction isManagedByGlobalPackageManager(method: InstallMethod, packageName: string, npmCommand?: string[]): boolean {\n\tconst packageDir = normalizeExistingPathForComparison(getPackageDir());\n\treturn (\n\t\t!!packageDir &&\n\t\tgetGlobalPackageRoots(method, packageName, npmCommand).some((root) => {\n\t\t\tconst normalizedRoot = normalizeExistingPathForComparison(root);\n\t\t\treturn (\n\t\t\t\t!!normalizedRoot &&\n\t\t\t\tpackageDir.startsWith(normalizedRoot.endsWith(sep) ? normalizedRoot : `${normalizedRoot}${sep}`)\n\t\t\t);\n\t\t})\n\t);\n}\n\nexport function getSelfUpdateCommand(\n\tpackageName: string,\n\tnpmCommand?: string[],\n\tupdateSpec = packageName,\n\tupdatePackageName = getDefaultUpdatePackageName(packageName, updateSpec),\n): SelfUpdateCommand | undefined {\n\tconst method = detectInstallMethod();\n\tconst command = getSelfUpdateCommandForMethod(method, packageName, updateSpec, npmCommand, updatePackageName);\n\tif (!command || !isManagedByGlobalPackageManager(method, packageName, npmCommand) || !isSelfUpdatePathWritable()) {\n\t\treturn undefined;\n\t}\n\treturn command;\n}\n\nexport function getSelfUpdateUnavailableInstruction(\n\tpackageName: string,\n\tnpmCommand?: string[],\n\tupdateSpec = packageName,\n\tupdatePackageName = getDefaultUpdatePackageName(packageName, updateSpec),\n): string {\n\tconst method = detectInstallMethod();\n\tif (method === \"bun-binary\") {\n\t\treturn `Download from: https://github.com/AletheionAGI/asm-agent/releases/latest`;\n\t}\n\tif (method === \"homebrew\") {\n\t\treturn `Update with: brew upgrade ${APP_NAME}`;\n\t}\n\tconst command = getSelfUpdateCommandForMethod(method, packageName, updateSpec, npmCommand, updatePackageName);\n\tif (command) {\n\t\tif (isManagedByGlobalPackageManager(method, packageName, npmCommand) && !isSelfUpdatePathWritable()) {\n\t\t\treturn `This installation is managed by a global ${method} install, but the install path is not writable. Update it yourself with: ${command.display}`;\n\t\t}\n\t\treturn `This installation is not managed by a global ${method} install. Update it with the package manager, wrapper, or source checkout that provides it.`;\n\t}\n\treturn `Update ${updateSpec} using the package manager, wrapper, or source checkout that provides this installation.`;\n}\n\nexport function getUpdateInstruction(packageName: string): string {\n\tconst method = detectInstallMethod();\n\tconst command = getSelfUpdateCommandForMethod(method, packageName);\n\tif (command) {\n\t\treturn `Run: ${command.display}`;\n\t}\n\treturn getSelfUpdateUnavailableInstruction(packageName);\n}\n\n// =============================================================================\n// Package Asset Paths (shipped with executable)\n// =============================================================================\n\n/**\n * Get the base directory for resolving package assets (themes, package.json, README.md, CHANGELOG.md).\n * - For Bun binary: returns the directory containing the executable\n * - For Node.js (dist/): returns __dirname (the dist/ directory)\n * - For tsx (src/): returns parent directory (the package root)\n */\nexport function getPackageDir(): string {\n\t// Allow override via environment variable (useful for Nix/Guix where store paths tokenize poorly)\n\tconst envDir = process.env.PI_PACKAGE_DIR;\n\tif (envDir) {\n\t\tif (envDir === \"~\") return homedir();\n\t\tif (envDir.startsWith(\"~/\")) return homedir() + envDir.slice(1);\n\t\treturn envDir;\n\t}\n\n\tif (isBunBinary) {\n\t\t// Bun binary: process.execPath points to the compiled executable\n\t\treturn dirname(process.execPath);\n\t}\n\t// Node.js: walk up from __dirname until we find package.json\n\tlet dir = __dirname;\n\twhile (dir !== dirname(dir)) {\n\t\tif (existsSync(join(dir, \"package.json\"))) {\n\t\t\treturn dir;\n\t\t}\n\t\tdir = dirname(dir);\n\t}\n\t// Fallback (shouldn't happen)\n\treturn __dirname;\n}\n\n/**\n * Get path to built-in themes directory (shipped with package)\n * - For Bun binary: theme/ next to executable\n * - For Node.js (dist/): dist/modes/interactive/theme/\n * - For tsx (src/): src/modes/interactive/theme/\n */\nexport function getThemesDir(): string {\n\tif (isBunBinary) {\n\t\treturn join(getPackageDir(), \"theme\");\n\t}\n\t// Theme is in modes/interactive/theme/ relative to src/ or dist/\n\tconst packageDir = getPackageDir();\n\tconst srcOrDist = existsSync(join(packageDir, \"src\")) ? \"src\" : \"dist\";\n\treturn join(packageDir, srcOrDist, \"modes\", \"interactive\", \"theme\");\n}\n\n/**\n * Get path to HTML export template directory (shipped with package)\n * - For Bun binary: export-html/ next to executable\n * - For Node.js (dist/): dist/core/export-html/\n * - For tsx (src/): src/core/export-html/\n */\nexport function getExportTemplateDir(): string {\n\tif (isBunBinary) {\n\t\treturn join(getPackageDir(), \"export-html\");\n\t}\n\tconst packageDir = getPackageDir();\n\tconst srcOrDist = existsSync(join(packageDir, \"src\")) ? \"src\" : \"dist\";\n\treturn join(packageDir, srcOrDist, \"core\", \"export-html\");\n}\n\n/** Get path to package.json */\nexport function getPackageJsonPath(): string {\n\treturn join(getPackageDir(), \"package.json\");\n}\n\n/** Get path to docs directory */\nexport function getDocsPath(): string {\n\treturn resolve(join(getPackageDir(), \"docs\"));\n}\n\n/** Get path to CHANGELOG.md */\nexport function getChangelogPath(): string {\n\treturn resolve(join(getPackageDir(), \"CHANGELOG.md\"));\n}\n\n/**\n * Get path to built-in interactive assets directory.\n * - For Bun binary: assets/ next to executable\n * - For Node.js (dist/): dist/modes/interactive/assets/\n * - For tsx (src/): src/modes/interactive/assets/\n */\nexport function getInteractiveAssetsDir(): string {\n\tif (isBunBinary) {\n\t\treturn join(getPackageDir(), \"assets\");\n\t}\n\tconst packageDir = getPackageDir();\n\tconst srcOrDist = existsSync(join(packageDir, \"src\")) ? \"src\" : \"dist\";\n\treturn join(packageDir, srcOrDist, \"modes\", \"interactive\", \"assets\");\n}\n\n/** Get path to a bundled interactive asset */\nexport function getBundledInteractiveAssetPath(name: string): string {\n\treturn join(getInteractiveAssetsDir(), name);\n}\n\n/**\n * Get the directory containing built-in skills shipped with the package.\n * - For Bun binary: skills/ next to executable\n * - For Node.js (dist/): dist/skills/\n * - For tsx (src/): skills/ at the package root\n */\nexport function getBundledSkillsDir(): string {\n\tif (isBunBinary) {\n\t\treturn join(getPackageDir(), \"skills\");\n\t}\n\tconst packageDir = getPackageDir();\n\t// Source checkouts (tsx) keep built-in skills at the package root; built\n\t// packages copy them to dist/skills. Decide by whether src/ is present so a\n\t// stale dist/ from a prior build never shadows live source edits.\n\tconst isSourceCheckout = existsSync(join(packageDir, \"src\"));\n\treturn isSourceCheckout ? join(packageDir, \"skills\") : join(packageDir, \"dist\", \"skills\");\n}\n\n// =============================================================================\n// App Config (from package.json asmAgentConfig)\n// =============================================================================\n\ninterface PackageJson {\n\tname?: string;\n\tversion?: string;\n\tasmAgentConfig?: {\n\t\tname?: string;\n\t\tconfigDir?: string;\n\t};\n}\n\nconst pkg = JSON.parse(readFileSync(getPackageJsonPath(), \"utf-8\")) as PackageJson;\n\nconst configuredAppName: string | undefined = pkg.asmAgentConfig?.name;\nconst envPrefix =\n\t(configuredAppName || \"asm-agent\")\n\t\t.toUpperCase()\n\t\t.replace(/[^A-Z0-9]+/g, \"_\")\n\t\t.replace(/^_+|_+$/g, \"\") || \"PI\";\nexport const PACKAGE_NAME: string = pkg.name || \"@asm-agent/coding-agent\";\nexport const APP_NAME: string = configuredAppName || \"asm-agent\";\nexport const APP_TITLE: string = \"ASM Agent\";\nexport const CONFIG_DIR_NAME: string = pkg.asmAgentConfig?.configDir || \".asm-agent\";\nexport const VERSION: string = pkg.version || \"0.0.0\";\n\n// e.g., PI_CODING_AGENT_DIR or ASM_AGENT_CODING_AGENT_DIR\nexport const ENV_AGENT_DIR = `${envPrefix}_CODING_AGENT_DIR`;\nexport const ENV_SESSION_DIR = `${envPrefix}_SESSION_DIR`;\nexport const ENV_LEGACY_SESSION_DIR = `${envPrefix}_CODING_AGENT_SESSION_DIR`;\n\nexport function expandTildePath(path: string): string {\n\tif (path === \"~\") return homedir();\n\tif (path.startsWith(\"~/\")) return homedir() + path.slice(1);\n\treturn path;\n}\n\nconst DEFAULT_SHARE_VIEWER_URL = \"https://pi.dev/session/\";\n\n/** Get the share viewer URL for a gist ID */\nexport function getShareViewerUrl(gistId: string): string {\n\tconst baseUrl = process.env.PI_SHARE_VIEWER_URL || DEFAULT_SHARE_VIEWER_URL;\n\treturn `${baseUrl}#${gistId}`;\n}\n\n// =============================================================================\n// User Config Paths (~/.asm-agent/*)\n// =============================================================================\n\n/** Get the agent config directory (e.g., ~/.asm-agent/) */\nexport function getAgentDir(): string {\n\tconst envDir = process.env[ENV_AGENT_DIR];\n\tif (envDir) {\n\t\treturn expandTildePath(envDir);\n\t}\n\treturn join(homedir(), CONFIG_DIR_NAME);\n}\n\n/** Get path to user's custom themes directory */\nexport function getCustomThemesDir(): string {\n\treturn join(getAgentDir(), \"themes\");\n}\n\n/** Directory where daemon and client diagnostic logs are written (e.g. ~/.asm-agent/logs/). */\nexport function getLogsDir(): string {\n\treturn join(getAgentDir(), \"logs\");\n}\n\n/** Log file capturing client-side agent-open failures. */\nexport function getClientErrorLogPath(): string {\n\treturn join(getLogsDir(), \"client-errors.log\");\n}\n\n/** Shared structured (JSON lines) log for client, daemon, and provider diagnostics. */\nexport function getAgentLogPath(): string {\n\treturn join(getLogsDir(), \"agent.jsonl\");\n}\n\n/**\n * Log file for a daemon. The basename keeps it readable; a hash of the full\n * socket path makes it unique so two sockets that share a basename (e.g.\n * daemon.sock in different dirs) don't interleave into one file.\n */\nexport function getDaemonLogPath(socketPath: string): string {\n\tconst normalized = normalizeSocketPath(socketPath);\n\tconst hash = createHash(\"sha256\").update(normalized).digest(\"hex\").slice(0, 8);\n\treturn join(getLogsDir(), `${basename(normalized)}.${hash}.log`);\n}\n\nexport function getDaemonUpdateRestartManifestPath(socketPath: string, agentDir: string = getAgentDir()): string {\n\tconst normalizedSocketPath = normalizeSocketPath(socketPath);\n\tconst socketHash = createHash(\"sha256\").update(normalizedSocketPath).digest(\"hex\");\n\treturn join(agentDir, \"daemon-update-restarts\", `${socketHash}.json`);\n}\n\nexport function getLegacyDaemonUpdateRestartManifestPath(agentDir: string = getAgentDir()): string {\n\treturn join(agentDir, \"daemon-update-restart.json\");\n}\n\nconst MAX_LOG_BYTES = 5 * 1024 * 1024;\n\n/**\n * Append a line to a log file, keeping its size bounded with a single-generation\n * rotation. Opens and closes per call (no held fd), so rotation works at runtime\n * — a long-lived writer rotates on the write that crosses the cap, not only at\n * startup. Best-effort: diagnostics must never throw into the caller.\n */\nexport function appendRotatingLog(logPath: string, message: string, maxBytes: number = MAX_LOG_BYTES): void {\n\ttry {\n\t\tmkdirSync(dirname(logPath), { recursive: true });\n\t\ttry {\n\t\t\tif (existsSync(logPath) && statSync(logPath).size > maxBytes) {\n\t\t\t\t// Drop any prior .old first: renameSync fails on Windows if it exists.\n\t\t\t\trmSync(`${logPath}.old`, { force: true });\n\t\t\t\trenameSync(logPath, `${logPath}.old`);\n\t\t\t}\n\t\t} catch {\n\t\t\t// Keep appending rather than dropping the log on a rotation failure.\n\t\t}\n\t\tappendFileSync(logPath, `${message}\\n`);\n\t} catch {\n\t\t// A read-only or missing log dir must never break the caller.\n\t}\n}\n\n/** Get path to auth.json */\nexport function getAuthPath(): string {\n\treturn join(getAgentDir(), \"auth.json\");\n}\n\n/** Get path to cron jobs store */\nexport function getCronJobsPath(agentDir: string = getAgentDir()): string {\n\treturn join(agentDir, \"cron-jobs.json\");\n}\n\n/** Get path to managed binaries directory (fd, rg) */\nexport function getBinDir(): string {\n\treturn join(getAgentDir(), \"bin\");\n}\n\n/** Get path to sessions directory */\nexport function getSessionsDir(agentDir: string = getAgentDir()): string {\n\tconst envDir = getSessionDirEnvOverride();\n\tif (envDir) {\n\t\treturn envDir;\n\t}\n\treturn join(agentDir, \"sessions\");\n}\n\nexport function getSessionDirEnvOverride(): string | undefined {\n\tconst envDir = process.env[ENV_SESSION_DIR] ?? process.env[ENV_LEGACY_SESSION_DIR];\n\treturn envDir ? expandTildePath(envDir) : undefined;\n}\n\n/** Get path to debug log file */\nexport function getDebugLogPath(): string {\n\treturn join(getAgentDir(), `${APP_NAME}-debug.log`);\n}\n"]}
@@ -34,7 +34,6 @@ export interface AgentSessionRuntimeConfig {
34
34
  */
35
35
  serializedRefine?: boolean;
36
36
  executionMode?: AgentExecutionMode;
37
- telemetryDisabled?: true;
38
37
  /**
39
38
  * Initial goal to seed when creating a new top-level session (rlmDepth 0).
40
39
  * Ignored for subagent sessions and when the branch already has a persisted
@@ -45,7 +44,7 @@ export interface AgentSessionRuntimeConfig {
45
44
  tokenBudget?: number;
46
45
  };
47
46
  }
48
- export type DurableAgentSessionRuntimeConfig = Pick<AgentSessionRuntimeConfig, "cwd" | "agentDir" | "sessionDir" | "telemetryDisabled">;
47
+ export type DurableAgentSessionRuntimeConfig = Pick<AgentSessionRuntimeConfig, "cwd" | "agentDir" | "sessionDir">;
49
48
  /** Only non-secret host settings needed to locate and govern durable daemon state. */
50
49
  export declare function durableAgentSessionRuntimeConfig(config: AgentSessionRuntimeConfig): DurableAgentSessionRuntimeConfig;
51
50
  export declare function mergeAgentSessionRuntimeConfig(base: AgentSessionRuntimeConfig, override?: AgentSessionRuntimeConfig): AgentSessionRuntimeConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"agent-session-config.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAE7D,MAAM,MAAM,kBAAkB,GAAG,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;AAElF,MAAM,WAAW,yBAAyB;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,qBAAqB,CAAC;IACnC,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,CAAC;IACvD;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC,iBAAiB,CAAC,EAAE,IAAI,CAAC;IACzB;;;;OAIG;IACH,WAAW,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1D;AAED,MAAM,MAAM,gCAAgC,GAAG,IAAI,CAClD,yBAAyB,EACzB,KAAK,GAAG,UAAU,GAAG,YAAY,GAAG,mBAAmB,CACvD,CAAC;AAEF,sFAAsF;AACtF,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,yBAAyB,GAAG,gCAAgC,CAOpH;AAED,wBAAgB,8BAA8B,CAC7C,IAAI,EAAE,yBAAyB,EAC/B,QAAQ,CAAC,EAAE,yBAAyB,GAClC,yBAAyB,CAqC3B;AAqBD,wBAAgB,qBAAqB,CACpC,IAAI,EAAE,qBAAqB,GAAG,SAAS,EACvC,QAAQ,EAAE,qBAAqB,GAAG,SAAS,GACzC,qBAAqB,GAAG,SAAS,CAUnC","sourcesContent":["import type { ThinkingLevel } from \"@asm-agent/agent\";\nimport type { AgentAutonomousConfig } from \"./autonomous.js\";\n\nexport type AgentExecutionMode = \"interactive\" | \"print\" | \"json\" | \"rpc\" | \"acp\";\n\nexport interface AgentSessionRuntimeConfig {\n\tcwd?: string;\n\tagentDir?: string;\n\tsessionDir?: string;\n\tprovider?: string;\n\tmodel?: string;\n\tapiKey?: string;\n\tsystemPrompt?: string;\n\tappendSystemPrompt?: string[];\n\tthinking?: ThinkingLevel;\n\tmodels?: string[];\n\ttools?: string[];\n\tnoTools?: boolean;\n\tnoBuiltinTools?: boolean;\n\textensions?: string[];\n\tnoExtensions?: boolean;\n\tskills?: string[];\n\tnoSkills?: boolean;\n\tpromptTemplates?: string[];\n\tnoPromptTemplates?: boolean;\n\tthemes?: string[];\n\tnoThemes?: boolean;\n\tnoContextFiles?: boolean;\n\tautonomous?: AgentAutonomousConfig;\n\textensionFlagValues?: Record<string, boolean | string>;\n\t/**\n\t * When true, auto-refine runs synchronously between turns at the\n\t * shouldStopAfterTurn boundary instead of in the background after\n\t * agent_end. Passed from the JSON/print client to the daemon worker\n\t * so it survives the appMode=\"daemon\" context switch.\n\t */\n\tserializedRefine?: boolean;\n\texecutionMode?: AgentExecutionMode;\n\ttelemetryDisabled?: true;\n\t/**\n\t * Initial goal to seed when creating a new top-level session (rlmDepth 0).\n\t * Ignored for subagent sessions and when the branch already has a persisted\n\t * thread_goal_state entry (idempotent restart/rehydration).\n\t */\n\tinitialGoal?: { objective: string; tokenBudget?: number };\n}\n\nexport type DurableAgentSessionRuntimeConfig = Pick<\n\tAgentSessionRuntimeConfig,\n\t\"cwd\" | \"agentDir\" | \"sessionDir\" | \"telemetryDisabled\"\n>;\n\n/** Only non-secret host settings needed to locate and govern durable daemon state. */\nexport function durableAgentSessionRuntimeConfig(config: AgentSessionRuntimeConfig): DurableAgentSessionRuntimeConfig {\n\treturn {\n\t\t...(typeof config.cwd === \"string\" ? { cwd: config.cwd } : {}),\n\t\t...(typeof config.agentDir === \"string\" ? { agentDir: config.agentDir } : {}),\n\t\t...(typeof config.sessionDir === \"string\" ? { sessionDir: config.sessionDir } : {}),\n\t\t...(config.telemetryDisabled === true ? { telemetryDisabled: true as const } : {}),\n\t};\n}\n\nexport function mergeAgentSessionRuntimeConfig(\n\tbase: AgentSessionRuntimeConfig,\n\toverride?: AgentSessionRuntimeConfig,\n): AgentSessionRuntimeConfig {\n\tif (!override) {\n\t\treturn cloneAgentSessionRuntimeConfig(base);\n\t}\n\treturn {\n\t\tcwd: override.cwd ?? base.cwd,\n\t\tagentDir: override.agentDir ?? base.agentDir,\n\t\tsessionDir: override.sessionDir ?? base.sessionDir,\n\t\tprovider: override.provider ?? base.provider,\n\t\tmodel: override.model ?? base.model,\n\t\tapiKey: override.apiKey ?? base.apiKey,\n\t\tsystemPrompt: override.systemPrompt ?? base.systemPrompt,\n\t\tappendSystemPrompt: cloneArray(override.appendSystemPrompt ?? base.appendSystemPrompt),\n\t\tthinking: override.thinking ?? base.thinking,\n\t\tmodels: cloneArray(override.models ?? base.models),\n\t\ttools: cloneArray(override.tools ?? base.tools),\n\t\tnoTools: override.noTools ?? base.noTools,\n\t\tnoBuiltinTools: override.noBuiltinTools ?? base.noBuiltinTools,\n\t\textensions: cloneArray(override.extensions ?? base.extensions),\n\t\tnoExtensions: override.noExtensions ?? base.noExtensions,\n\t\tskills: cloneArray(override.skills ?? base.skills),\n\t\tnoSkills: override.noSkills ?? base.noSkills,\n\t\tpromptTemplates: cloneArray(override.promptTemplates ?? base.promptTemplates),\n\t\tnoPromptTemplates: override.noPromptTemplates ?? base.noPromptTemplates,\n\t\tthemes: cloneArray(override.themes ?? base.themes),\n\t\tnoThemes: override.noThemes ?? base.noThemes,\n\t\tnoContextFiles: override.noContextFiles ?? base.noContextFiles,\n\t\tautonomous: mergeAutonomousConfig(base.autonomous, override.autonomous),\n\t\textensionFlagValues:\n\t\t\tbase.extensionFlagValues || override.extensionFlagValues\n\t\t\t\t? { ...(base.extensionFlagValues ?? {}), ...(override.extensionFlagValues ?? {}) }\n\t\t\t\t: undefined,\n\t\tserializedRefine: override.serializedRefine ?? base.serializedRefine,\n\t\texecutionMode: override.executionMode ?? base.executionMode,\n\t\ttelemetryDisabled: base.telemetryDisabled || override.telemetryDisabled ? true : undefined,\n\t\tinitialGoal: override.initialGoal ?? base.initialGoal,\n\t};\n}\n\nfunction cloneAgentSessionRuntimeConfig(config: AgentSessionRuntimeConfig): AgentSessionRuntimeConfig {\n\treturn {\n\t\t...config,\n\t\tappendSystemPrompt: cloneArray(config.appendSystemPrompt),\n\t\tmodels: cloneArray(config.models),\n\t\ttools: cloneArray(config.tools),\n\t\textensions: cloneArray(config.extensions),\n\t\tskills: cloneArray(config.skills),\n\t\tpromptTemplates: cloneArray(config.promptTemplates),\n\t\tthemes: cloneArray(config.themes),\n\t\tautonomous: mergeAutonomousConfig(undefined, config.autonomous),\n\t\textensionFlagValues: config.extensionFlagValues ? { ...config.extensionFlagValues } : undefined,\n\t\tserializedRefine: config.serializedRefine,\n\t\texecutionMode: config.executionMode,\n\t\ttelemetryDisabled: config.telemetryDisabled,\n\t\tinitialGoal: config.initialGoal ? { ...config.initialGoal } : undefined,\n\t};\n}\n\nexport function mergeAutonomousConfig(\n\tbase: AgentAutonomousConfig | undefined,\n\toverride: AgentAutonomousConfig | undefined,\n): AgentAutonomousConfig | undefined {\n\tif (!base && !override) {\n\t\treturn undefined;\n\t}\n\tconst gates = mergeAutonomousGateConfig(base?.gates, override?.gates);\n\treturn {\n\t\t...(base ?? {}),\n\t\t...(override ?? {}),\n\t\t...(gates ? { gates } : {}),\n\t};\n}\n\nfunction mergeAutonomousGateConfig(\n\tbase: AgentAutonomousConfig[\"gates\"] | undefined,\n\toverride: AgentAutonomousConfig[\"gates\"] | undefined,\n): AgentAutonomousConfig[\"gates\"] | undefined {\n\tif (!base && !override) {\n\t\treturn undefined;\n\t}\n\treturn {\n\t\t...(base ?? {}),\n\t\t...(override ?? {}),\n\t\t...(override?.commands !== undefined || base?.commands !== undefined\n\t\t\t? { commands: cloneArray(override?.commands ?? base?.commands) }\n\t\t\t: {}),\n\t};\n}\n\nfunction cloneArray<T>(value: T[] | undefined): T[] | undefined {\n\treturn value ? [...value] : undefined;\n}\n"]}
1
+ {"version":3,"file":"agent-session-config.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAE7D,MAAM,MAAM,kBAAkB,GAAG,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;AAElF,MAAM,WAAW,yBAAyB;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,qBAAqB,CAAC;IACnC,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,CAAC;IACvD;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC;;;;OAIG;IACH,WAAW,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1D;AAED,MAAM,MAAM,gCAAgC,GAAG,IAAI,CAAC,yBAAyB,EAAE,KAAK,GAAG,UAAU,GAAG,YAAY,CAAC,CAAC;AAElH,sFAAsF;AACtF,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,yBAAyB,GAAG,gCAAgC,CAMpH;AAED,wBAAgB,8BAA8B,CAC7C,IAAI,EAAE,yBAAyB,EAC/B,QAAQ,CAAC,EAAE,yBAAyB,GAClC,yBAAyB,CAoC3B;AAoBD,wBAAgB,qBAAqB,CACpC,IAAI,EAAE,qBAAqB,GAAG,SAAS,EACvC,QAAQ,EAAE,qBAAqB,GAAG,SAAS,GACzC,qBAAqB,GAAG,SAAS,CAUnC","sourcesContent":["import type { ThinkingLevel } from \"@asm-agent/agent\";\nimport type { AgentAutonomousConfig } from \"./autonomous.js\";\n\nexport type AgentExecutionMode = \"interactive\" | \"print\" | \"json\" | \"rpc\" | \"acp\";\n\nexport interface AgentSessionRuntimeConfig {\n\tcwd?: string;\n\tagentDir?: string;\n\tsessionDir?: string;\n\tprovider?: string;\n\tmodel?: string;\n\tapiKey?: string;\n\tsystemPrompt?: string;\n\tappendSystemPrompt?: string[];\n\tthinking?: ThinkingLevel;\n\tmodels?: string[];\n\ttools?: string[];\n\tnoTools?: boolean;\n\tnoBuiltinTools?: boolean;\n\textensions?: string[];\n\tnoExtensions?: boolean;\n\tskills?: string[];\n\tnoSkills?: boolean;\n\tpromptTemplates?: string[];\n\tnoPromptTemplates?: boolean;\n\tthemes?: string[];\n\tnoThemes?: boolean;\n\tnoContextFiles?: boolean;\n\tautonomous?: AgentAutonomousConfig;\n\textensionFlagValues?: Record<string, boolean | string>;\n\t/**\n\t * When true, auto-refine runs synchronously between turns at the\n\t * shouldStopAfterTurn boundary instead of in the background after\n\t * agent_end. Passed from the JSON/print client to the daemon worker\n\t * so it survives the appMode=\"daemon\" context switch.\n\t */\n\tserializedRefine?: boolean;\n\texecutionMode?: AgentExecutionMode;\n\t/**\n\t * Initial goal to seed when creating a new top-level session (rlmDepth 0).\n\t * Ignored for subagent sessions and when the branch already has a persisted\n\t * thread_goal_state entry (idempotent restart/rehydration).\n\t */\n\tinitialGoal?: { objective: string; tokenBudget?: number };\n}\n\nexport type DurableAgentSessionRuntimeConfig = Pick<AgentSessionRuntimeConfig, \"cwd\" | \"agentDir\" | \"sessionDir\">;\n\n/** Only non-secret host settings needed to locate and govern durable daemon state. */\nexport function durableAgentSessionRuntimeConfig(config: AgentSessionRuntimeConfig): DurableAgentSessionRuntimeConfig {\n\treturn {\n\t\t...(typeof config.cwd === \"string\" ? { cwd: config.cwd } : {}),\n\t\t...(typeof config.agentDir === \"string\" ? { agentDir: config.agentDir } : {}),\n\t\t...(typeof config.sessionDir === \"string\" ? { sessionDir: config.sessionDir } : {}),\n\t};\n}\n\nexport function mergeAgentSessionRuntimeConfig(\n\tbase: AgentSessionRuntimeConfig,\n\toverride?: AgentSessionRuntimeConfig,\n): AgentSessionRuntimeConfig {\n\tif (!override) {\n\t\treturn cloneAgentSessionRuntimeConfig(base);\n\t}\n\treturn {\n\t\tcwd: override.cwd ?? base.cwd,\n\t\tagentDir: override.agentDir ?? base.agentDir,\n\t\tsessionDir: override.sessionDir ?? base.sessionDir,\n\t\tprovider: override.provider ?? base.provider,\n\t\tmodel: override.model ?? base.model,\n\t\tapiKey: override.apiKey ?? base.apiKey,\n\t\tsystemPrompt: override.systemPrompt ?? base.systemPrompt,\n\t\tappendSystemPrompt: cloneArray(override.appendSystemPrompt ?? base.appendSystemPrompt),\n\t\tthinking: override.thinking ?? base.thinking,\n\t\tmodels: cloneArray(override.models ?? base.models),\n\t\ttools: cloneArray(override.tools ?? base.tools),\n\t\tnoTools: override.noTools ?? base.noTools,\n\t\tnoBuiltinTools: override.noBuiltinTools ?? base.noBuiltinTools,\n\t\textensions: cloneArray(override.extensions ?? base.extensions),\n\t\tnoExtensions: override.noExtensions ?? base.noExtensions,\n\t\tskills: cloneArray(override.skills ?? base.skills),\n\t\tnoSkills: override.noSkills ?? base.noSkills,\n\t\tpromptTemplates: cloneArray(override.promptTemplates ?? base.promptTemplates),\n\t\tnoPromptTemplates: override.noPromptTemplates ?? base.noPromptTemplates,\n\t\tthemes: cloneArray(override.themes ?? base.themes),\n\t\tnoThemes: override.noThemes ?? base.noThemes,\n\t\tnoContextFiles: override.noContextFiles ?? base.noContextFiles,\n\t\tautonomous: mergeAutonomousConfig(base.autonomous, override.autonomous),\n\t\textensionFlagValues:\n\t\t\tbase.extensionFlagValues || override.extensionFlagValues\n\t\t\t\t? { ...(base.extensionFlagValues ?? {}), ...(override.extensionFlagValues ?? {}) }\n\t\t\t\t: undefined,\n\t\tserializedRefine: override.serializedRefine ?? base.serializedRefine,\n\t\texecutionMode: override.executionMode ?? base.executionMode,\n\t\tinitialGoal: override.initialGoal ?? base.initialGoal,\n\t};\n}\n\nfunction cloneAgentSessionRuntimeConfig(config: AgentSessionRuntimeConfig): AgentSessionRuntimeConfig {\n\treturn {\n\t\t...config,\n\t\tappendSystemPrompt: cloneArray(config.appendSystemPrompt),\n\t\tmodels: cloneArray(config.models),\n\t\ttools: cloneArray(config.tools),\n\t\textensions: cloneArray(config.extensions),\n\t\tskills: cloneArray(config.skills),\n\t\tpromptTemplates: cloneArray(config.promptTemplates),\n\t\tthemes: cloneArray(config.themes),\n\t\tautonomous: mergeAutonomousConfig(undefined, config.autonomous),\n\t\textensionFlagValues: config.extensionFlagValues ? { ...config.extensionFlagValues } : undefined,\n\t\tserializedRefine: config.serializedRefine,\n\t\texecutionMode: config.executionMode,\n\t\tinitialGoal: config.initialGoal ? { ...config.initialGoal } : undefined,\n\t};\n}\n\nexport function mergeAutonomousConfig(\n\tbase: AgentAutonomousConfig | undefined,\n\toverride: AgentAutonomousConfig | undefined,\n): AgentAutonomousConfig | undefined {\n\tif (!base && !override) {\n\t\treturn undefined;\n\t}\n\tconst gates = mergeAutonomousGateConfig(base?.gates, override?.gates);\n\treturn {\n\t\t...(base ?? {}),\n\t\t...(override ?? {}),\n\t\t...(gates ? { gates } : {}),\n\t};\n}\n\nfunction mergeAutonomousGateConfig(\n\tbase: AgentAutonomousConfig[\"gates\"] | undefined,\n\toverride: AgentAutonomousConfig[\"gates\"] | undefined,\n): AgentAutonomousConfig[\"gates\"] | undefined {\n\tif (!base && !override) {\n\t\treturn undefined;\n\t}\n\treturn {\n\t\t...(base ?? {}),\n\t\t...(override ?? {}),\n\t\t...(override?.commands !== undefined || base?.commands !== undefined\n\t\t\t? { commands: cloneArray(override?.commands ?? base?.commands) }\n\t\t\t: {}),\n\t};\n}\n\nfunction cloneArray<T>(value: T[] | undefined): T[] | undefined {\n\treturn value ? [...value] : undefined;\n}\n"]}