@oyasmi/pipiclaw 0.5.2 → 0.5.3

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 (214) hide show
  1. package/README.md +308 -209
  2. package/dist/agent/channel-runner.d.ts +2 -1
  3. package/dist/agent/channel-runner.js +15 -8
  4. package/dist/agent/index.d.ts +0 -1
  5. package/dist/agent/index.js +0 -1
  6. package/dist/agent/progress-formatter.d.ts +0 -1
  7. package/dist/agent/progress-formatter.js +0 -1
  8. package/dist/agent/run-queue.d.ts +0 -1
  9. package/dist/agent/run-queue.js +0 -1
  10. package/dist/agent/runner-factory.d.ts +0 -1
  11. package/dist/agent/runner-factory.js +0 -1
  12. package/dist/agent/session-events.d.ts +0 -1
  13. package/dist/agent/session-events.js +0 -1
  14. package/dist/agent/session-resource-gate.d.ts +10 -0
  15. package/dist/agent/session-resource-gate.js +44 -0
  16. package/dist/agent/type-guards.d.ts +0 -1
  17. package/dist/agent/type-guards.js +0 -1
  18. package/dist/agent/types.d.ts +0 -1
  19. package/dist/agent/types.js +0 -1
  20. package/dist/agent.d.ts +0 -1
  21. package/dist/agent.js +0 -1
  22. package/dist/command-extension.d.ts +0 -1
  23. package/dist/command-extension.js +0 -1
  24. package/dist/commands.d.ts +0 -1
  25. package/dist/commands.js +0 -1
  26. package/dist/config-loader.d.ts +0 -1
  27. package/dist/config-loader.js +1 -2
  28. package/dist/context.d.ts +0 -1
  29. package/dist/context.js +0 -1
  30. package/dist/index.d.ts +0 -1
  31. package/dist/index.js +0 -1
  32. package/dist/log.d.ts +0 -1
  33. package/dist/log.js +0 -1
  34. package/dist/main.d.ts +0 -1
  35. package/dist/main.js +0 -1
  36. package/dist/memory/bootstrap.d.ts +0 -1
  37. package/dist/memory/bootstrap.js +0 -1
  38. package/dist/memory/candidates.d.ts +0 -1
  39. package/dist/memory/candidates.js +0 -1
  40. package/dist/memory/chinese-words.d.ts +0 -1
  41. package/dist/memory/chinese-words.js +64 -1
  42. package/dist/memory/consolidation.d.ts +0 -1
  43. package/dist/memory/consolidation.js +1 -2
  44. package/dist/memory/files.d.ts +0 -1
  45. package/dist/memory/files.js +0 -1
  46. package/dist/memory/lifecycle.d.ts +0 -1
  47. package/dist/memory/lifecycle.js +0 -1
  48. package/dist/memory/recall.d.ts +1 -1
  49. package/dist/memory/recall.js +76 -10
  50. package/dist/memory/session.d.ts +0 -1
  51. package/dist/memory/session.js +1 -2
  52. package/dist/model-utils.d.ts +0 -1
  53. package/dist/model-utils.js +0 -1
  54. package/dist/paths.d.ts +0 -1
  55. package/dist/paths.js +0 -1
  56. package/dist/prompt-builder.d.ts +0 -1
  57. package/dist/prompt-builder.js +0 -1
  58. package/dist/runtime/bootstrap.d.ts +0 -1
  59. package/dist/runtime/bootstrap.js +0 -1
  60. package/dist/runtime/delivery.d.ts +0 -1
  61. package/dist/runtime/delivery.js +0 -1
  62. package/dist/runtime/dingtalk.d.ts +0 -1
  63. package/dist/runtime/dingtalk.js +0 -1
  64. package/dist/runtime/events.d.ts +0 -1
  65. package/dist/runtime/events.js +0 -1
  66. package/dist/runtime/store.d.ts +0 -1
  67. package/dist/runtime/store.js +0 -1
  68. package/dist/sandbox.d.ts +0 -1
  69. package/dist/sandbox.js +1 -2
  70. package/dist/{llm-json.d.ts → shared/llm-json.d.ts} +0 -1
  71. package/dist/{llm-json.js → shared/llm-json.js} +0 -1
  72. package/dist/shared/markdown-sections.d.ts +0 -1
  73. package/dist/shared/markdown-sections.js +0 -1
  74. package/dist/{shell-escape.d.ts → shared/shell-escape.d.ts} +0 -1
  75. package/dist/{shell-escape.js → shared/shell-escape.js} +0 -1
  76. package/dist/shared/text-utils.d.ts +0 -1
  77. package/dist/shared/text-utils.js +0 -1
  78. package/dist/shared/type-guards.d.ts +0 -1
  79. package/dist/shared/type-guards.js +0 -1
  80. package/dist/shared/types.d.ts +0 -1
  81. package/dist/shared/types.js +0 -1
  82. package/dist/sidecar-worker.d.ts +0 -1
  83. package/dist/sidecar-worker.js +0 -1
  84. package/dist/subagents/discovery.d.ts +0 -1
  85. package/dist/subagents/discovery.js +0 -1
  86. package/dist/subagents/tool.d.ts +0 -1
  87. package/dist/subagents/tool.js +0 -1
  88. package/dist/tools/attach.d.ts +0 -1
  89. package/dist/tools/attach.js +0 -1
  90. package/dist/tools/bash.d.ts +0 -1
  91. package/dist/tools/bash.js +0 -1
  92. package/dist/tools/edit.d.ts +0 -1
  93. package/dist/tools/edit.js +1 -2
  94. package/dist/tools/index.d.ts +0 -1
  95. package/dist/tools/index.js +0 -1
  96. package/dist/tools/read.d.ts +0 -1
  97. package/dist/tools/read.js +1 -2
  98. package/dist/tools/truncate.d.ts +0 -1
  99. package/dist/tools/truncate.js +0 -1
  100. package/dist/tools/write-content.d.ts +0 -1
  101. package/dist/tools/write-content.js +1 -2
  102. package/dist/tools/write.d.ts +0 -1
  103. package/dist/tools/write.js +0 -1
  104. package/package.json +9 -3
  105. package/CHANGELOG.md +0 -47
  106. package/dist/agent/channel-runner.d.ts.map +0 -1
  107. package/dist/agent/channel-runner.js.map +0 -1
  108. package/dist/agent/index.d.ts.map +0 -1
  109. package/dist/agent/index.js.map +0 -1
  110. package/dist/agent/progress-formatter.d.ts.map +0 -1
  111. package/dist/agent/progress-formatter.js.map +0 -1
  112. package/dist/agent/run-queue.d.ts.map +0 -1
  113. package/dist/agent/run-queue.js.map +0 -1
  114. package/dist/agent/runner-factory.d.ts.map +0 -1
  115. package/dist/agent/runner-factory.js.map +0 -1
  116. package/dist/agent/session-events.d.ts.map +0 -1
  117. package/dist/agent/session-events.js.map +0 -1
  118. package/dist/agent/type-guards.d.ts.map +0 -1
  119. package/dist/agent/type-guards.js.map +0 -1
  120. package/dist/agent/types.d.ts.map +0 -1
  121. package/dist/agent/types.js.map +0 -1
  122. package/dist/agent.d.ts.map +0 -1
  123. package/dist/agent.js.map +0 -1
  124. package/dist/command-extension.d.ts.map +0 -1
  125. package/dist/command-extension.js.map +0 -1
  126. package/dist/commands.d.ts.map +0 -1
  127. package/dist/commands.js.map +0 -1
  128. package/dist/config-loader.d.ts.map +0 -1
  129. package/dist/config-loader.js.map +0 -1
  130. package/dist/context.d.ts.map +0 -1
  131. package/dist/context.js.map +0 -1
  132. package/dist/index.d.ts.map +0 -1
  133. package/dist/index.js.map +0 -1
  134. package/dist/llm-json.d.ts.map +0 -1
  135. package/dist/llm-json.js.map +0 -1
  136. package/dist/log.d.ts.map +0 -1
  137. package/dist/log.js.map +0 -1
  138. package/dist/main.d.ts.map +0 -1
  139. package/dist/main.js.map +0 -1
  140. package/dist/memory/bootstrap.d.ts.map +0 -1
  141. package/dist/memory/bootstrap.js.map +0 -1
  142. package/dist/memory/candidates.d.ts.map +0 -1
  143. package/dist/memory/candidates.js.map +0 -1
  144. package/dist/memory/chinese-words.d.ts.map +0 -1
  145. package/dist/memory/chinese-words.js.map +0 -1
  146. package/dist/memory/consolidation.d.ts.map +0 -1
  147. package/dist/memory/consolidation.js.map +0 -1
  148. package/dist/memory/files.d.ts.map +0 -1
  149. package/dist/memory/files.js.map +0 -1
  150. package/dist/memory/lifecycle.d.ts.map +0 -1
  151. package/dist/memory/lifecycle.js.map +0 -1
  152. package/dist/memory/recall.d.ts.map +0 -1
  153. package/dist/memory/recall.js.map +0 -1
  154. package/dist/memory/session.d.ts.map +0 -1
  155. package/dist/memory/session.js.map +0 -1
  156. package/dist/model-utils.d.ts.map +0 -1
  157. package/dist/model-utils.js.map +0 -1
  158. package/dist/paths.d.ts.map +0 -1
  159. package/dist/paths.js.map +0 -1
  160. package/dist/prompt-builder.d.ts.map +0 -1
  161. package/dist/prompt-builder.js.map +0 -1
  162. package/dist/runtime/bootstrap.d.ts.map +0 -1
  163. package/dist/runtime/bootstrap.js.map +0 -1
  164. package/dist/runtime/delivery.d.ts.map +0 -1
  165. package/dist/runtime/delivery.js.map +0 -1
  166. package/dist/runtime/dingtalk.d.ts.map +0 -1
  167. package/dist/runtime/dingtalk.js.map +0 -1
  168. package/dist/runtime/events.d.ts.map +0 -1
  169. package/dist/runtime/events.js.map +0 -1
  170. package/dist/runtime/store.d.ts.map +0 -1
  171. package/dist/runtime/store.js.map +0 -1
  172. package/dist/sandbox.d.ts.map +0 -1
  173. package/dist/sandbox.js.map +0 -1
  174. package/dist/shared/markdown-sections.d.ts.map +0 -1
  175. package/dist/shared/markdown-sections.js.map +0 -1
  176. package/dist/shared/text-utils.d.ts.map +0 -1
  177. package/dist/shared/text-utils.js.map +0 -1
  178. package/dist/shared/type-guards.d.ts.map +0 -1
  179. package/dist/shared/type-guards.js.map +0 -1
  180. package/dist/shared/types.d.ts.map +0 -1
  181. package/dist/shared/types.js.map +0 -1
  182. package/dist/shell-escape.d.ts.map +0 -1
  183. package/dist/shell-escape.js.map +0 -1
  184. package/dist/sidecar-worker.d.ts.map +0 -1
  185. package/dist/sidecar-worker.js.map +0 -1
  186. package/dist/subagents/discovery.d.ts.map +0 -1
  187. package/dist/subagents/discovery.js.map +0 -1
  188. package/dist/subagents/tool.d.ts.map +0 -1
  189. package/dist/subagents/tool.js.map +0 -1
  190. package/dist/tools/attach.d.ts.map +0 -1
  191. package/dist/tools/attach.js.map +0 -1
  192. package/dist/tools/bash.d.ts.map +0 -1
  193. package/dist/tools/bash.js.map +0 -1
  194. package/dist/tools/edit.d.ts.map +0 -1
  195. package/dist/tools/edit.js.map +0 -1
  196. package/dist/tools/index.d.ts.map +0 -1
  197. package/dist/tools/index.js.map +0 -1
  198. package/dist/tools/read.d.ts.map +0 -1
  199. package/dist/tools/read.js.map +0 -1
  200. package/dist/tools/truncate.d.ts.map +0 -1
  201. package/dist/tools/truncate.js.map +0 -1
  202. package/dist/tools/write-content.d.ts.map +0 -1
  203. package/dist/tools/write-content.js.map +0 -1
  204. package/dist/tools/write.d.ts.map +0 -1
  205. package/dist/tools/write.js.map +0 -1
  206. package/docs/memory-audit.md +0 -330
  207. package/docs/memory-optimization-round2.md +0 -319
  208. package/docs/specs/001-implement-memory/memory-rfc.md +0 -297
  209. package/docs/specs/002-subagent/pi-subagent-analyse.txt +0 -190
  210. package/docs/specs/002-subagent/pi-subagent-design.txt +0 -266
  211. package/docs/specs/002-subagent/pi-subagent-phase1-plan.txt +0 -529
  212. package/docs/specs/003-improve-memory/design.md +0 -537
  213. package/docs/specs/003-improve-memory/interfaces-and-tests.md +0 -473
  214. package/docs/specs/003-improve-memory/spec.md +0 -357
@@ -1 +0,0 @@
1
- {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/memory/lifecycle.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@mariozechner/pi-agent-core\";\nimport type { Api, Model } from \"@mariozechner/pi-ai\";\nimport type {\n\tExtensionFactory,\n\tSessionBeforeCompactEvent,\n\tSessionBeforeSwitchEvent,\n\tSessionCompactEvent,\n\tSessionEntry,\n\tSessionSwitchEvent,\n} from \"@mariozechner/pi-coding-agent\";\nimport type { PipiclawSessionMemorySettings } from \"../context.js\";\nimport * as log from \"../log.js\";\nimport {\n\ttype BackgroundMaintenanceResult,\n\ttype ConsolidationRunOptions,\n\ttype InlineConsolidationResult,\n\trunBackgroundMaintenance,\n\trunInlineConsolidation,\n} from \"./consolidation.js\";\nimport { updateChannelSessionMemory } from \"./session.js\";\n\nconst IDLE_CONSOLIDATION_DELAY_MS = 60_000;\n\nexport type ConsolidationReason = \"compaction\" | \"new-session\" | \"idle\";\n\nexport interface MemoryLifecycleOptions {\n\tchannelId: string;\n\tchannelDir: string;\n\tgetMessages: () => AgentMessage[];\n\tgetSessionEntries: () => SessionEntry[];\n\tgetModel: () => Model<Api>;\n\tresolveApiKey: (model: Model<Api>) => Promise<string>;\n\tgetSessionMemorySettings: () => PipiclawSessionMemorySettings;\n}\n\ninterface SessionMemoryRefreshRequest {\n\treason: \"threshold\" | Exclude<ConsolidationReason, \"idle\">;\n\tmessages?: AgentMessage[];\n}\n\nexport class MemoryLifecycle {\n\tprivate backgroundQueue: Promise<void> = Promise.resolve();\n\tprivate sessionRefreshQueue: Promise<void> = Promise.resolve();\n\tprivate turnsSinceSessionUpdate = 0;\n\tprivate toolCallsSinceSessionUpdate = 0;\n\tprivate thresholdFailureBackoffTurnsRemaining = 0;\n\tprivate thresholdRefreshQueued = false;\n\tprivate sessionRefreshRunning = false;\n\tprivate durableDirty = false;\n\tprivate durableRevision = 0;\n\tprivate lastAssistantTurnRevision = 0;\n\tprivate lastDurableConsolidationRevision = 0;\n\tprivate idleConsolidationTimer: ReturnType<typeof setTimeout> | null = null;\n\tprivate idleConsolidationQueued = false;\n\n\tconstructor(private options: MemoryLifecycleOptions) {}\n\n\tprivate buildRunOptions(messages?: AgentMessage[], sessionEntries?: SessionEntry[]): ConsolidationRunOptions {\n\t\treturn {\n\t\t\tchannelDir: this.options.channelDir,\n\t\t\tmodel: this.options.getModel(),\n\t\t\tresolveApiKey: this.options.resolveApiKey,\n\t\t\tmessages: messages ?? this.options.getMessages(),\n\t\t\tsessionEntries: sessionEntries ?? this.options.getSessionEntries(),\n\t\t};\n\t}\n\n\tcreateExtensionFactory(): ExtensionFactory {\n\t\treturn (pi) => {\n\t\t\tpi.on(\"session_before_compact\", async (event: SessionBeforeCompactEvent) => {\n\t\t\t\tawait this.handleSessionBeforeCompact(event);\n\t\t\t});\n\t\t\tpi.on(\"session_compact\", async (event: SessionCompactEvent) => {\n\t\t\t\tthis.handleSessionCompact(event);\n\t\t\t});\n\t\t\tpi.on(\"session_before_switch\", async (event: SessionBeforeSwitchEvent) => {\n\t\t\t\tawait this.handleSessionBeforeSwitch(event);\n\t\t\t});\n\t\t\tpi.on(\"session_switch\", async (event: SessionSwitchEvent) => {\n\t\t\t\tthis.handleSessionSwitch(event);\n\t\t\t});\n\t\t};\n\t}\n\n\tnoteUserTurnStarted(): void {\n\t\tthis.clearIdleConsolidationTimer();\n\t}\n\n\tnoteToolCall(): void {\n\t\tthis.durableDirty = true;\n\t\tthis.durableRevision++;\n\t\tthis.toolCallsSinceSessionUpdate++;\n\t\tthis.clearIdleConsolidationTimer();\n\t}\n\n\tnoteCompletedAssistantTurn(): void {\n\t\tthis.durableDirty = true;\n\t\tthis.durableRevision++;\n\t\tthis.lastAssistantTurnRevision = this.durableRevision;\n\n\t\tconst settings = this.options.getSessionMemorySettings();\n\t\tif (settings.enabled) {\n\t\t\tthis.turnsSinceSessionUpdate++;\n\t\t\tlet canTriggerThresholdRefresh = true;\n\t\t\tif (this.thresholdFailureBackoffTurnsRemaining > 0) {\n\t\t\t\tthis.thresholdFailureBackoffTurnsRemaining--;\n\t\t\t\tcanTriggerThresholdRefresh = this.thresholdFailureBackoffTurnsRemaining === 0;\n\t\t\t}\n\t\t\tif (\n\t\t\t\tcanTriggerThresholdRefresh &&\n\t\t\t\t(this.turnsSinceSessionUpdate >= settings.minTurnsBetweenUpdate ||\n\t\t\t\t\tthis.toolCallsSinceSessionUpdate >= settings.minToolCallsBetweenUpdate)\n\t\t\t) {\n\t\t\t\tthis.requestThresholdSessionRefresh();\n\t\t\t}\n\t\t}\n\n\t\tthis.scheduleIdleConsolidation();\n\t}\n\n\tprivate clearIdleConsolidationTimer(): void {\n\t\tif (!this.idleConsolidationTimer) {\n\t\t\treturn;\n\t\t}\n\t\tclearTimeout(this.idleConsolidationTimer);\n\t\tthis.idleConsolidationTimer = null;\n\t}\n\n\tprivate shouldForceRefreshFor(\n\t\treason: Exclude<ConsolidationReason, \"idle\">,\n\t\tsettings: PipiclawSessionMemorySettings,\n\t): boolean {\n\t\tif (!settings.enabled) {\n\t\t\treturn false;\n\t\t}\n\t\treturn reason === \"compaction\" ? settings.forceRefreshBeforeCompact : settings.forceRefreshBeforeNewSession;\n\t}\n\n\tprivate async refreshSessionMemory(request: SessionMemoryRefreshRequest): Promise<boolean> {\n\t\tconst settings = this.options.getSessionMemorySettings();\n\t\tif (!settings.enabled) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst { reason } = request;\n\t\tthis.sessionRefreshRunning = true;\n\t\ttry {\n\t\t\tawait updateChannelSessionMemory({\n\t\t\t\tchannelDir: this.options.channelDir,\n\t\t\t\tmessages: request.messages ?? this.options.getMessages(),\n\t\t\t\tmodel: this.options.getModel(),\n\t\t\t\tresolveApiKey: this.options.resolveApiKey,\n\t\t\t\ttimeoutMs: settings.timeoutMs,\n\t\t\t});\n\t\t\tthis.turnsSinceSessionUpdate = 0;\n\t\t\tthis.toolCallsSinceSessionUpdate = 0;\n\t\t\tthis.thresholdFailureBackoffTurnsRemaining = 0;\n\t\t\tlog.logInfo(`[${this.options.channelId}] Session memory updated (${reason})`);\n\t\t\treturn true;\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tif (reason === \"threshold\") {\n\t\t\t\tthis.thresholdFailureBackoffTurnsRemaining = Math.max(0, settings.failureBackoffTurns);\n\t\t\t}\n\t\t\tlog.logWarning(`[${this.options.channelId}] Session memory update failed (${reason})`, message);\n\t\t\treturn false;\n\t\t} finally {\n\t\t\tthis.sessionRefreshRunning = false;\n\t\t}\n\t}\n\n\tprivate runSessionRefreshSerial(request: SessionMemoryRefreshRequest): Promise<boolean> {\n\t\tconst run = async (): Promise<boolean> => this.refreshSessionMemory(request);\n\t\tconst resultPromise = this.sessionRefreshQueue.then(run, run);\n\t\tthis.sessionRefreshQueue = resultPromise.then(\n\t\t\t() => undefined,\n\t\t\t() => undefined,\n\t\t);\n\t\treturn resultPromise;\n\t}\n\n\tprivate requestThresholdSessionRefresh(): void {\n\t\tif (this.thresholdRefreshQueued || this.sessionRefreshRunning) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.thresholdRefreshQueued = true;\n\t\tvoid this.runSessionRefreshSerial({ reason: \"threshold\" }).finally(() => {\n\t\t\tthis.thresholdRefreshQueued = false;\n\t\t});\n\t}\n\n\tprivate enqueueBackgroundJob(job: () => Promise<void>, failureMessage: string): void {\n\t\tthis.backgroundQueue = this.backgroundQueue.then(job).catch((error: unknown) => {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tlog.logWarning(failureMessage, message);\n\t\t});\n\t}\n\n\tprivate hasPendingAssistantSnapshot(): boolean {\n\t\treturn this.durableDirty && this.lastAssistantTurnRevision > this.lastDurableConsolidationRevision;\n\t}\n\n\tprivate markDurableConsolidationCheckpoint(revision: number): void {\n\t\tthis.lastDurableConsolidationRevision = Math.max(this.lastDurableConsolidationRevision, revision);\n\t\tthis.durableDirty = this.durableRevision > this.lastDurableConsolidationRevision;\n\t}\n\n\tprivate logConsolidationResult(reason: ConsolidationReason, result: InlineConsolidationResult): void {\n\t\tif (result.skipped) {\n\t\t\tlog.logInfo(`[${this.options.channelId}] Memory consolidation skipped (${reason}): no meaningful snapshot`);\n\t\t\treturn;\n\t\t}\n\n\t\tlog.logInfo(\n\t\t\t`[${this.options.channelId}] Memory consolidation finished (${reason}): memory entries=${result.appendedMemoryEntries}, history=${result.appendedHistoryBlock ? \"yes\" : \"no\"}`,\n\t\t);\n\t}\n\n\tprivate scheduleIdleConsolidation(): void {\n\t\tthis.clearIdleConsolidationTimer();\n\t\tif (!this.hasPendingAssistantSnapshot() || this.idleConsolidationQueued) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.idleConsolidationTimer = setTimeout(() => {\n\t\t\tthis.idleConsolidationTimer = null;\n\t\t\tif (!this.hasPendingAssistantSnapshot() || this.idleConsolidationQueued) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.idleConsolidationQueued = true;\n\t\t\tconst messageSnapshot = [...this.options.getMessages()];\n\t\t\tconst sessionEntrySnapshot = [...this.options.getSessionEntries()];\n\t\t\tconst revisionSnapshot = this.durableRevision;\n\t\t\tthis.enqueueBackgroundJob(async () => {\n\t\t\t\ttry {\n\t\t\t\t\tlog.logInfo(`[${this.options.channelId}] Memory consolidation starting (idle)`);\n\t\t\t\t\tconst result = await runInlineConsolidation(this.buildRunOptions(messageSnapshot, sessionEntrySnapshot));\n\t\t\t\t\tthis.markDurableConsolidationCheckpoint(revisionSnapshot);\n\t\t\t\t\tthis.logConsolidationResult(\"idle\", result);\n\t\t\t\t\tconst maintenance = await runBackgroundMaintenance(\n\t\t\t\t\t\tthis.buildRunOptions(messageSnapshot, sessionEntrySnapshot),\n\t\t\t\t\t);\n\t\t\t\t\tthis.logBackgroundResult(maintenance);\n\t\t\t\t} finally {\n\t\t\t\t\tthis.idleConsolidationQueued = false;\n\t\t\t\t\tif (this.durableDirty) {\n\t\t\t\t\t\tthis.scheduleIdleConsolidation();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, `[${this.options.channelId}] Memory consolidation failed (idle)`);\n\t\t}, IDLE_CONSOLIDATION_DELAY_MS);\n\t}\n\n\tprivate async runPreflightConsolidation(\n\t\treason: Exclude<ConsolidationReason, \"idle\">,\n\t\tmessages?: AgentMessage[],\n\t\tsessionEntries?: SessionEntry[],\n\t): Promise<void> {\n\t\tthis.clearIdleConsolidationTimer();\n\t\tconst messageSnapshot = [...(messages ?? this.options.getMessages())];\n\t\tconst sessionEntrySnapshot = sessionEntries ? [...sessionEntries] : [...this.options.getSessionEntries()];\n\t\tconst revisionSnapshot = this.durableRevision;\n\t\tconst settings = this.options.getSessionMemorySettings();\n\n\t\tif (this.shouldForceRefreshFor(reason, settings)) {\n\t\t\tawait this.runSessionRefreshSerial({\n\t\t\t\treason,\n\t\t\t\tmessages: messageSnapshot,\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tlog.logInfo(`[${this.options.channelId}] Memory consolidation starting (${reason})`);\n\t\t\tconst result = await runInlineConsolidation(this.buildRunOptions(messageSnapshot, sessionEntrySnapshot));\n\t\t\tthis.markDurableConsolidationCheckpoint(revisionSnapshot);\n\t\t\tthis.logConsolidationResult(reason, result);\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tlog.logWarning(`[${this.options.channelId}] Memory consolidation failed (${reason})`, message);\n\t\t}\n\t}\n\n\tprivate async handleSessionBeforeCompact(event: SessionBeforeCompactEvent): Promise<void> {\n\t\tawait this.runPreflightConsolidation(\"compaction\", event.preparation.messagesToSummarize);\n\t}\n\n\tprivate handleSessionCompact(_event: SessionCompactEvent): void {\n\t\tthis.enqueueBackgroundMaintenance();\n\t}\n\n\tprivate async handleSessionBeforeSwitch(event: SessionBeforeSwitchEvent): Promise<void> {\n\t\tif (event.reason !== \"new\") {\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.runPreflightConsolidation(\"new-session\");\n\t}\n\n\tprivate handleSessionSwitch(event: SessionSwitchEvent): void {\n\t\tif (event.reason !== \"new\") {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.enqueueBackgroundMaintenance();\n\t}\n\n\tprivate enqueueBackgroundMaintenance(): void {\n\t\tthis.enqueueBackgroundJob(async () => {\n\t\t\tconst result = await runBackgroundMaintenance(this.buildRunOptions([], []));\n\t\t\tthis.logBackgroundResult(result);\n\t\t}, `[${this.options.channelId}] Background memory maintenance failed`);\n\t}\n\n\tprivate logBackgroundResult(result: BackgroundMaintenanceResult): void {\n\t\tif (!result.cleanedMemory && !result.foldedHistory) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst details = [\n\t\t\t`memory cleanup=${result.cleanedMemory ? \"yes\" : \"no\"}`,\n\t\t\t`history fold=${result.foldedHistory ? \"yes\" : \"no\"}`,\n\t\t].join(\", \");\n\t\tlog.logInfo(`[${this.options.channelId}] Background memory maintenance complete: ${details}`);\n\t}\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"recall.d.ts","sourceRoot":"","sources":["../../src/memory/recall.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAItD,OAAO,EAAyB,KAAK,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAGzG,MAAM,WAAW,aAAa;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,aAAa,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACtD,cAAc,CAAC,EAAE,oBAAoB,CAAC;CACtC;AAED,MAAM,WAAW,cAAc;IAC9B,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC5B,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACrB;AA0cD,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CA8CxF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"recall.js","sourceRoot":"","sources":["../../src/memory/recall.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Api, Model } from \"@mariozechner/pi-ai\";\nimport { parseJsonObject } from \"../llm-json.js\";\nimport { HAN_REGEX } from \"../shared/text-utils.js\";\nimport { runSidecarTask } from \"../sidecar-worker.js\";\nimport { buildMemoryCandidates, type MemoryCandidate, type MemoryCandidateCache } from \"./candidates.js\";\nimport { COMMON_CHINESE_WORDS } from \"./chinese-words.js\";\n\nexport interface RecallRequest {\n\tquery: string;\n\tworkspaceDir: string;\n\tchannelDir: string;\n\tallowedSources?: MemoryCandidate[\"source\"][];\n\tmaxCandidates: number;\n\tmaxInjected: number;\n\tmaxChars: number;\n\trerankWithModel: boolean;\n\tautoRerank?: boolean;\n\tmodel: Model<Api>;\n\tresolveApiKey: (model: Model<Api>) => Promise<string>;\n\tcandidateCache?: MemoryCandidateCache;\n}\n\nexport interface RecalledMemory {\n\tsource: MemoryCandidate[\"source\"];\n\tpath: string;\n\ttitle: string;\n\tcontent: string;\n\tscore: number;\n}\n\nexport interface RecallResult {\n\titems: RecalledMemory[];\n\trenderedText: string;\n}\n\ntype QueryIntent = \"current-state\" | \"next-steps\" | \"constraints\" | \"decisions\" | \"errors\" | \"history\";\n\ninterface TokenMatchStats {\n\tmatchedCount: number;\n\tcoverage: number;\n}\n\ninterface ScoredCandidate {\n\tcandidate: MemoryCandidate;\n\tscore: number;\n\tlexicalMatchCount: number;\n\tintentBoost: number;\n}\n\nconst RERANK_SYSTEM_PROMPT = `You are selecting which memory snippets are most relevant to the current user turn.\n\nReturn strict JSON only:\n{\n \"selectedIds\": [\"candidate-id\"]\n}\n\nRules:\n- Select only snippets that are clearly useful for answering the current turn.\n- Prefer current work state, constraints, active files, recent corrections, and durable decisions.\n- If nothing is clearly useful, return an empty array.\n- Do not rewrite the candidates. Only return candidate ids.`;\n\nconst TOKEN_PART_REGEX = /[\\p{Script=Han}]+|[\\p{L}\\p{N}_./-]+/gu;\nconst ASCII_SPLIT_REGEX = /[._/-]+/g;\nconst MEMORY_RECALL_RERANK_TIMEOUT_MS = 8_000;\nconst RERANK_CONTENT_CLIP = 800;\nconst MAX_HAN_WORD_LENGTH = Array.from(COMMON_CHINESE_WORDS).reduce((max, word) => Math.max(max, word.length), 2);\nconst LATIN_STOP_WORDS = new Set([\n\t\"a\",\n\t\"an\",\n\t\"and\",\n\t\"are\",\n\t\"as\",\n\t\"at\",\n\t\"be\",\n\t\"been\",\n\t\"being\",\n\t\"by\",\n\t\"can\",\n\t\"could\",\n\t\"did\",\n\t\"do\",\n\t\"does\",\n\t\"doing\",\n\t\"for\",\n\t\"from\",\n\t\"had\",\n\t\"has\",\n\t\"have\",\n\t\"here\",\n\t\"how\",\n\t\"i\",\n\t\"in\",\n\t\"is\",\n\t\"it\",\n\t\"its\",\n\t\"me\",\n\t\"my\",\n\t\"of\",\n\t\"on\",\n\t\"or\",\n\t\"our\",\n\t\"please\",\n\t\"should\",\n\t\"that\",\n\t\"the\",\n\t\"their\",\n\t\"them\",\n\t\"there\",\n\t\"these\",\n\t\"they\",\n\t\"this\",\n\t\"to\",\n\t\"was\",\n\t\"we\",\n\t\"were\",\n\t\"what\",\n\t\"when\",\n\t\"where\",\n\t\"which\",\n\t\"who\",\n\t\"why\",\n\t\"with\",\n\t\"would\",\n\t\"you\",\n\t\"your\",\n]);\n\nfunction containsHanText(text: string): boolean {\n\treturn HAN_REGEX.test(text);\n}\n\nfunction tokenizeHanPart(part: string): string[] {\n\tconst chars = Array.from(part);\n\tconst tokens: string[] = [];\n\n\tfor (let index = 0; index < chars.length; ) {\n\t\tlet matched = \"\";\n\t\tconst maxLength = Math.min(MAX_HAN_WORD_LENGTH, chars.length - index);\n\t\tfor (let size = maxLength; size >= 2; size--) {\n\t\t\tconst candidate = chars.slice(index, index + size).join(\"\");\n\t\t\tif (COMMON_CHINESE_WORDS.has(candidate)) {\n\t\t\t\tmatched = candidate;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (matched) {\n\t\t\ttokens.push(matched);\n\t\t\tindex += Array.from(matched).length;\n\t\t\tcontinue;\n\t\t}\n\t\tindex++;\n\t}\n\n\tfor (let index = 0; index <= chars.length - 2; index++) {\n\t\ttokens.push(chars.slice(index, index + 2).join(\"\"));\n\t}\n\n\treturn Array.from(new Set(tokens));\n}\n\nfunction tokenizeAsciiPart(part: string): string[] {\n\tconst tokens: string[] = [];\n\tconst normalized = part.toLowerCase();\n\tconst segments = normalized.split(ASCII_SPLIT_REGEX).filter(Boolean);\n\n\tif (normalized.length >= 2 && !LATIN_STOP_WORDS.has(normalized)) {\n\t\ttokens.push(normalized);\n\t}\n\n\tfor (const segment of segments) {\n\t\tif (segment.length >= 2 && !LATIN_STOP_WORDS.has(segment)) {\n\t\t\ttokens.push(segment);\n\t\t}\n\t}\n\n\treturn tokens;\n}\n\nfunction tokenize(text: string): string[] {\n\tconst parts = text.toLowerCase().match(TOKEN_PART_REGEX) ?? [];\n\tconst tokens: string[] = [];\n\tfor (const part of parts) {\n\t\tif (containsHanText(part)) {\n\t\t\ttokens.push(...tokenizeHanPart(part));\n\t\t\tcontinue;\n\t\t}\n\t\ttokens.push(...tokenizeAsciiPart(part));\n\t}\n\treturn Array.from(new Set(tokens));\n}\n\nfunction buildTokenSet(text: string): Set<string> {\n\treturn new Set(tokenize(text));\n}\n\nfunction computeTokenMatchStats(queryTokens: string[], text: string): TokenMatchStats {\n\tif (queryTokens.length === 0 || !text.trim()) {\n\t\treturn { matchedCount: 0, coverage: 0 };\n\t}\n\n\tconst haystack = buildTokenSet(text);\n\tlet matchedCount = 0;\n\tfor (const token of queryTokens) {\n\t\tif (haystack.has(token)) {\n\t\t\tmatchedCount++;\n\t\t}\n\t}\n\n\treturn {\n\t\tmatchedCount,\n\t\tcoverage: matchedCount / queryTokens.length,\n\t};\n}\n\nfunction collectMatchingQueryTokens(queryTokens: string[], texts: string[]): Set<string> {\n\tconst haystack = new Set<string>();\n\tfor (const text of texts) {\n\t\tfor (const token of tokenize(text)) {\n\t\t\thaystack.add(token);\n\t\t}\n\t}\n\n\tconst matches = new Set<string>();\n\tfor (const token of queryTokens) {\n\t\tif (haystack.has(token)) {\n\t\t\tmatches.add(token);\n\t\t}\n\t}\n\treturn matches;\n}\n\nfunction computeExactMatchBoost(query: string, candidate: MemoryCandidate): number {\n\tconst normalizedQuery = query.trim().toLowerCase();\n\tif (!normalizedQuery) {\n\t\treturn 0;\n\t}\n\n\tconst minLength = containsHanText(normalizedQuery) ? 2 : 4;\n\tif (normalizedQuery.length < minLength) {\n\t\treturn 0;\n\t}\n\n\tlet boost = 0;\n\tconst scoringFields: Array<[string, number]> = [\n\t\t[candidate.title, 12],\n\t\t[candidate.searchText ?? candidate.content, 8],\n\t\t[candidate.path, 4],\n\t];\n\tfor (const [field, value] of scoringFields) {\n\t\tif (field.toLowerCase().includes(normalizedQuery)) {\n\t\t\tboost += value;\n\t\t}\n\t}\n\treturn boost;\n}\n\nfunction computeRecencyBoost(timestamp: string | undefined): number {\n\tif (!timestamp) return 0;\n\tconst timestampMs = Date.parse(timestamp);\n\tif (!Number.isFinite(timestampMs)) return 0;\n\n\tconst ageMs = Date.now() - timestampMs;\n\tconst dayMs = 24 * 60 * 60 * 1000;\n\tif (ageMs <= dayMs) return 6;\n\tif (ageMs <= 7 * dayMs) return 4;\n\tif (ageMs <= 30 * dayMs) return 2;\n\treturn 0;\n}\n\nfunction detectQueryIntents(query: string): Set<QueryIntent> {\n\tconst intents = new Set<QueryIntent>();\n\tif (/\\b(now|current|currently|status)\\b/i.test(query) || /(现在|当前|目前|正在|状态)/u.test(query)) {\n\t\tintents.add(\"current-state\");\n\t}\n\tif (/\\b(next|follow-?up|todo|plan)\\b/i.test(query) || /(下一步|接下来|后续|怎么办|怎么做|该查什么)/u.test(query)) {\n\t\tintents.add(\"next-steps\");\n\t}\n\tif (\n\t\t/\\b(constraint|requirement|guardrail|compatible|compatibility)\\b/i.test(query) ||\n\t\t/(约束|限制|要求|兼容|注意事项)/u.test(query)\n\t) {\n\t\tintents.add(\"constraints\");\n\t}\n\tif (/\\b(decision|decided|why)\\b/i.test(query) || /(决策|决定|方案|为什么)/u.test(query)) {\n\t\tintents.add(\"decisions\");\n\t}\n\tif (/\\b(error|bug|failure|issue|regression)\\b/i.test(query) || /(错误|异常|失败|问题|缺陷|回归)/u.test(query)) {\n\t\tintents.add(\"errors\");\n\t}\n\tif (/\\b(history|previous|before|earlier|past)\\b/i.test(query) || /(历史|之前|以前|过去|早先|曾经)/u.test(query)) {\n\t\tintents.add(\"history\");\n\t}\n\treturn intents;\n}\n\nfunction computeSectionIntentBoost(intents: Set<QueryIntent>, candidate: MemoryCandidate): number {\n\tconst kind = candidate.sectionKind ?? \"\";\n\tlet boost = 0;\n\n\tif (intents.has(\"current-state\") && kind === \"current state\") boost += 10;\n\tif (intents.has(\"next-steps\") && kind === \"next steps\") boost += 10;\n\tif (intents.has(\"constraints\") && kind.includes(\"constraint\")) boost += 8;\n\tif (intents.has(\"decisions\") && kind.includes(\"decision\")) boost += 8;\n\tif (intents.has(\"errors\") && kind === \"errors & corrections\") boost += 8;\n\tif (intents.has(\"history\") && candidate.source === \"channel-history\") boost += 8;\n\treturn boost;\n}\n\nfunction compareScoredCandidates(a: ScoredCandidate, b: ScoredCandidate): number {\n\treturn (\n\t\tb.score - a.score ||\n\t\tb.lexicalMatchCount - a.lexicalMatchCount ||\n\t\tb.candidate.priority - a.candidate.priority ||\n\t\ta.candidate.title.localeCompare(b.candidate.title)\n\t);\n}\n\nfunction scoreCandidate(\n\tquery: string,\n\tqueryTokens: string[],\n\tintents: Set<QueryIntent>,\n\tcandidate: MemoryCandidate,\n): ScoredCandidate | null {\n\tconst searchText = candidate.searchText ?? candidate.content;\n\tconst titleStats = computeTokenMatchStats(queryTokens, candidate.title);\n\tconst contentStats = computeTokenMatchStats(queryTokens, searchText);\n\tconst pathStats = computeTokenMatchStats(queryTokens, candidate.path);\n\tconst matchedTokens = collectMatchingQueryTokens(queryTokens, [candidate.title, searchText, candidate.path]);\n\tconst exactBoost = computeExactMatchBoost(query, candidate);\n\tconst intentBoost = computeSectionIntentBoost(intents, candidate);\n\tconst overallCoverage = queryTokens.length > 0 ? matchedTokens.size / queryTokens.length : 0;\n\tconst lexicalScore =\n\t\toverallCoverage * 48 +\n\t\ttitleStats.coverage * 18 +\n\t\tcontentStats.coverage * 22 +\n\t\tpathStats.coverage * 8 +\n\t\texactBoost;\n\tconst structuralScore = candidate.priority + intentBoost + computeRecencyBoost(candidate.timestamp);\n\n\tif (matchedTokens.size === 0 && exactBoost === 0) {\n\t\treturn null;\n\t}\n\n\treturn {\n\t\tcandidate,\n\t\tscore: lexicalScore * (1 + structuralScore / 100),\n\t\tlexicalMatchCount: matchedTokens.size,\n\t\tintentBoost,\n\t};\n}\n\nfunction seedIntentCandidates(\n\trequest: RecallRequest,\n\tcandidates: MemoryCandidate[],\n\texisting: ScoredCandidate[],\n\tintents: Set<QueryIntent>,\n\tqueryTokens: string[],\n): ScoredCandidate[] {\n\tif (intents.size === 0) {\n\t\treturn existing;\n\t}\n\n\tconst seen = new Set(existing.map(({ candidate }) => candidate.id));\n\tconst seeded = [...existing];\n\tconst limit = Math.max(request.maxCandidates, request.maxInjected);\n\n\tconst intentCandidates = candidates\n\t\t.map((candidate) => ({\n\t\t\tcandidate,\n\t\t\tintentBoost: computeSectionIntentBoost(intents, candidate),\n\t\t}))\n\t\t.filter(({ candidate, intentBoost }) => intentBoost > 0 && !seen.has(candidate.id))\n\t\t.sort(\n\t\t\t(a, b) =>\n\t\t\t\tb.intentBoost - a.intentBoost ||\n\t\t\t\tb.candidate.priority - a.candidate.priority ||\n\t\t\t\ta.candidate.title.localeCompare(b.candidate.title),\n\t\t);\n\n\tfor (const { candidate, intentBoost } of intentCandidates) {\n\t\tconst matchedTokens = collectMatchingQueryTokens(queryTokens, [\n\t\t\tcandidate.title,\n\t\t\tcandidate.searchText ?? candidate.content,\n\t\t]);\n\t\tif (matchedTokens.size === 0) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tseeded.push({\n\t\t\tcandidate,\n\t\t\tscore:\n\t\t\t\t(intentBoost + matchedTokens.size * 8) *\n\t\t\t\t(1 + (candidate.priority + computeRecencyBoost(candidate.timestamp)) / 100),\n\t\t\tlexicalMatchCount: matchedTokens.size,\n\t\t\tintentBoost,\n\t\t});\n\t\tseen.add(candidate.id);\n\t\tif (seeded.length >= limit) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn seeded;\n}\n\nasync function rerankCandidates(request: RecallRequest, candidates: ScoredCandidate[]): Promise<ScoredCandidate[]> {\n\tif ((!request.rerankWithModel && !request.autoRerank) || candidates.length <= request.maxInjected) {\n\t\treturn candidates;\n\t}\n\n\tconst renderedCandidates = candidates\n\t\t.map(({ candidate, score, lexicalMatchCount, intentBoost }) => {\n\t\t\tconst clippedContent =\n\t\t\t\tcandidate.content.length > RERANK_CONTENT_CLIP\n\t\t\t\t\t? `${candidate.content.slice(0, RERANK_CONTENT_CLIP)}...`\n\t\t\t\t\t: candidate.content;\n\t\t\treturn [\n\t\t\t\t`id: ${candidate.id}`,\n\t\t\t\t`source: ${candidate.source}`,\n\t\t\t\t`title: ${candidate.title}`,\n\t\t\t\t`path: ${candidate.path}`,\n\t\t\t\t`score: ${score}`,\n\t\t\t\t`lexicalMatchCount: ${lexicalMatchCount}`,\n\t\t\t\t`intentBoost: ${intentBoost}`,\n\t\t\t\t`content: ${clippedContent}`,\n\t\t\t].join(\"\\n\");\n\t\t})\n\t\t.join(\"\\n\\n---\\n\\n\");\n\n\ttry {\n\t\tconst result = await runSidecarTask({\n\t\t\tname: \"memory-recall-rerank\",\n\t\t\tmodel: request.model,\n\t\t\tresolveApiKey: request.resolveApiKey,\n\t\t\tsystemPrompt: RERANK_SYSTEM_PROMPT,\n\t\t\tprompt: `User turn:\\n${request.query.trim()}\\n\\nCandidates:\\n${renderedCandidates}`,\n\t\t\ttimeoutMs: MEMORY_RECALL_RERANK_TIMEOUT_MS,\n\t\t\tparse: (text) => {\n\t\t\t\tconst parsed = parseJsonObject(text) as { selectedIds?: unknown };\n\t\t\t\treturn Array.isArray(parsed.selectedIds)\n\t\t\t\t\t? parsed.selectedIds.filter((id): id is string => typeof id === \"string\" && id.trim().length > 0)\n\t\t\t\t\t: [];\n\t\t\t},\n\t\t});\n\n\t\tconst selectedIds = new Set(result.output);\n\t\tif (selectedIds.size === 0) {\n\t\t\treturn candidates;\n\t\t}\n\n\t\tconst selected = candidates.filter(({ candidate }) => selectedIds.has(candidate.id));\n\t\treturn selected.length > 0 ? selected : candidates;\n\t} catch {\n\t\treturn candidates;\n\t}\n}\n\nfunction renderRecallResult(items: RecalledMemory[], maxChars: number): string {\n\tif (items.length === 0) {\n\t\treturn \"\";\n\t}\n\n\tconst lines: string[] = [\"<runtime_context>\", \"Relevant context for this turn:\"];\n\tfor (const item of items) {\n\t\tlines.push(\"\");\n\t\tlines.push(`[${item.source}/${item.title}]`);\n\t\tlines.push(`Path: ${item.path}`);\n\t\tlines.push(item.content);\n\t}\n\tlines.push(\"</runtime_context>\");\n\n\tconst rendered = lines.join(\"\\n\");\n\tif (rendered.length <= maxChars) {\n\t\treturn rendered;\n\t}\n\n\tconst clippedLines = [\"<runtime_context>\", \"Relevant context for this turn:\"];\n\tlet usedChars = clippedLines.join(\"\\n\").length + \"</runtime_context>\".length + 2;\n\tfor (const item of items) {\n\t\tconst block = [\"\", `[${item.source}/${item.title}]`, `Path: ${item.path}`, item.content].join(\"\\n\");\n\t\tif (usedChars + block.length > maxChars) {\n\t\t\tbreak;\n\t\t}\n\t\tclippedLines.push(\"\", `[${item.source}/${item.title}]`, `Path: ${item.path}`, item.content);\n\t\tusedChars += block.length;\n\t}\n\tclippedLines.push(\"</runtime_context>\");\n\treturn clippedLines.join(\"\\n\");\n}\n\nexport async function recallRelevantMemory(request: RecallRequest): Promise<RecallResult> {\n\tconst query = request.query.trim();\n\tif (!query) {\n\t\treturn { items: [], renderedText: \"\" };\n\t}\n\n\tconst candidates = await buildMemoryCandidates({\n\t\tworkspaceDir: request.workspaceDir,\n\t\tchannelDir: request.channelDir,\n\t\tcache: request.candidateCache,\n\t});\n\tconst filteredCandidates = request.allowedSources?.length\n\t\t? candidates.filter((candidate) => request.allowedSources?.includes(candidate.source))\n\t\t: candidates;\n\tif (filteredCandidates.length === 0) {\n\t\treturn { items: [], renderedText: \"\" };\n\t}\n\n\tconst queryTokens = tokenize(query);\n\tconst queryIntents = detectQueryIntents(query);\n\tconst scored = filteredCandidates\n\t\t.map((candidate) => scoreCandidate(query, queryTokens, queryIntents, candidate))\n\t\t.filter((candidate): candidate is ScoredCandidate => candidate !== null)\n\t\t.sort(compareScoredCandidates);\n\n\tconst shortlist = seedIntentCandidates(request, filteredCandidates, scored, queryIntents, queryTokens)\n\t\t.sort(compareScoredCandidates)\n\t\t.slice(0, Math.max(request.maxCandidates, request.maxInjected));\n\n\tif (shortlist.length === 0) {\n\t\treturn { items: [], renderedText: \"\" };\n\t}\n\n\tconst reranked = await rerankCandidates(request, shortlist);\n\tconst items = reranked.slice(0, request.maxInjected).map(({ candidate, score }) => ({\n\t\tsource: candidate.source,\n\t\tpath: candidate.path,\n\t\ttitle: candidate.title,\n\t\tcontent: candidate.content,\n\t\tscore,\n\t}));\n\n\treturn {\n\t\titems,\n\t\trenderedText: renderRecallResult(items, request.maxChars),\n\t};\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/memory/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,GAAG,EAAW,KAAK,EAAE,MAAM,qBAAqB,CAAC;AA4C/D,MAAM,WAAW,kBAAkB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,0BAA0B;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,aAAa,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AA8JD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAyBrE;AAcD,wBAAsB,0BAA0B,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA4BjH"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/memory/session.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@mariozechner/pi-agent-core\";\nimport type { Api, Message, Model } from \"@mariozechner/pi-ai\";\nimport { serializeConversation } from \"@mariozechner/pi-coding-agent\";\nimport { writeFile } from \"fs/promises\";\nimport { join } from \"path\";\nimport { parseJsonObject } from \"../llm-json.js\";\nimport { splitH1Sections } from \"../shared/markdown-sections.js\";\nimport { clipText } from \"../shared/text-utils.js\";\nimport { buildStandardMessages, isRecord } from \"../shared/type-guards.js\";\nimport { runSidecarTask, SidecarParseError } from \"../sidecar-worker.js\";\nimport { readChannelMemory, readChannelSession, rewriteChannelSession } from \"./files.js\";\n\nconst SESSION_TRANSCRIPT_MAX_CHARS = 20_000;\nconst SESSION_MEMORY_MAX_CHARS = 4_000;\nconst SESSION_ITEM_LIMIT = 12;\nconst SESSION_ITEM_MAX_CHARS = 300;\nconst DEFAULT_SESSION_MEMORY_TIMEOUT_MS = 30_000;\n\nconst SESSION_MEMORY_SYSTEM_PROMPT = `You maintain a Pipiclaw SESSION.md file.\n\nReturn strict JSON only. Do not use Markdown fences.\n\nOutput schema:\n{\n \"title\": \"string\",\n \"currentState\": [\"string\"],\n \"userIntent\": [\"string\"],\n \"activeFiles\": [\"string\"],\n \"decisions\": [\"string\"],\n \"constraints\": [\"string\"],\n \"errorsAndCorrections\": [\"string\"],\n \"nextSteps\": [\"string\"],\n \"worklog\": [\"string\"]\n}\n\nRules:\n- Prefer short, information-dense bullet-sized items.\n- Capture only the current active work state, not the full conversation history.\n- Keep durable facts out unless they are directly relevant to the current work.\n- \"activeFiles\" should list only files, directories, or work areas currently in focus.\n- \"errorsAndCorrections\" should record recent failures, fixes, or things to avoid repeating.\n- \"nextSteps\" should reflect the most likely immediate follow-up actions.\n- \"worklog\" must stay terse and recent.\n- If a field has nothing useful, return an empty string or empty array.`;\n\nexport interface SessionMemoryState {\n\ttitle: string;\n\tcurrentState: string[];\n\tuserIntent: string[];\n\tactiveFiles: string[];\n\tdecisions: string[];\n\tconstraints: string[];\n\terrorsAndCorrections: string[];\n\tnextSteps: string[];\n\tworklog: string[];\n}\n\nexport interface SessionMemoryUpdateOptions {\n\tchannelDir: string;\n\tmessages: AgentMessage[];\n\tmodel: Model<Api>;\n\tresolveApiKey: (model: Model<Api>) => Promise<string>;\n\ttimeoutMs?: number;\n}\n\ntype SessionMemoryStateUpdate = Partial<Record<keyof SessionMemoryState, string[] | string>>;\n\nfunction normalizeItem(value: unknown): string | null {\n\tif (typeof value !== \"string\") {\n\t\treturn null;\n\t}\n\tconst normalized = value.replace(/\\s+/g, \" \").trim();\n\tif (!normalized) {\n\t\treturn null;\n\t}\n\treturn normalized.length > SESSION_ITEM_MAX_CHARS\n\t\t? `${normalized.slice(0, SESSION_ITEM_MAX_CHARS - 3)}...`\n\t\t: normalized;\n}\n\nfunction normalizeItems(value: unknown): string[] {\n\tif (!Array.isArray(value)) {\n\t\treturn [];\n\t}\n\treturn value\n\t\t.map(normalizeItem)\n\t\t.filter((item): item is string => !!item)\n\t\t.slice(0, SESSION_ITEM_LIMIT);\n}\n\nfunction normalizeTitle(value: unknown): string {\n\treturn typeof value === \"string\" ? value.trim().slice(0, 120) : \"\";\n}\n\nfunction parseStateUpdate(text: string): SessionMemoryStateUpdate {\n\tconst parsed = parseJsonObject(text);\n\tif (!isRecord(parsed)) {\n\t\tthrow new Error(\"Session memory response was not a JSON object\");\n\t}\n\n\tconst next: SessionMemoryStateUpdate = {\n\t\ttitle: normalizeTitle(parsed.title),\n\t\tcurrentState: normalizeItems(parsed.currentState),\n\t\tuserIntent: normalizeItems(parsed.userIntent),\n\t\tactiveFiles: normalizeItems(parsed.activeFiles),\n\t\tdecisions: normalizeItems(parsed.decisions),\n\t\tconstraints: normalizeItems(parsed.constraints),\n\t\terrorsAndCorrections: normalizeItems(parsed.errorsAndCorrections),\n\t\tnextSteps: normalizeItems(parsed.nextSteps),\n\t\tworklog: normalizeItems(parsed.worklog),\n\t};\n\treturn next;\n}\n\nfunction createEmptySessionMemoryState(): SessionMemoryState {\n\treturn {\n\t\ttitle: \"\",\n\t\tcurrentState: [],\n\t\tuserIntent: [],\n\t\tactiveFiles: [],\n\t\tdecisions: [],\n\t\tconstraints: [],\n\t\terrorsAndCorrections: [],\n\t\tnextSteps: [],\n\t\tworklog: [],\n\t};\n}\n\nfunction stripHtmlComments(text: string): string {\n\treturn text.replace(/<!--[\\s\\S]*?-->/g, \"\").trim();\n}\n\nfunction parseSectionItems(content: string): string[] {\n\tconst normalized = stripHtmlComments(content);\n\tif (!normalized) {\n\t\treturn [];\n\t}\n\n\tconst lines = normalized\n\t\t.split(\"\\n\")\n\t\t.map((line) => line.trim())\n\t\t.filter(Boolean);\n\tconst bulletItems = lines\n\t\t.filter((line) => line.startsWith(\"- \"))\n\t\t.map((line) => normalizeItem(line.slice(2)))\n\t\t.filter((item): item is string => !!item);\n\tif (bulletItems.length > 0) {\n\t\treturn bulletItems.slice(0, SESSION_ITEM_LIMIT);\n\t}\n\treturn lines\n\t\t.map(normalizeItem)\n\t\t.filter((item): item is string => !!item)\n\t\t.slice(0, SESSION_ITEM_LIMIT);\n}\n\nfunction parseRenderedSessionMemory(markdown: string): SessionMemoryState {\n\tconst state = createEmptySessionMemoryState();\n\tfor (const section of splitH1Sections(markdown)) {\n\t\tswitch (section.heading.toLowerCase()) {\n\t\t\tcase \"session title\":\n\t\t\t\tstate.title = stripHtmlComments(section.content).split(\"\\n\")[0]?.trim().slice(0, 120) || \"\";\n\t\t\t\tbreak;\n\t\t\tcase \"current state\":\n\t\t\t\tstate.currentState = parseSectionItems(section.content);\n\t\t\t\tbreak;\n\t\t\tcase \"user intent\":\n\t\t\t\tstate.userIntent = parseSectionItems(section.content);\n\t\t\t\tbreak;\n\t\t\tcase \"active files\":\n\t\t\t\tstate.activeFiles = parseSectionItems(section.content);\n\t\t\t\tbreak;\n\t\t\tcase \"decisions\":\n\t\t\t\tstate.decisions = parseSectionItems(section.content);\n\t\t\t\tbreak;\n\t\t\tcase \"constraints\":\n\t\t\t\tstate.constraints = parseSectionItems(section.content);\n\t\t\t\tbreak;\n\t\t\tcase \"errors & corrections\":\n\t\t\t\tstate.errorsAndCorrections = parseSectionItems(section.content);\n\t\t\t\tbreak;\n\t\t\tcase \"next steps\":\n\t\t\t\tstate.nextSteps = parseSectionItems(section.content);\n\t\t\t\tbreak;\n\t\t\tcase \"worklog\":\n\t\t\t\tstate.worklog = parseSectionItems(section.content);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\treturn state;\n}\n\nfunction mergeSessionMemoryState(_current: SessionMemoryState, update: SessionMemoryStateUpdate): SessionMemoryState {\n\treturn {\n\t\ttitle: typeof update.title === \"string\" ? update.title : \"\",\n\t\tcurrentState: Array.isArray(update.currentState) ? update.currentState : [],\n\t\tuserIntent: Array.isArray(update.userIntent) ? update.userIntent : [],\n\t\tactiveFiles: Array.isArray(update.activeFiles) ? update.activeFiles : [],\n\t\tdecisions: Array.isArray(update.decisions) ? update.decisions : [],\n\t\tconstraints: Array.isArray(update.constraints) ? update.constraints : [],\n\t\terrorsAndCorrections: Array.isArray(update.errorsAndCorrections) ? update.errorsAndCorrections : [],\n\t\tnextSteps: Array.isArray(update.nextSteps) ? update.nextSteps : [],\n\t\tworklog: Array.isArray(update.worklog) ? update.worklog : [],\n\t};\n}\n\nasync function writeSessionMemoryDebugFile(channelDir: string, error: unknown, rawText: string): Promise<void> {\n\tconst debugPath = join(channelDir, \"SESSION.invalid-response.txt\");\n\tconst header = [\n\t\t`timestamp: ${new Date().toISOString()}`,\n\t\t`error: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\"\",\n\t\t\"raw response:\",\n\t\t\"\",\n\t].join(\"\\n\");\n\tawait writeFile(debugPath, `${header}${rawText}\\n`, \"utf-8\");\n}\n\nfunction renderSection(heading: string, items: string[]): string {\n\treturn [`# ${heading}`, \"\", ...items.map((item) => `- ${item}`)].join(\"\\n\");\n}\n\nexport function renderSessionMemory(state: SessionMemoryState): string {\n\tconst sections: string[] = [];\n\tif (state.title.trim()) {\n\t\tsections.push(\"# Session Title\", \"\", state.title.trim());\n\t}\n\n\tconst orderedSections: Array<[string, string[]]> = [\n\t\t[\"Current State\", state.currentState],\n\t\t[\"User Intent\", state.userIntent],\n\t\t[\"Active Files\", state.activeFiles],\n\t\t[\"Decisions\", state.decisions],\n\t\t[\"Constraints\", state.constraints],\n\t\t[\"Errors & Corrections\", state.errorsAndCorrections],\n\t\t[\"Next Steps\", state.nextSteps],\n\t\t[\"Worklog\", state.worklog],\n\t];\n\n\tfor (const [heading, items] of orderedSections) {\n\t\tif (items.length === 0 && heading === \"Worklog\") {\n\t\t\tcontinue;\n\t\t}\n\t\tsections.push(renderSection(heading, items));\n\t}\n\n\treturn `${sections.join(\"\\n\\n\").trim()}\\n`;\n}\n\nfunction buildSessionPrompt(currentSession: string, currentMemory: string, messages: Message[]): string {\n\tconst transcript = clipText(serializeConversation(messages), SESSION_TRANSCRIPT_MAX_CHARS);\n\treturn `Current SESSION.md:\n${currentSession || \"(empty)\"}\n\nCurrent channel MEMORY.md:\n${clipText(currentMemory, SESSION_MEMORY_MAX_CHARS) || \"(empty)\"}\n\nRecent conversation:\n${transcript || \"(empty)\"}`;\n}\n\nexport async function updateChannelSessionMemory(options: SessionMemoryUpdateOptions): Promise<SessionMemoryState> {\n\tconst currentSession = await readChannelSession(options.channelDir);\n\tconst currentMemory = await readChannelMemory(options.channelDir);\n\tconst messages = buildStandardMessages(options.messages);\n\tconst currentState = parseRenderedSessionMemory(currentSession);\n\n\tlet update: SessionMemoryStateUpdate;\n\ttry {\n\t\tconst result = await runSidecarTask({\n\t\t\tname: \"session-memory-update\",\n\t\t\tmodel: options.model,\n\t\t\tresolveApiKey: options.resolveApiKey,\n\t\t\tsystemPrompt: SESSION_MEMORY_SYSTEM_PROMPT,\n\t\t\tprompt: buildSessionPrompt(currentSession, currentMemory, messages),\n\t\t\tparse: parseStateUpdate,\n\t\t\ttimeoutMs: options.timeoutMs ?? DEFAULT_SESSION_MEMORY_TIMEOUT_MS,\n\t\t});\n\t\tupdate = result.output;\n\t} catch (error) {\n\t\tif (error instanceof SidecarParseError) {\n\t\t\tawait writeSessionMemoryDebugFile(options.channelDir, error.cause ?? error, error.rawText);\n\t\t}\n\t\tthrow error;\n\t}\n\n\tconst rendered = renderSessionMemory(mergeSessionMemoryState(currentState, update));\n\tawait rewriteChannelSession(options.channelDir, rendered);\n\treturn parseRenderedSessionMemory(rendered);\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"model-utils.d.ts","sourceRoot":"","sources":["../src/model-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,GAAG,EAAY,KAAK,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAK5D,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAE9D;AAED,wBAAgB,4BAA4B,CAC3C,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,GAC3B;IAAE,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CA2C5C;AAED,wBAAgB,eAAe,CAC9B,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,EACpB,YAAY,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,EACpC,KAAK,GAAE,MAAW,GAChB,MAAM,CAkBR;AAED,wBAAgB,mBAAmB,CAClC,aAAa,EAAE,aAAa,EAC5B,eAAe,EAAE,uBAAuB,GACtC,KAAK,CAAC,GAAG,CAAC,CAmBZ"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"model-utils.js","sourceRoot":"","sources":["../src/model-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Api, getModel, type Model } from \"@mariozechner/pi-ai\";\nimport type { ModelRegistry } from \"@mariozechner/pi-coding-agent\";\nimport type { PipiclawSettingsManager } from \"./context.js\";\n\n// Default model - will be overridden by ModelRegistry if custom models are configured\nconst defaultModel = getModel(\"anthropic\", \"claude-sonnet-4-5\");\n\nexport function formatModelReference(model: Model<Api>): string {\n\treturn `${model.provider}/${model.id}`;\n}\n\nexport function findExactModelReferenceMatch(\n\tmodelReference: string,\n\tavailableModels: Model<Api>[],\n): { match?: Model<Api>; ambiguous: boolean } {\n\tconst trimmedReference = modelReference.trim();\n\tif (!trimmedReference) {\n\t\treturn { ambiguous: false };\n\t}\n\n\tconst normalizedReference = trimmedReference.toLowerCase();\n\n\tconst canonicalMatches = availableModels.filter(\n\t\t(model) => `${model.provider}/${model.id}`.toLowerCase() === normalizedReference,\n\t);\n\tif (canonicalMatches.length === 1) {\n\t\treturn { match: canonicalMatches[0], ambiguous: false };\n\t}\n\tif (canonicalMatches.length > 1) {\n\t\treturn { ambiguous: true };\n\t}\n\n\tconst slashIndex = trimmedReference.indexOf(\"/\");\n\tif (slashIndex !== -1) {\n\t\tconst provider = trimmedReference.substring(0, slashIndex).trim();\n\t\tconst modelId = trimmedReference.substring(slashIndex + 1).trim();\n\t\tif (provider && modelId) {\n\t\t\tconst providerMatches = availableModels.filter(\n\t\t\t\t(model) =>\n\t\t\t\t\tmodel.provider.toLowerCase() === provider.toLowerCase() &&\n\t\t\t\t\tmodel.id.toLowerCase() === modelId.toLowerCase(),\n\t\t\t);\n\t\t\tif (providerMatches.length === 1) {\n\t\t\t\treturn { match: providerMatches[0], ambiguous: false };\n\t\t\t}\n\t\t\tif (providerMatches.length > 1) {\n\t\t\t\treturn { ambiguous: true };\n\t\t\t}\n\t\t}\n\t}\n\n\tconst idMatches = availableModels.filter((model) => model.id.toLowerCase() === normalizedReference);\n\tif (idMatches.length === 1) {\n\t\treturn { match: idMatches[0], ambiguous: false };\n\t}\n\n\treturn { ambiguous: idMatches.length > 1 };\n}\n\nexport function formatModelList(\n\tmodels: Model<Api>[],\n\tcurrentModel: Model<Api> | undefined,\n\tlimit: number = 20,\n): string {\n\tconst refs = models\n\t\t.slice()\n\t\t.sort((a, b) => formatModelReference(a).localeCompare(formatModelReference(b)))\n\t\t.map((model) => {\n\t\t\tconst ref = formatModelReference(model);\n\t\t\tconst marker =\n\t\t\t\tcurrentModel && currentModel.provider === model.provider && currentModel.id === model.id\n\t\t\t\t\t? \" (current)\"\n\t\t\t\t\t: \"\";\n\t\t\treturn `- \\`${ref}\\`${marker}`;\n\t\t});\n\n\tif (refs.length <= limit) {\n\t\treturn refs.join(\"\\n\");\n\t}\n\n\treturn `${refs.slice(0, limit).join(\"\\n\")}\\n- ... and ${refs.length - limit} more`;\n}\n\nexport function resolveInitialModel(\n\tmodelRegistry: ModelRegistry,\n\tsettingsManager: PipiclawSettingsManager,\n): Model<Api> {\n\tconst savedProvider = settingsManager.getDefaultProvider();\n\tconst savedModelId = settingsManager.getDefaultModel();\n\tconst availableModels = modelRegistry.getAvailable();\n\tif (savedProvider && savedModelId) {\n\t\tconst savedModel = modelRegistry.find(savedProvider, savedModelId);\n\t\tif (\n\t\t\tsavedModel &&\n\t\t\tavailableModels.some((model) => model.provider === savedModel.provider && model.id === savedModel.id)\n\t\t) {\n\t\t\treturn savedModel;\n\t\t}\n\t}\n\n\tif (availableModels.length > 0) {\n\t\treturn availableModels[0];\n\t}\n\n\treturn defaultModel;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,QAAQ,aAAa,CAAC;AACnC,eAAO,MAAM,YAAY,QAAmC,CAAC;AAC7D,eAAO,MAAM,aAAa,QAAkC,CAAC;AAC7D,eAAO,MAAM,mBAAmB,eAAe,CAAC;AAChD,eAAO,MAAM,cAAc,QAA2C,CAAC;AACvE,eAAO,MAAM,mBAAmB,QAAqC,CAAC;AACtE,eAAO,MAAM,gBAAgB,QAAkC,CAAC;AAChE,eAAO,MAAM,kBAAkB,QAAoC,CAAC;AACpE,eAAO,MAAM,oBAAoB,QAAsC,CAAC"}
package/dist/paths.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAAC;AACnC,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;AAC7D,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;AAC7D,MAAM,CAAC,MAAM,mBAAmB,GAAG,YAAY,CAAC;AAChD,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,EAAE,mBAAmB,CAAC,CAAC;AACvE,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;AACtE,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;AAChE,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;AACpE,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC","sourcesContent":["import { homedir } from \"os\";\nimport { join } from \"path\";\n\nexport const APP_NAME = \"pipiclaw\";\nexport const APP_HOME_DIR = join(homedir(), \".pi\", APP_NAME);\nexport const WORKSPACE_DIR = join(APP_HOME_DIR, \"workspace\");\nexport const SUB_AGENTS_DIR_NAME = \"sub-agents\";\nexport const SUB_AGENTS_DIR = join(WORKSPACE_DIR, SUB_AGENTS_DIR_NAME);\nexport const CHANNEL_CONFIG_PATH = join(APP_HOME_DIR, \"channel.json\");\nexport const AUTH_CONFIG_PATH = join(APP_HOME_DIR, \"auth.json\");\nexport const MODELS_CONFIG_PATH = join(APP_HOME_DIR, \"models.json\");\nexport const SETTINGS_CONFIG_PATH = join(APP_HOME_DIR, \"settings.json\");\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"prompt-builder.d.ts","sourceRoot":"","sources":["../src/prompt-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,MAAM,WAAW,yBAAyB;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,uBAAuB,CACtC,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,aAAa,EAC5B,OAAO,GAAE,yBAA8B,GACrC,MAAM,CAyJR"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"prompt-builder.js","sourceRoot":"","sources":["../src/prompt-builder.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,uBAAuB,CACtC,aAAqB,EACrB,SAAiB,EACjB,aAA4B,EAC5B,UAAqC,EAAE;IAEvC,MAAM,WAAW,GAAG,GAAG,aAAa,IAAI,SAAS,EAAE,CAAC;IACpD,MAAM,aAAa,GAAG,GAAG,aAAa,aAAa,CAAC;IACpD,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,KAAK,QAAQ,CAAC;IAEjD,MAAM,cAAc,GAAG,QAAQ;QAC9B,CAAC,CAAC;;;uCAGmC;QACrC,CAAC,CAAC;4BACwB,OAAO,CAAC,GAAG,EAAE;uCACF,CAAC;IAEvC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,QAAQ,CAAC,IAAI,CAAC;;;;;;;;;;;;;EAab,cAAc;;;EAGd,aAAa;;;;;;;MAOT,SAAS;;;;;;;0DAO2C,CAAC,CAAC;IAE3D,QAAQ,CAAC,IAAI,CAAC;wHACyG,aAAa;;;;;;sCAM/F,SAAS;;;;;qCAKV,SAAS;;;;;qCAKT,SAAS,qEAAqE,IAAI,CAAC,cAAc,EAAE,CAAC,eAAe,EAAE,CAAC,QAAQ;;;;;;;6BAOtI,aAAa;;;;;;;gCAOV,CAAC,CAAC;IAEjC,QAAQ,CAAC,IAAI,CAAC;;;;sBAIO,aAAa;;4BAEP,WAAW;;oBAEnB,WAAW;;qBAEV,WAAW;;;;;;;;;;IAU5B,WAAW;IACX,WAAW;;uJAEwI,CAAC,CAAC;IAExJ,QAAQ,CAAC,IAAI,CAAC;WACJ,aAAa;;;;;;sDAM8B,CAAC,CAAC;IAEvD,QAAQ,CAAC,IAAI,CAAC;;;;;;;wDAOyC,CAAC,CAAC;IAEzD,QAAQ,CAAC,IAAI,CAAC;;;;6CAI8B,aAAa;EACxD,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,qCAAqC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,uCAAuC;;;;;;;;;;;;;;;;;;;;;uFAqBvC,CAAC,CAAC;IAExF,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC","sourcesContent":["import type { SandboxConfig } from \"./sandbox.js\";\n\nexport interface AppendSystemPromptOptions {\n\tsubAgentList?: string;\n}\n\nexport function buildAppendSystemPrompt(\n\tworkspacePath: string,\n\tchannelId: string,\n\tsandboxConfig: SandboxConfig,\n\toptions: AppendSystemPromptOptions = {},\n): string {\n\tconst channelPath = `${workspacePath}/${channelId}`;\n\tconst subAgentsPath = `${workspacePath}/sub-agents`;\n\tconst isDocker = sandboxConfig.type === \"docker\";\n\n\tconst envDescription = isDocker\n\t\t? `You are running inside a Docker container (Alpine Linux).\n- Bash working directory: / (use cd or absolute paths)\n- Install tools with: apk add <package>\n- Your changes persist across sessions`\n\t\t: `You are running directly on the host machine.\n- Bash working directory: ${process.cwd()}\n- Be careful with system modifications`;\n\n\tconst sections: string[] = [];\n\n\tsections.push(`## Pipiclaw Runtime\nYou are running inside Pipiclaw, a DingTalk-oriented runtime built on top of pi.\n\n## Context\n- For current date/time, use: date\n- You have access to the active session context for this session.\n- Raw transcript files are cold storage. Do not assume they are preloaded.\n\n## Formatting\nUse Markdown for formatting. DingTalk AI Card supports basic Markdown:\nBold: **text**, Italic: *text*, Code: \\`code\\`, Block: \\`\\`\\`code\\`\\`\\`, Links: [text](url)\n\n## Environment\n${envDescription}\n\n## Workspace Layout\n${workspacePath}/\n├── SOUL.md # Your identity/personality (read-only)\n├── AGENTS.md # Custom behavior instructions (read-only)\n├── MEMORY.md # Stable workspace memory (admin-managed, read on demand)\n├── sub-agents/ # Predefined sub-agent definitions\n├── skills/ # Global CLI tools you create\n├── events/ # Scheduled events\n└── ${channelId}/ # This channel\n ├── SESSION.md # Channel working memory (runtime-managed, read on demand)\n ├── MEMORY.md # Channel durable memory (read on demand, runtime-managed)\n ├── HISTORY.md # Channel summarized history (read on demand, runtime-managed)\n ├── log.jsonl # Raw message archive (cold storage)\n ├── context.jsonl # Raw session archive (cold storage)\n ├── scratch/ # Your working directory\n └── skills/ # Channel-specific tools`);\n\n\tsections.push(`## Events\nYou can schedule events that wake you up at specific times or when external things happen. Events are JSON files in \\`${workspacePath}/events/\\`.\n\n### Event Types\n\n**Immediate** - Triggers as soon as harness sees the file.\n\\`\\`\\`json\n{\"type\": \"immediate\", \"channelId\": \"${channelId}\", \"text\": \"New event occurred\"}\n\\`\\`\\`\n\n**One-shot** - Triggers once at a specific time.\n\\`\\`\\`json\n{\"type\": \"one-shot\", \"channelId\": \"${channelId}\", \"text\": \"Reminder\", \"at\": \"2025-12-15T09:00:00+08:00\"}\n\\`\\`\\`\n\n**Periodic** - Triggers on a cron schedule.\n\\`\\`\\`json\n{\"type\": \"periodic\", \"channelId\": \"${channelId}\", \"text\": \"Check inbox\", \"schedule\": \"0 9 * * 1-5\", \"timezone\": \"${Intl.DateTimeFormat().resolvedOptions().timeZone}\"}\n\\`\\`\\`\n\n### Cron Format\n\\`minute hour day-of-month month day-of-week\\`\n\n### Creating Events\nCreate a JSON file under \\`${workspacePath}/events/\\` with the appropriate event payload.\nPrefer the file tools for creating or editing the event file. Use shell commands only when they are the clearest option.\n\n### Silent Completion\nFor periodic events where there's nothing to report, respond with just \\`[SILENT]\\`. This deletes the status message. Use this to avoid spam when periodic checks find nothing.\n\n### Limits\nMaximum 5 events can be queued.`);\n\n\tsections.push(`## Memory\nMemory files are not preloaded into session context. Read them explicitly when memory or history matters.\n\n### Files\n- Workspace memory: ${workspacePath}/MEMORY.md\n Stable shared background memory. Admin-managed. Read on demand.\n- Channel session memory: ${channelPath}/SESSION.md\n Current working state for this channel. Runtime-managed. Read on demand. Prefer this when current task state matters.\n- Channel memory: ${channelPath}/MEMORY.md\n Durable channel memory. Runtime-managed via consolidation. Prefer this for stable facts, decisions, preferences, and medium-horizon open loops.\n- Channel history: ${channelPath}/HISTORY.md\n Summarized older channel history. Runtime-managed. Read on demand. Do not maintain this file manually during normal work.\n\n### Runtime Behavior\n- The runtime may inject a small amount of relevant memory context from SESSION.md / MEMORY.md / HISTORY.md into a turn when it is clearly useful.\n- SESSION.md is the primary runtime-managed working-state artifact for current active work.\n- The runtime automatically consolidates channel MEMORY.md and HISTORY.md before compaction or session trimming.\n- Workspace MEMORY.md is not updated by normal runtime consolidation.\n\n### Cold Storage\n- ${channelPath}/log.jsonl is a raw archive. It is not normal memory and is not proactively loaded.\n- ${channelPath}/context.jsonl is a raw session archive. It is not normal memory and is not proactively loaded.\n\nWhen a task depends on prior decisions, preferences, or long-running work, prefer SESSION.md first for current state, then MEMORY.md, then HISTORY.md.`);\n\n\tsections.push(`## System Configuration Log\nMaintain ${workspacePath}/SYSTEM.md to log all environment modifications:\n- Installed packages (apk add, npm install, pip install)\n- Environment variables set\n- Config files modified\n- Skill dependencies installed\n\nUpdate this file whenever you modify the environment.`);\n\n\tsections.push(`## Tools\n- read: Read files\n- edit: Surgical file edits\n- write: Create or overwrite files when needed\n- bash: Run shell commands and external programs\n- subagent: Delegate a focused task to a sub-agent with its own isolated context\n\nEach tool requires a \"label\" parameter (shown to user).`);\n\n\tsections.push(`## Sub-Agents\nYou have a \\`subagent\\` tool for delegating focused work to a separate agent with an isolated context window.\n\n### Predefined Sub-Agents\nPredefined sub-agent definitions live in \\`${subAgentsPath}/\\`.\n${options.subAgentList ? `Available predefined sub-agents:\\n${options.subAgentList}` : \"Available predefined sub-agents: none\"}\n\n### Temporary Inline Sub-Agents\nIf no predefined sub-agent fits, you may define a temporary inline sub-agent directly in the \\`subagent\\` tool call by providing a focused \\`systemPrompt\\` plus optional tools, model, and budget settings.\n\nUse sub-agents when:\n- The task can be decomposed into a focused sub-problem\n- You need a fresh context for heavy file reading, shell work, or review\n- A specialized role would produce better results\n- The main conversation has grown long and you want to offload a bounded task\n\nDo not use sub-agents when:\n- The task is simple and direct\n- The task depends heavily on the full current conversation state\n- The task requires frequent user confirmation\n\nImportant rules:\n- Sub-agents cannot see your conversation history unless you include the needed context in \\`task\\`\n- The runtime injects a small fixed execution context (workspace path, channel id, sandbox), but you must still include task-specific context yourself\n- Sub-agents do not receive the \\`subagent\\` tool, so they cannot create nested agents\n- Prefer predefined sub-agents when one clearly fits\n- Use temporary inline sub-agents only when that extra flexibility is genuinely useful`);\n\n\treturn sections.join(\"\\n\\n\");\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/runtime/bootstrap.ts"],"names":[],"mappings":"AAeA,OAAO,EAAmB,KAAK,aAAa,EAAmB,MAAM,eAAe,CAAC;AAErF,OAAO,EAEN,WAAW,EACX,KAAK,cAAc,EAGnB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,WAAW,cAAc;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC3B,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IAClC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,gBAAgB;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,EAAE,CAAC,EAAE,WAAW,CAAC;IACjB,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,aAAa,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IAC1B,OAAO,EAAE,aAAa,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC/B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,sBAAsB,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,UAAU;IAC1B,GAAG,EAAE,WAAW,CAAC;IACjB,KAAK,EAAE,YAAY,CAAC;IACpB,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAmFD,eAAO,MAAM,uBAAuB,EAAE,cAQrC,CAAC;AAEF,qBAAa,kBAAmB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;CAK1C;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CAEhF;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,IAAI,CAS7D;AAeD,wBAAgB,gBAAgB,CAAC,KAAK,GAAE,cAAwC,GAAG,eAAe,CAmCjG;AAsCD,wBAAgB,qBAAqB,CACpC,MAAM,EAAE,eAAe,EACvB,EAAE,GAAE,WAAqB,EACzB,KAAK,GAAE,cAAwC,GAC7C,IAAI,CAUN;AAED,wBAAgB,UAAU,CAAC,KAAK,GAAE,cAAwC,EAAE,EAAE,GAAE,WAAqB,GAAG,cAAc,CA6BrH;AAED,wBAAgB,SAAS,CACxB,IAAI,EAAE,MAAM,EAAE,EACd,KAAK,GAAE,cAAwC,EAC/C,EAAE,GAAE,WAAqB,GACvB,UAAU,CAyBZ;AAeD,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,UAAU,CAAC,CAgPnG"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/runtime/bootstrap.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { type AgentRunner, getOrCreateRunner } from \"../agent.js\";\nimport { parseBuiltInCommand } from \"../commands.js\";\nimport * as log from \"../log.js\";\nimport { ensureChannelMemoryFilesSync } from \"../memory/files.js\";\nimport {\n\tAPP_HOME_DIR,\n\tAPP_NAME,\n\tAUTH_CONFIG_PATH,\n\tCHANNEL_CONFIG_PATH,\n\tMODELS_CONFIG_PATH,\n\tSETTINGS_CONFIG_PATH,\n\tWORKSPACE_DIR,\n} from \"../paths.js\";\nimport { parseSandboxArg, type SandboxConfig, validateSandbox } from \"../sandbox.js\";\nimport { createDingTalkContext } from \"./delivery.js\";\nimport {\n\ttype BusyMessageMode,\n\tDingTalkBot,\n\ttype DingTalkConfig,\n\ttype DingTalkEvent,\n\ttype DingTalkHandler,\n} from \"./dingtalk.js\";\nimport { createEventsWatcher } from \"./events.js\";\nimport { ChannelStore } from \"./store.js\";\n\nexport interface BootstrapPaths {\n\tappName: string;\n\tappHomeDir: string;\n\tworkspaceDir: string;\n\tauthConfigPath: string;\n\tchannelConfigPath: string;\n\tmodelsConfigPath: string;\n\tsettingsConfigPath: string;\n}\n\nexport interface BootstrapIO {\n\tlog: (...args: unknown[]) => void;\n\terror: (...args: unknown[]) => void;\n}\n\nexport interface BootstrapOptions {\n\tenv?: NodeJS.ProcessEnv;\n\tio?: BootstrapIO;\n\tpaths?: BootstrapPaths;\n\tregisterSignalHandlers?: boolean;\n\tstartServices?: boolean;\n}\n\nexport interface ParsedArgs {\n\tsandbox: SandboxConfig;\n}\n\nexport interface BootstrapResult {\n\tcreated: string[];\n\tchannelTemplateCreated: boolean;\n}\n\nexport interface AppContext {\n\tbot: DingTalkBot;\n\tstore: ChannelStore;\n\tshutdown: () => Promise<void>;\n}\n\ninterface ChannelState {\n\trunning: boolean;\n\trunner: AgentRunner;\n\tstopRequested: boolean;\n}\n\nconst DEFAULT_SOUL = `# SOUL.md\n\nConfigure Pipiclaw's identity, voice, and communication style here.\n\nSuggested sections:\n\n- Who the assistant is\n- Default language\n- Tone and personality\n- Reply style\n- Formatting preferences\n\nExample topics you may want to define:\n\n- \"Answer in Chinese by default.\"\n- \"Be concise and direct.\"\n- \"Prefer Markdown.\"\n- \"Act as an engineering assistant for our team.\"\n\nReplace this template with your actual identity prompt.\n`;\n\nconst DEFAULT_AGENT = `# AGENTS.md\n\nConfigure Pipiclaw's operating rules here.\n\nThis file should define behavior and workflow. Identity, tone, and personality belong in \\`SOUL.md\\`.\n\nSuggested sections:\n\n- Tool usage policy\n- Security constraints\n- Scheduling/reminder policy\n- Project-specific workflows\n- Things the assistant must always or never do\n\nReplace this template with your actual operating instructions.\n`;\n\nconst DEFAULT_MEMORY = `# Workspace Memory\n\nThis file stores stable workspace-level memory.\n\n- It is intended to be managed by a human administrator.\n- It is not automatically rewritten by normal runtime consolidation.\n- Store durable shared background here when it should apply across channels.\n- Keep this file focused on stable facts, policies, and shared context, not transient conversation history.\n\n## Shared Context\n\n<!-- Put team-wide or workspace-wide background here. -->\n\n## Tooling And Environment\n\n<!-- Put durable tool usage rules, environment assumptions, or shared operational conventions here. -->\n\n## Project Notes\n\n<!-- Put long-lived project facts here. -->\n`;\n\nconst CHANNEL_CONFIG_TEMPLATE = {\n\tclientId: \"your-dingtalk-client-id\",\n\tclientSecret: \"your-dingtalk-client-secret\",\n\trobotCode: \"your-robot-code\",\n\tcardTemplateId: \"your-card-template-id\",\n\tcardTemplateKey: \"content\",\n\tallowFrom: [\"your-staff-id\"],\n} satisfies DingTalkConfig;\n\nconst MODELS_CONFIG_TEMPLATE = { providers: {} };\n\nconst SHUTDOWN_WAIT_MS = 15000;\nconst SHUTDOWN_ABORT_WAIT_MS = 5000;\n\nexport const DEFAULT_BOOTSTRAP_PATHS: BootstrapPaths = {\n\tappName: APP_NAME,\n\tappHomeDir: APP_HOME_DIR,\n\tworkspaceDir: WORKSPACE_DIR,\n\tauthConfigPath: AUTH_CONFIG_PATH,\n\tchannelConfigPath: CHANNEL_CONFIG_PATH,\n\tmodelsConfigPath: MODELS_CONFIG_PATH,\n\tsettingsConfigPath: SETTINGS_CONFIG_PATH,\n};\n\nexport class BootstrapExitError extends Error {\n\treadonly code: number;\n\n\tconstructor(code: number, message?: string) {\n\t\tsuper(message ?? `Bootstrap requested exit with code ${code}`);\n\t\tthis.code = code;\n\t\tthis.name = \"BootstrapExitError\";\n\t}\n}\n\nexport function isBootstrapExitError(error: unknown): error is BootstrapExitError {\n\treturn error instanceof BootstrapExitError;\n}\n\nexport function sanitizeProxyEnv(env: NodeJS.ProcessEnv): void {\n\tif (env.DINGTALK_FORCE_PROXY !== \"true\") {\n\t\tdelete env.http_proxy;\n\t\tdelete env.https_proxy;\n\t\tdelete env.all_proxy;\n\t\tdelete env.HTTP_PROXY;\n\t\tdelete env.HTTPS_PROXY;\n\t\tdelete env.ALL_PROXY;\n\t}\n}\n\nfunction writeTextFileIfMissing(path: string, content: string, label: string, created: string[]): boolean {\n\tif (existsSync(path)) {\n\t\treturn false;\n\t}\n\twriteFileSync(path, content, \"utf-8\");\n\tcreated.push(label);\n\treturn true;\n}\n\nfunction writeJsonFileIfMissing(path: string, value: unknown, label: string, created: string[]): boolean {\n\treturn writeTextFileIfMissing(path, `${JSON.stringify(value, null, 2)}\\n`, label, created);\n}\n\nexport function bootstrapAppHome(paths: BootstrapPaths = DEFAULT_BOOTSTRAP_PATHS): BootstrapResult {\n\tconst created: string[] = [];\n\n\tif (!existsSync(paths.appHomeDir)) {\n\t\tmkdirSync(paths.appHomeDir, { recursive: true });\n\t\tcreated.push(\"app home\");\n\t}\n\tif (!existsSync(paths.workspaceDir)) {\n\t\tmkdirSync(paths.workspaceDir, { recursive: true });\n\t\tcreated.push(\"workspace/\");\n\t}\n\n\tfor (const dir of [\"skills\", \"events\", \"sub-agents\"]) {\n\t\tconst dirPath = join(paths.workspaceDir, dir);\n\t\tif (!existsSync(dirPath)) {\n\t\t\tmkdirSync(dirPath, { recursive: true });\n\t\t\tcreated.push(`workspace/${dir}/`);\n\t\t}\n\t}\n\n\twriteTextFileIfMissing(join(paths.workspaceDir, \"SOUL.md\"), DEFAULT_SOUL, \"workspace/SOUL.md\", created);\n\twriteTextFileIfMissing(join(paths.workspaceDir, \"AGENTS.md\"), DEFAULT_AGENT, \"workspace/AGENTS.md\", created);\n\twriteTextFileIfMissing(join(paths.workspaceDir, \"MEMORY.md\"), DEFAULT_MEMORY, \"workspace/MEMORY.md\", created);\n\n\tconst channelTemplateCreated = writeJsonFileIfMissing(\n\t\tpaths.channelConfigPath,\n\t\tCHANNEL_CONFIG_TEMPLATE,\n\t\t\"channel.json\",\n\t\tcreated,\n\t);\n\twriteJsonFileIfMissing(paths.authConfigPath, {}, \"auth.json\", created);\n\twriteJsonFileIfMissing(paths.modelsConfigPath, MODELS_CONFIG_TEMPLATE, \"models.json\", created);\n\twriteJsonFileIfMissing(paths.settingsConfigPath, {}, \"settings.json\", created);\n\n\treturn { created, channelTemplateCreated };\n}\n\nfunction isPlaceholderString(value: string): boolean {\n\treturn value.trim().startsWith(\"your-\");\n}\n\nfunction listChannelConfigIssues(config: Partial<DingTalkConfig>): string[] {\n\tconst issues: string[] = [];\n\n\tif (!config.clientId) {\n\t\tissues.push(\"Missing required field `clientId`.\");\n\t} else if (isPlaceholderString(config.clientId)) {\n\t\tissues.push(\"Replace placeholder value for `clientId`.\");\n\t}\n\n\tif (!config.clientSecret) {\n\t\tissues.push(\"Missing required field `clientSecret`.\");\n\t} else if (isPlaceholderString(config.clientSecret)) {\n\t\tissues.push(\"Replace placeholder value for `clientSecret`.\");\n\t}\n\n\tif (config.robotCode && isPlaceholderString(config.robotCode)) {\n\t\tissues.push(\"Replace placeholder value for `robotCode`, or set it to an empty string to reuse `clientId`.\");\n\t}\n\n\tif (config.cardTemplateId && isPlaceholderString(config.cardTemplateId)) {\n\t\tissues.push(\n\t\t\t\"Replace placeholder value for `cardTemplateId`, or set it to an empty string to disable AI Card streaming.\",\n\t\t);\n\t}\n\n\tif (Array.isArray(config.allowFrom) && config.allowFrom.some((value) => isPlaceholderString(value))) {\n\t\tissues.push(\"Replace placeholder values in `allowFrom`, or set it to an empty array to allow all users.\");\n\t}\n\n\treturn issues;\n}\n\nexport function printBootstrapSummary(\n\tresult: BootstrapResult,\n\tio: BootstrapIO = console,\n\tpaths: BootstrapPaths = DEFAULT_BOOTSTRAP_PATHS,\n): void {\n\tif (result.created.length === 0) {\n\t\treturn;\n\t}\n\n\tio.log(`Initialized ${paths.appName} under ${paths.appHomeDir}:`);\n\tfor (const item of result.created) {\n\t\tio.log(` - ${item}`);\n\t}\n\tio.log(\"\");\n}\n\nexport function loadConfig(paths: BootstrapPaths = DEFAULT_BOOTSTRAP_PATHS, io: BootstrapIO = console): DingTalkConfig {\n\tlet parsed: DingTalkConfig;\n\n\ttry {\n\t\tparsed = JSON.parse(readFileSync(paths.channelConfigPath, \"utf-8\")) as DingTalkConfig;\n\t} catch (err) {\n\t\tio.error(`Failed to parse configuration: ${paths.channelConfigPath}`);\n\t\tio.error(err instanceof Error ? err.message : String(err));\n\t\tthrow new BootstrapExitError(1);\n\t}\n\n\tconst issues = listChannelConfigIssues(parsed);\n\tif (issues.length > 0) {\n\t\tio.error(`Configuration is not ready: ${paths.channelConfigPath}`);\n\t\tfor (const issue of issues) {\n\t\t\tio.error(` - ${issue}`);\n\t\t}\n\t\tio.error(\"\");\n\t\tio.error(`Fill in ${paths.channelConfigPath} and run \\`${paths.appName}\\` again.`);\n\t\tthrow new BootstrapExitError(1);\n\t}\n\n\tparsed.cardTemplateKey = parsed.cardTemplateKey || \"content\";\n\tparsed.robotCode = parsed.robotCode?.trim() ? parsed.robotCode : parsed.clientId;\n\tif (Array.isArray(parsed.allowFrom)) {\n\t\tparsed.allowFrom = parsed.allowFrom.filter((value) => value.trim().length > 0);\n\t}\n\n\treturn parsed;\n}\n\nexport function parseArgs(\n\targv: string[],\n\tpaths: BootstrapPaths = DEFAULT_BOOTSTRAP_PATHS,\n\tio: BootstrapIO = console,\n): ParsedArgs {\n\tconst args = argv.slice(2);\n\tlet sandbox: SandboxConfig = { type: \"host\" };\n\n\tfor (let index = 0; index < args.length; index += 1) {\n\t\tconst arg = args[index];\n\t\tif (arg.startsWith(\"--sandbox=\")) {\n\t\t\tsandbox = parseSandboxArg(arg.slice(\"--sandbox=\".length));\n\t\t} else if (arg === \"--sandbox\") {\n\t\t\tsandbox = parseSandboxArg(args[index + 1] || \"\");\n\t\t\tindex += 1;\n\t\t} else if (arg === \"--help\" || arg === \"-h\") {\n\t\t\tio.log(`Usage: ${paths.appName} [options]`);\n\t\t\tio.log(\"\");\n\t\t\tio.log(\"Options:\");\n\t\t\tio.log(\" --sandbox=host Run tools on host (default)\");\n\t\t\tio.log(\" --sandbox=docker:<name> Run tools in Docker container\");\n\t\t\tio.log(\"\");\n\t\t\tio.log(`Config: ${paths.channelConfigPath}`);\n\t\t\tio.log(`Workspace: ${paths.workspaceDir}`);\n\t\t\tthrow new BootstrapExitError(0);\n\t\t}\n\t}\n\n\treturn { sandbox };\n}\n\nfunction waitForTasks(tasks: Promise<void>[], timeoutMs: number): Promise<boolean> {\n\tif (tasks.length === 0) {\n\t\treturn Promise.resolve(true);\n\t}\n\n\treturn Promise.race([\n\t\tPromise.allSettled(tasks).then(() => true),\n\t\tnew Promise<boolean>((resolve) => {\n\t\t\tsetTimeout(() => resolve(false), timeoutMs);\n\t\t}),\n\t]);\n}\n\nexport async function bootstrap(argv: string[], options: BootstrapOptions = {}): Promise<AppContext> {\n\tconst env = options.env ?? process.env;\n\tconst io = options.io ?? console;\n\tconst paths = options.paths ?? DEFAULT_BOOTSTRAP_PATHS;\n\tconst registerSignalHandlers = options.registerSignalHandlers ?? true;\n\tconst startServices = options.startServices ?? true;\n\n\tsanitizeProxyEnv(env);\n\n\tconst parsedArgs = parseArgs(argv, paths, io);\n\tconst sandbox = parsedArgs.sandbox;\n\tconst bootstrapResult = bootstrapAppHome(paths);\n\tprintBootstrapSummary(bootstrapResult, io, paths);\n\n\tif (bootstrapResult.channelTemplateCreated) {\n\t\tio.error(`Fill in ${paths.channelConfigPath} and run \\`${paths.appName}\\` again.`);\n\t\tthrow new BootstrapExitError(1);\n\t}\n\n\tconst dingtalkConfig = loadConfig(paths, io);\n\tdingtalkConfig.stateDir = paths.workspaceDir;\n\n\tawait validateSandbox(sandbox);\n\n\tconst store = new ChannelStore({ workingDir: paths.workspaceDir });\n\tconst channelStates = new Map<string, ChannelState>();\n\tconst activeTasks = new Set<Promise<void>>();\n\tlet shuttingDown = false;\n\tlet shutdownPromise: Promise<void> | null = null;\n\n\tconst getState = (channelId: string): ChannelState => {\n\t\tlet state = channelStates.get(channelId);\n\t\tif (!state) {\n\t\t\tconst channelDir = join(paths.workspaceDir, channelId);\n\t\t\tensureChannelMemoryFilesSync(channelDir);\n\t\t\tstate = {\n\t\t\t\trunning: false,\n\t\t\t\trunner: getOrCreateRunner(sandbox, channelId, channelDir),\n\t\t\t\tstopRequested: false,\n\t\t\t};\n\t\t\tchannelStates.set(channelId, state);\n\t\t}\n\t\treturn state;\n\t};\n\n\tconst handler: DingTalkHandler = {\n\t\tisRunning(channelId: string): boolean {\n\t\t\tconst state = channelStates.get(channelId);\n\t\t\treturn state?.running ?? false;\n\t\t},\n\n\t\tasync handleStop(channelId: string, _bot: DingTalkBot): Promise<void> {\n\t\t\tconst state = channelStates.get(channelId);\n\t\t\tif (state?.running) {\n\t\t\t\tstate.stopRequested = true;\n\t\t\t\tvoid state.runner.abort().catch((err) => {\n\t\t\t\t\tlog.logWarning(`[${channelId}] Failed to abort run`, err instanceof Error ? err.message : String(err));\n\t\t\t\t});\n\t\t\t\tlog.logInfo(`[${channelId}] Stop requested`);\n\t\t\t}\n\t\t},\n\n\t\tasync handleBusyMessage(\n\t\t\tevent: DingTalkEvent,\n\t\t\tbot: DingTalkBot,\n\t\t\tmode: BusyMessageMode,\n\t\t\tqueueText: string,\n\t\t): Promise<void> {\n\t\t\tif (shuttingDown) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst state = getState(event.channelId);\n\t\t\tconst trimmedQueueText = queueText.trim();\n\n\t\t\tawait store.logMessage(event.channelId, {\n\t\t\t\tdate: new Date().toISOString(),\n\t\t\t\tts: event.ts,\n\t\t\t\tuser: event.user,\n\t\t\t\tuserName: event.userName,\n\t\t\t\ttext: event.text,\n\t\t\t\tisBot: false,\n\t\t\t\tdeliveryMode: mode,\n\t\t\t\tskipContextSync: true,\n\t\t\t});\n\n\t\t\ttry {\n\t\t\t\tif (mode === \"followUp\") {\n\t\t\t\t\tawait state.runner.queueFollowUp(trimmedQueueText, event.userName);\n\t\t\t\t} else {\n\t\t\t\t\tawait state.runner.queueSteer(trimmedQueueText, event.userName);\n\t\t\t\t}\n\n\t\t\t\tconst confirmation =\n\t\t\t\t\tmode === \"followUp\"\n\t\t\t\t\t\t? \"Queued as follow-up. I’ll handle it after the current task completes.\"\n\t\t\t\t\t\t: event.text.trim().startsWith(\"/\")\n\t\t\t\t\t\t\t? \"Queued as steer. I’ll apply it after the current tool step finishes.\"\n\t\t\t\t\t\t\t: \"Queued as steer. I’ll apply this after the current tool step finishes. Use `/followup <message>` to queue it after completion.\";\n\t\t\t\tawait bot.sendPlain(event.channelId, confirmation);\n\t\t\t\tlog.logInfo(`[${event.channelId}] Queued ${mode}: ${trimmedQueueText.substring(0, 80)}`);\n\t\t\t} catch (err) {\n\t\t\t\tconst errMsg = err instanceof Error ? err.message : String(err);\n\t\t\t\tlog.logWarning(`[${event.channelId}] Failed to queue ${mode}`, errMsg);\n\t\t\t\tawait bot.sendPlain(event.channelId, `Could not queue this message: ${errMsg}`);\n\t\t\t}\n\t\t},\n\n\t\tasync handleEvent(event: DingTalkEvent, bot: DingTalkBot, _isEvent?: boolean): Promise<void> {\n\t\t\tif (shuttingDown) {\n\t\t\t\tlog.logInfo(`[${event.channelId}] Ignoring event during shutdown`);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst state = getState(event.channelId);\n\t\t\tconst task = (async () => {\n\t\t\t\tstate.running = true;\n\t\t\t\tstate.stopRequested = false;\n\n\t\t\t\tawait store.logMessage(event.channelId, {\n\t\t\t\t\tdate: new Date().toISOString(),\n\t\t\t\t\tts: event.ts,\n\t\t\t\t\tuser: event.user,\n\t\t\t\t\tuserName: event.userName,\n\t\t\t\t\ttext: event.text,\n\t\t\t\t\tisBot: false,\n\t\t\t\t});\n\n\t\t\t\ttry {\n\t\t\t\t\tconst ctx = createDingTalkContext(event, bot, store);\n\t\t\t\t\tconst builtInCommand = parseBuiltInCommand(event.text);\n\n\t\t\t\t\tif (builtInCommand) {\n\t\t\t\t\t\tlog.logInfo(`[${event.channelId}] Executing command: ${builtInCommand.rawText}`);\n\t\t\t\t\t\tawait state.runner.handleBuiltinCommand(ctx, builtInCommand);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tlog.logInfo(`[${event.channelId}] Starting run: ${event.text.substring(0, 50)}`);\n\t\t\t\t\tconst result = await state.runner.run(ctx, store);\n\n\t\t\t\t\tif (result.stopReason === \"aborted\" && state.stopRequested) {\n\t\t\t\t\t\tlog.logInfo(`[${event.channelId}] Stopped`);\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\tlog.logWarning(`[${event.channelId}] Run error`, err instanceof Error ? err.message : String(err));\n\t\t\t\t} finally {\n\t\t\t\t\tstate.running = false;\n\t\t\t\t}\n\t\t\t})();\n\n\t\t\tactiveTasks.add(task);\n\t\t\ttry {\n\t\t\t\tawait task;\n\t\t\t} finally {\n\t\t\t\tactiveTasks.delete(task);\n\t\t\t}\n\t\t},\n\t};\n\n\tlog.logStartup(paths.workspaceDir, sandbox.type === \"host\" ? \"host\" : `docker:${sandbox.container}`);\n\n\tconst bot = new DingTalkBot(handler, dingtalkConfig);\n\tconst eventsWatcher = createEventsWatcher(paths.workspaceDir, bot);\n\n\tconst shutdownWithReason = async (reason: NodeJS.Signals | \"manual\"): Promise<void> => {\n\t\tif (shutdownPromise) {\n\t\t\treturn shutdownPromise;\n\t\t}\n\n\t\tshutdownPromise = (async () => {\n\t\t\tshuttingDown = true;\n\t\t\tlog.logInfo(`Shutting down (${reason})...`);\n\n\t\t\teventsWatcher.stop();\n\t\t\tawait bot.stop();\n\n\t\t\tconst runningTasks = Array.from(activeTasks);\n\t\t\tif (runningTasks.length > 0) {\n\t\t\t\tlog.logInfo(`Waiting for ${runningTasks.length} active task(s) to finish`);\n\t\t\t\tconst completed = await waitForTasks(runningTasks, SHUTDOWN_WAIT_MS);\n\n\t\t\t\tif (!completed) {\n\t\t\t\t\tlog.logWarning(`Shutdown grace period exceeded ${SHUTDOWN_WAIT_MS}ms, aborting active runs`);\n\t\t\t\t\tconst aborts: Promise<void>[] = [];\n\t\t\t\t\tfor (const [channelId, state] of channelStates) {\n\t\t\t\t\t\tif (!state.running) continue;\n\t\t\t\t\t\tstate.stopRequested = true;\n\t\t\t\t\t\tlog.logInfo(`[${channelId}] Aborting active run for shutdown`);\n\t\t\t\t\t\taborts.push(\n\t\t\t\t\t\t\tstate.runner.abort().catch((err) => {\n\t\t\t\t\t\t\t\tlog.logWarning(\n\t\t\t\t\t\t\t\t\t`[${channelId}] Failed to abort run during shutdown`,\n\t\t\t\t\t\t\t\t\terr instanceof Error ? err.message : String(err),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tawait Promise.allSettled(aborts);\n\n\t\t\t\t\tconst remainingTasks = Array.from(activeTasks);\n\t\t\t\t\tif (remainingTasks.length > 0) {\n\t\t\t\t\t\tconst abortedCompleted = await waitForTasks(remainingTasks, SHUTDOWN_ABORT_WAIT_MS);\n\t\t\t\t\t\tif (!abortedCompleted) {\n\t\t\t\t\t\t\tlog.logWarning(`Shutdown forced exit with ${remainingTasks.length} task(s) still active`);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t})();\n\n\t\treturn shutdownPromise;\n\t};\n\n\tif (registerSignalHandlers) {\n\t\tprocess.once(\"SIGINT\", () => {\n\t\t\tvoid shutdownWithReason(\"SIGINT\").finally(() => {\n\t\t\t\tprocess.exit(0);\n\t\t\t});\n\t\t});\n\n\t\tprocess.once(\"SIGTERM\", () => {\n\t\t\tvoid shutdownWithReason(\"SIGTERM\").finally(() => {\n\t\t\t\tprocess.exit(0);\n\t\t\t});\n\t\t});\n\t}\n\n\tif (startServices) {\n\t\teventsWatcher.start();\n\t\tvoid bot.start();\n\t}\n\n\treturn {\n\t\tbot,\n\t\tstore,\n\t\tshutdown: async () => {\n\t\t\tawait shutdownWithReason(\"manual\");\n\t\t},\n\t};\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"delivery.d.ts","sourceRoot":"","sources":["../../src/runtime/delivery.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACjF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAiP/C,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,GAAG,eAAe,CAElH"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"delivery.js","sourceRoot":"","sources":["../../src/runtime/delivery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,WAAW,CAAC;AAIjC,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAInC,MAAM,yBAAyB;IAa9B,YACS,KAAoB,EACpB,GAAgB,EAChB,KAAmB;QAFnB,UAAK,GAAL,KAAK,CAAe;QACpB,QAAG,GAAH,GAAG,CAAa;QAChB,UAAK,GAAL,KAAK,CAAc;QAfpB,iBAAY,GAAG,EAAE,CAAC;QAClB,SAAI,GAAiB,UAAU,CAAC;QAChC,oBAAe,GAAG,CAAC,CAAC;QACpB,oBAAe,GAAG,CAAC,CAAC;QACpB,YAAO,GAAG,KAAK,CAAC;QAChB,WAAM,GAAG,KAAK,CAAC;QACf,2BAAsB,GAAG,KAAK,CAAC;QAC/B,4BAAuB,GAAG,CAAC,CAAC;QAC5B,oBAAe,GAAG,CAAC,CAAC;QACpB,UAAK,GAA0B,IAAI,CAAC;QACpC,iBAAY,GAAsB,EAAE,CAAC;IAM1C,CAAC;IAEJ,YAAY;QACX,OAAO;YACN,OAAO,EAAE;gBACR,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;gBACrB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;gBACxB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;gBACrB,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ;gBAC7B,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;gBAC7B,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE;aACjB;YACD,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;YACjC,OAAO,EAAE,KAAK,EAAE,IAAY,EAAE,SAAS,GAAG,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC;YACvF,YAAY,EAAE,KAAK,EAAE,IAAY,EAAE,SAAS,GAAG,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC;YACvF,cAAc,EAAE,KAAK,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;YACnE,eAAe,EAAE,KAAK,EAAE,IAAY,EAAE,EAAE;gBACvC,GAAG,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YACnD,CAAC;YACD,SAAS,EAAE,KAAK,EAAE,SAAkB,EAAE,EAAE,GAAE,CAAC;YAC3C,UAAU,EAAE,KAAK,EAAE,QAAiB,EAAE,EAAE,GAAE,CAAC;YAC3C,aAAa,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE;YACzC,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE;YAC/B,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE;SAC/B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,IAAY,EAAE,SAAkB;QAC5D,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,sBAAsB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,OAAO;QAEvE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACjF,IAAI,IAAI,CAAC,uBAAuB,KAAK,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3C,CAAC;QACD,IAAI,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;QACpF,CAAC;QAED,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,IAAY,EAAE,SAAkB;QACvD,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,sBAAsB;YAAE,OAAO,IAAI,CAAC,sBAAsB,CAAC;QAEnF,IAAI,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;QACpF,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACvE,IAAI,CAAC,SAAS,EAAE,CAAC;YAChB,OAAO,KAAK,CAAC;QACd,CAAC;QAED,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC;IACb,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,IAAY;QAC1C,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,sBAAsB;YAAE,OAAO;QAEvD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;QACrC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAEO,KAAK,CAAC,OAAO;QACpB,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QAExB,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC;QACrB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAEO,YAAY,CAAC,cAAuB;QAC3C,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IAC/B,CAAC;IAEO,QAAQ,CAAC,cAAuB;QACvC,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QAEzB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACnB,CAAC;QAED,MAAM,KAAK,GACV,cAAc,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU;YACzC,CAAC,CAAC,CAAC;YACH,CAAC,CAAC,IAAI,CAAC,GAAG,CACR,CAAC,EACD,sBAAsB;gBACrB,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAChG,CAAC;QAEL,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YACjB,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;YACxB,OAAO;QACR,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,CAAC,EAAE,KAAK,CAAC,CAAC;IACX,CAAC;IAEO,KAAK,CAAC,WAAW;QACxB,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,IAAI,CAAC;YACJ,OAAO,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;gBACpD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;gBACvB,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC;gBACtG,IAAI,IAAI,KAAK,UAAU,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;oBAC/C,MAAM,SAAS,GAAG,sBAAsB,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC,CAAC;oBACzE,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;wBACnB,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;4BAC5B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;4BAClB,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;wBACzB,CAAC,EAAE,SAAS,CAAC,CAAC;wBACd,OAAO;oBACR,CAAC;gBACF,CAAC;gBAED,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC;gBACtC,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;gBACzC,IAAI,aAAa,GAAG,KAAK,CAAC;gBAE1B,IAAI,CAAC;oBACJ,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;wBACzB,IAAI,OAAO,EAAE,CAAC;4BACb,aAAa,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;4BACrF,IAAI,CAAC,aAAa,EAAE,CAAC;gCACpB,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;4BAC5C,CAAC;wBACF,CAAC;oBACF,CAAC;yBAAM,IAAI,IAAI,KAAK,mBAAmB,EAAE,CAAC;wBACzC,IAAI,OAAO,EAAE,CAAC;4BACb,aAAa,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;4BAC7F,IAAI,CAAC,aAAa,EAAE,CAAC;gCACpB,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;4BAC5C,CAAC;wBACF,CAAC;6BAAM,CAAC;4BACP,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;wBAC5C,CAAC;oBACF,CAAC;yBAAM,IAAI,IAAI,KAAK,wBAAwB,EAAE,CAAC;wBAC9C,IAAI,OAAO,EAAE,CAAC;4BACb,aAAa,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;4BACrF,IAAI,CAAC,aAAa,EAAE,CAAC;gCACpB,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;4BAC5C,CAAC;wBACF,CAAC;6BAAM,CAAC;4BACP,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;wBAC5C,CAAC;oBACF,CAAC;yBAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;wBAC9B,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;oBAC5C,CAAC;gBACF,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACd,GAAG,CAAC,UAAU,CACb,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,wBAAwB,EAChD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAChD,CAAC;oBACF,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;gBAC5C,CAAC;gBAED,IAAI,aAAa,EAAE,CAAC;oBACnB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACnC,CAAC;gBACD,IAAI,IAAI,KAAK,UAAU,IAAI,aAAa,EAAE,CAAC;oBAC1C,IAAI,CAAC,uBAAuB,GAAG,CAAC,CAAC;gBAClC,CAAC;gBACD,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC;YACjC,CAAC;QACF,CAAC;gBAAS,CAAC;YACV,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YACrB,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAE3B,IAAI,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBAChE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;QACF,CAAC;IACF,CAAC;IAEO,SAAS;QAChB,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC;IACrF,CAAC;IAEO,mBAAmB;QAC1B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE,OAAO;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC;QAClC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,OAAO,IAAI,OAAO,EAAE,CAAC;YAC/B,OAAO,EAAE,CAAC;QACX,CAAC;IACF,CAAC;IAEO,KAAK,CAAC,KAAK;QAClB,IAAI,IAAI,CAAC,SAAS,EAAE;YAAE,OAAO;QAC7B,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACnC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,KAAK;QAClB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO;QACR,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;CACD;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAoB,EAAE,GAAgB,EAAE,KAAmB;IAChG,OAAO,IAAI,yBAAyB,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,YAAY,EAAE,CAAC;AACxE,CAAC","sourcesContent":["import * as log from \"../log.js\";\nimport type { DingTalkBot, DingTalkContext, DingTalkEvent } from \"./dingtalk.js\";\nimport type { ChannelStore } from \"./store.js\";\n\nconst MIN_UPDATE_INTERVAL_MS = 800;\n\ntype DeliveryMode = \"progress\" | \"finalize-existing\" | \"finalize-with-fallback\" | \"silent\";\n\nclass ChannelDeliveryController {\n\tprivate progressText = \"\";\n\tprivate mode: DeliveryMode = \"progress\";\n\tprivate desiredRevision = 0;\n\tprivate appliedRevision = 0;\n\tprivate running = false;\n\tprivate closed = false;\n\tprivate finalResponseDelivered = false;\n\tprivate progressWindowStartedAt = 0;\n\tprivate lastDeliveredAt = 0;\n\tprivate timer: NodeJS.Timeout | null = null;\n\tprivate flushWaiters: Array<() => void> = [];\n\n\tconstructor(\n\t\tprivate event: DingTalkEvent,\n\t\tprivate bot: DingTalkBot,\n\t\tprivate store: ChannelStore,\n\t) {}\n\n\tbuildContext(): DingTalkContext {\n\t\treturn {\n\t\t\tmessage: {\n\t\t\t\ttext: this.event.text,\n\t\t\t\trawText: this.event.text,\n\t\t\t\tuser: this.event.user,\n\t\t\t\tuserName: this.event.userName,\n\t\t\t\tchannel: this.event.channelId,\n\t\t\t\tts: this.event.ts,\n\t\t\t},\n\t\t\tchannelName: this.event.channelId,\n\t\t\trespond: async (text: string, shouldLog = true) => this.appendProgress(text, shouldLog),\n\t\t\trespondPlain: async (text: string, shouldLog = true) => this.sendFinal(text, shouldLog),\n\t\t\treplaceMessage: async (text: string) => this.replaceWithFinal(text),\n\t\t\trespondInThread: async (text: string) => {\n\t\t\t\tlog.logInfo(`[thread] ${text.substring(0, 200)}`);\n\t\t\t},\n\t\t\tsetTyping: async (_isTyping: boolean) => {},\n\t\t\tsetWorking: async (_working: boolean) => {},\n\t\t\tdeleteMessage: async () => this.silence(),\n\t\t\tflush: async () => this.flush(),\n\t\t\tclose: async () => this.close(),\n\t\t};\n\t}\n\n\tprivate async appendProgress(text: string, shouldLog: boolean): Promise<void> {\n\t\tif (this.closed || this.finalResponseDelivered || !text.trim()) return;\n\n\t\tthis.progressText = this.progressText ? `${this.progressText}\\n\\n${text}` : text;\n\t\tif (this.progressWindowStartedAt === 0) {\n\t\t\tthis.progressWindowStartedAt = Date.now();\n\t\t}\n\t\tif (shouldLog) {\n\t\t\tawait this.store.logBotResponse(this.event.channelId, text, Date.now().toString());\n\t\t}\n\n\t\tthis.mode = \"progress\";\n\t\tthis.bumpRevision(false);\n\t}\n\n\tprivate async sendFinal(text: string, shouldLog: boolean): Promise<boolean> {\n\t\tif (this.closed || this.finalResponseDelivered) return this.finalResponseDelivered;\n\n\t\tif (shouldLog) {\n\t\t\tawait this.store.logBotResponse(this.event.channelId, text, Date.now().toString());\n\t\t}\n\n\t\tconst delivered = await this.bot.sendPlain(this.event.channelId, text);\n\t\tif (!delivered) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.finalResponseDelivered = true;\n\t\tthis.mode = \"finalize-existing\";\n\t\tthis.bumpRevision(true);\n\t\treturn true;\n\t}\n\n\tprivate async replaceWithFinal(text: string): Promise<void> {\n\t\tif (this.closed || this.finalResponseDelivered) return;\n\n\t\tthis.progressText = text;\n\t\tthis.mode = \"finalize-with-fallback\";\n\t\tthis.bumpRevision(true);\n\t}\n\n\tprivate async silence(): Promise<void> {\n\t\tif (this.closed) return;\n\n\t\tthis.finalResponseDelivered = true;\n\t\tthis.mode = \"silent\";\n\t\tthis.bumpRevision(true);\n\t}\n\n\tprivate bumpRevision(forceImmediate: boolean): void {\n\t\tthis.desiredRevision++;\n\t\tthis.schedule(forceImmediate);\n\t}\n\n\tprivate schedule(forceImmediate: boolean): void {\n\t\tif (this.running) return;\n\n\t\tif (this.timer) {\n\t\t\tclearTimeout(this.timer);\n\t\t\tthis.timer = null;\n\t\t}\n\n\t\tconst delay =\n\t\t\tforceImmediate || this.mode !== \"progress\"\n\t\t\t\t? 0\n\t\t\t\t: Math.max(\n\t\t\t\t\t\t0,\n\t\t\t\t\t\tMIN_UPDATE_INTERVAL_MS -\n\t\t\t\t\t\t\t(Date.now() - (this.lastDeliveredAt > 0 ? this.lastDeliveredAt : this.progressWindowStartedAt)),\n\t\t\t\t\t);\n\n\t\tif (delay === 0) {\n\t\t\tvoid this.runSyncLoop();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.timer = setTimeout(() => {\n\t\t\tthis.timer = null;\n\t\t\tvoid this.runSyncLoop();\n\t\t}, delay);\n\t}\n\n\tprivate async runSyncLoop(): Promise<void> {\n\t\tif (this.running) return;\n\t\tthis.running = true;\n\n\t\ttry {\n\t\t\twhile (this.appliedRevision < this.desiredRevision) {\n\t\t\t\tconst mode = this.mode;\n\t\t\t\tconst throttleBaseAt = this.lastDeliveredAt > 0 ? this.lastDeliveredAt : this.progressWindowStartedAt;\n\t\t\t\tif (mode === \"progress\" && throttleBaseAt > 0) {\n\t\t\t\t\tconst remaining = MIN_UPDATE_INTERVAL_MS - (Date.now() - throttleBaseAt);\n\t\t\t\t\tif (remaining > 0) {\n\t\t\t\t\t\tthis.timer = setTimeout(() => {\n\t\t\t\t\t\t\tthis.timer = null;\n\t\t\t\t\t\t\tvoid this.runSyncLoop();\n\t\t\t\t\t\t}, remaining);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst revision = this.desiredRevision;\n\t\t\t\tconst content = this.progressText.trim();\n\t\t\t\tlet touchedRemote = false;\n\n\t\t\t\ttry {\n\t\t\t\t\tif (mode === \"progress\") {\n\t\t\t\t\t\tif (content) {\n\t\t\t\t\t\t\ttouchedRemote = await this.bot.streamToCard(this.event.channelId, this.progressText);\n\t\t\t\t\t\t\tif (!touchedRemote) {\n\t\t\t\t\t\t\t\tthis.bot.discardCard(this.event.channelId);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (mode === \"finalize-existing\") {\n\t\t\t\t\t\tif (content) {\n\t\t\t\t\t\t\ttouchedRemote = await this.bot.finalizeExistingCard(this.event.channelId, this.progressText);\n\t\t\t\t\t\t\tif (!touchedRemote) {\n\t\t\t\t\t\t\t\tthis.bot.discardCard(this.event.channelId);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.bot.discardCard(this.event.channelId);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (mode === \"finalize-with-fallback\") {\n\t\t\t\t\t\tif (content) {\n\t\t\t\t\t\t\ttouchedRemote = await this.bot.finalizeCard(this.event.channelId, this.progressText);\n\t\t\t\t\t\t\tif (!touchedRemote) {\n\t\t\t\t\t\t\t\tthis.bot.discardCard(this.event.channelId);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.bot.discardCard(this.event.channelId);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (mode === \"silent\") {\n\t\t\t\t\t\tthis.bot.discardCard(this.event.channelId);\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\tlog.logWarning(\n\t\t\t\t\t\t`[${this.event.channelId}] Delivery sync failed`,\n\t\t\t\t\t\terr instanceof Error ? err.message : String(err),\n\t\t\t\t\t);\n\t\t\t\t\tthis.bot.discardCard(this.event.channelId);\n\t\t\t\t}\n\n\t\t\t\tif (touchedRemote) {\n\t\t\t\t\tthis.lastDeliveredAt = Date.now();\n\t\t\t\t}\n\t\t\t\tif (mode !== \"progress\" || touchedRemote) {\n\t\t\t\t\tthis.progressWindowStartedAt = 0;\n\t\t\t\t}\n\t\t\t\tthis.appliedRevision = revision;\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.running = false;\n\t\t\tthis.resolveFlushWaiters();\n\n\t\t\tif (this.appliedRevision < this.desiredRevision && !this.timer) {\n\t\t\t\tthis.schedule(false);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate isSettled(): boolean {\n\t\treturn !this.running && !this.timer && this.appliedRevision >= this.desiredRevision;\n\t}\n\n\tprivate resolveFlushWaiters(): void {\n\t\tif (!this.isSettled()) return;\n\t\tconst waiters = this.flushWaiters;\n\t\tthis.flushWaiters = [];\n\t\tfor (const resolve of waiters) {\n\t\t\tresolve();\n\t\t}\n\t}\n\n\tprivate async flush(): Promise<void> {\n\t\tif (this.isSettled()) return;\n\t\tawait new Promise<void>((resolve) => {\n\t\t\tthis.flushWaiters.push(resolve);\n\t\t});\n\t}\n\n\tprivate async close(): Promise<void> {\n\t\tif (this.closed) {\n\t\t\tawait this.flush();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.closed = true;\n\t\tawait this.flush();\n\t}\n}\n\nexport function createDingTalkContext(event: DingTalkEvent, bot: DingTalkBot, store: ChannelStore): DingTalkContext {\n\treturn new ChannelDeliveryController(event, bot, store).buildContext();\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"dingtalk.d.ts","sourceRoot":"","sources":["../../src/runtime/dingtalk.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"dingtalk.js","sourceRoot":"","sources":["../../src/runtime/dingtalk.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * DingTalk communication layer using dingtalk-stream SDK with AI Card streaming.\n *\n * Handles:\n * - Receiving messages via DingTalk Stream Mode (DWClient)\n * - Responding via AI Card (streaming) or plain markdown (fallback)\n * - Access token management\n * - Per-channel message queuing\n */\nimport axios from \"axios\";\nimport { DWClient, type DWClientDownStream, TOPIC_ROBOT } from \"dingtalk-stream\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { dirname, join } from \"path\";\nimport { parseBuiltInCommand, renderBuiltInHelp } from \"../commands.js\";\nimport * as log from \"../log.js\";\nimport { isRecord } from \"../shared/type-guards.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface DingTalkConfig {\n\tclientId: string;\n\tclientSecret: string;\n\trobotCode?: string;\n\tcardTemplateId?: string;\n\tcardTemplateKey?: string;\n\tallowFrom?: string[];\n\tstateDir?: string;\n}\n\nexport interface DingTalkEvent {\n\ttype: \"dm\" | \"group\";\n\tchannelId: string; // dm_{staffId} or group_{conversationId}\n\tts: string;\n\tuser: string; // sender staff id\n\tuserName: string; // sender nickname\n\ttext: string;\n\tconversationId: string;\n\tconversationType: string; // \"1\" = DM, \"2\" = group\n}\n\nexport interface DingTalkContext {\n\tmessage: {\n\t\ttext: string;\n\t\trawText: string;\n\t\tuser: string;\n\t\tuserName?: string;\n\t\tchannel: string;\n\t\tts: string;\n\t};\n\tchannelName?: string;\n\trespond: (text: string, shouldLog?: boolean) => Promise<void>;\n\trespondPlain: (text: string, shouldLog?: boolean) => Promise<boolean>;\n\treplaceMessage: (text: string) => Promise<void>;\n\trespondInThread: (text: string) => Promise<void>;\n\tsetTyping: (isTyping: boolean) => Promise<void>;\n\tsetWorking: (working: boolean) => Promise<void>;\n\tdeleteMessage: () => Promise<void>;\n\tflush: () => Promise<void>;\n\tclose: () => Promise<void>;\n}\n\nexport type BusyMessageMode = \"steer\" | \"followUp\";\n\nexport interface DingTalkHandler {\n\tisRunning(channelId: string): boolean;\n\thandleEvent(event: DingTalkEvent, bot: DingTalkBot, isEvent?: boolean): Promise<void>;\n\thandleStop(channelId: string, bot: DingTalkBot): Promise<void>;\n\thandleBusyMessage(event: DingTalkEvent, bot: DingTalkBot, mode: BusyMessageMode, queueText: string): Promise<void>;\n}\n\n// ============================================================================\n// AI Card State\n// ============================================================================\n\ninterface AICard {\n\tinstanceId: string;\n\tconversationId: string;\n\taccessToken: string;\n\ttemplateKey: string;\n\tcreatedAt: number;\n\tlastUpdated: number;\n\tcontent: string;\n\tfinished: boolean;\n}\n\ninterface ConversationMeta {\n\tconversationId: string;\n\tconversationType: string;\n\tsenderId: string;\n}\n\ninterface DingTalkIncomingMessage {\n\tmsgId?: string;\n\tsenderStaffId?: string;\n\tsenderId?: string;\n\tsenderNick?: string;\n\tconversationId?: string;\n\tconversationType?: string;\n\tmsgtype?: string;\n\ttext?: {\n\t\tcontent?: string;\n\t};\n\tcontent?: {\n\t\trichText?: Array<Record<string, string>>;\n\t};\n}\n\ninterface DingTalkSocketLike {\n\treadyState?: number;\n\tping?: () => void;\n\ton(event: \"pong\", listener: () => void): void;\n\ton(event: \"close\", listener: (code: number, reason: string) => void): void;\n\ton(event: \"message\", listener: (raw: string) => void): void;\n}\n\n// ============================================================================\n// Per-channel queue for sequential processing\n// ============================================================================\n\ntype QueuedWork = () => Promise<void>;\n\nclass ChannelQueue {\n\tprivate queue: QueuedWork[] = [];\n\tprivate processing = false;\n\tprivate stopped = false;\n\n\tenqueue(work: QueuedWork): void {\n\t\tif (this.stopped) return;\n\t\tthis.queue.push(work);\n\t\tthis.processNext();\n\t}\n\n\tsize(): number {\n\t\treturn this.queue.length;\n\t}\n\n\tprivate async processNext(): Promise<void> {\n\t\tif (this.processing || this.stopped || this.queue.length === 0) return;\n\t\tthis.processing = true;\n\t\tconst work = this.queue.shift()!;\n\t\ttry {\n\t\t\tawait work();\n\t\t} catch (err) {\n\t\t\tlog.logWarning(\"Queue error\", err instanceof Error ? err.message : String(err));\n\t\t}\n\t\tthis.processing = false;\n\t\tthis.processNext();\n\t}\n\n\tstop(): void {\n\t\tthis.stopped = true;\n\t\tthis.queue = [];\n\t}\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst DINGTALK_API = \"https://api.dingtalk.com\";\nconst TOKEN_REFRESH_SECS = 90 * 60; // 1.5 hours (tokens expire after 2 hours)\n\n// ============================================================================\n// DingTalkBot\n// ============================================================================\n\nexport class DingTalkBot {\n\tprivate handler: DingTalkHandler;\n\tprivate config: DingTalkConfig;\n\n\t// Access token cache\n\tprivate accessToken: string | null = null;\n\tprivate tokenExpiry = 0;\n\tprivate tokenRefreshPromise: Promise<string | null> | null = null;\n\n\t// Active AI cards: channelId → AICard\n\tprivate activeCards = new Map<string, AICard>();\n\n\t// Conversation metadata cache: channelId → metadata\n\tprivate convMeta = new Map<string, ConversationMeta>();\n\n\t// Per-channel queues\n\tprivate queues = new Map<string, ChannelQueue>();\n\n\t// Connection stability\n\tprivate client: DWClient | null = null;\n\tprivate lastSocketAvailableTime = Date.now();\n\tprivate activeMessageProcessing = false;\n\tprivate keepAliveTimer: NodeJS.Timeout | null = null;\n\tprivate reconnectTimer: NodeJS.Timeout | null = null;\n\tprivate isReconnecting = false;\n\tprivate isStopped = false;\n\tprivate reconnectAttempts = 0;\n\n\t// Deduplication cache (Set for O(1) lookup, order array for FIFO eviction)\n\tprivate processedIds = new Set<string>();\n\tprivate processedIdsOrder: string[] = [];\n\n\tconstructor(handler: DingTalkHandler, config: DingTalkConfig) {\n\t\tthis.handler = handler;\n\t\tthis.config = config;\n\t}\n\n\t/**\n\t * Mark an ID as processed. Returns true if this is a new ID, false if already seen.\n\t * Maintains a FIFO buffer of at most 200 entries.\n\t */\n\tprivate markProcessed(id: string): boolean {\n\t\tif (this.processedIds.has(id)) return false;\n\t\tthis.processedIds.add(id);\n\t\tthis.processedIdsOrder.push(id);\n\t\twhile (this.processedIdsOrder.length > 200) {\n\t\t\tthis.processedIds.delete(this.processedIdsOrder.shift()!);\n\t\t}\n\t\treturn true;\n\t}\n\n\tprivate getSocket(): DingTalkSocketLike | null {\n\t\tif (!this.client) {\n\t\t\treturn null;\n\t\t}\n\t\tconst socket = Reflect.get(this.client as object, \"socket\");\n\t\treturn this.isSocketLike(socket) ? socket : null;\n\t}\n\n\tprivate isSocketLike(value: unknown): value is DingTalkSocketLike {\n\t\tif (!isRecord(value)) {\n\t\t\treturn false;\n\t\t}\n\t\treturn typeof value.on === \"function\";\n\t}\n\n\tprivate setTrackedTimeout(callback: () => void, delayMs: number): NodeJS.Timeout {\n\t\tconst timer = setTimeout(() => {\n\t\t\tcallback();\n\t\t}, delayMs);\n\t\ttimer.unref?.();\n\t\treturn timer;\n\t}\n\n\tprivate setTrackedInterval(callback: () => void, intervalMs: number): NodeJS.Timeout {\n\t\tconst timer = setInterval(callback, intervalMs);\n\t\ttimer.unref?.();\n\t\treturn timer;\n\t}\n\n\tprivate clearKeepAliveTimer(): void {\n\t\tif (this.keepAliveTimer) {\n\t\t\tclearInterval(this.keepAliveTimer);\n\t\t\tthis.keepAliveTimer = null;\n\t\t}\n\t}\n\n\tprivate clearReconnectTimer(): void {\n\t\tif (this.reconnectTimer) {\n\t\t\tclearTimeout(this.reconnectTimer);\n\t\t\tthis.reconnectTimer = null;\n\t\t}\n\t}\n\n\tprivate clearAllTimers(): void {\n\t\tthis.clearKeepAliveTimer();\n\t\tthis.clearReconnectTimer();\n\t}\n\n\tprivate async waitForDelay(delayMs: number): Promise<void> {\n\t\tawait new Promise<void>((resolve) => {\n\t\t\tthis.reconnectTimer = this.setTrackedTimeout(() => {\n\t\t\t\tthis.reconnectTimer = null;\n\t\t\t\tresolve();\n\t\t\t}, delayMs);\n\t\t});\n\t}\n\n\tprivate scheduleReconnect(delayMs: number, immediate: boolean): void {\n\t\tif (this.isStopped) {\n\t\t\treturn;\n\t\t}\n\t\tthis.clearReconnectTimer();\n\t\tthis.reconnectTimer = this.setTrackedTimeout(() => {\n\t\t\tthis.reconnectTimer = null;\n\t\t\tthis.doReconnect(immediate).catch((err) => {\n\t\t\t\tlog.logWarning(\"DingTalk: reconnect failed\", err instanceof Error ? err.message : String(err));\n\t\t\t});\n\t\t}, delayMs);\n\t}\n\n\t// ==========================================================================\n\t// Public API\n\t// ==========================================================================\n\n\tasync start(): Promise<void> {\n\t\tif (!this.config.clientId || !this.config.clientSecret) {\n\t\t\tlog.logWarning(\"DingTalk: clientId / clientSecret not configured\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.config.cardTemplateId) {\n\t\t\tlog.logWarning(\"DingTalk: cardTemplateId not configured — AI Card streaming will not work\");\n\t\t}\n\n\t\tlog.logInfo(`DingTalk: initializing stream (clientId=${this.config.clientId.substring(0, 8)}…)`);\n\n\t\tif (process.env.DINGTALK_FORCE_PROXY !== \"true\") {\n\t\t\taxios.defaults.proxy = false;\n\t\t}\n\t\tthis.clearAllTimers();\n\n\t\tthis.client = new DWClient({\n\t\t\tclientId: this.config.clientId,\n\t\t\tclientSecret: this.config.clientSecret,\n\t\t\tkeepAlive: false,\n\t\t});\n\n\t\tthis.client.registerCallbackListener(TOPIC_ROBOT, (msg: DWClientDownStream) => {\n\t\t\treturn this.handleRawMessage(msg);\n\t\t});\n\n\t\tlog.logConnected();\n\t\tawait this.doReconnect(true); // Initial connection\n\t}\n\n\tprivate handleRawMessage(msg: DWClientDownStream): { status: \"SUCCESS\"; message: string } {\n\t\t// 1. Immediate ACK\n\t\tif (msg.headers?.messageId && this.client) {\n\t\t\tthis.client.socketCallBackResponse(msg.headers.messageId, { status: \"SUCCESS\", message: \"OK\" });\n\t\t}\n\n\t\t// 2. Protocol deduplication\n\t\tconst messageId = msg.headers?.messageId;\n\t\tif (messageId && !this.markProcessed(messageId)) {\n\t\t\treturn { status: \"SUCCESS\", message: \"OK\" };\n\t\t}\n\n\t\ttry {\n\t\t\tconst parsedData = typeof msg.data === \"string\" ? JSON.parse(msg.data) : msg.data;\n\t\t\tconst data: DingTalkIncomingMessage = isRecord(parsedData) ? parsedData : {};\n\n\t\t\t// 3. Business logic deduplication\n\t\t\tconst msgId = data.msgId;\n\t\t\tif (msgId && !this.markProcessed(msgId)) {\n\t\t\t\treturn { status: \"SUCCESS\", message: \"OK\" };\n\t\t\t}\n\n\t\t\t// Fire-and-forget processing\n\t\t\tthis.onStreamMessage(data).catch((err: unknown) => {\n\t\t\t\tlog.logWarning(\"DingTalk handler error\", err instanceof Error ? err.message : String(err));\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tlog.logWarning(\"DingTalk: failed to parse message\", err instanceof Error ? err.message : String(err));\n\t\t}\n\n\t\treturn { status: \"SUCCESS\", message: \"OK\" };\n\t}\n\n\tprivate async doReconnect(immediate = false) {\n\t\tif (this.isReconnecting || this.isStopped || !this.client) return;\n\t\tthis.isReconnecting = true;\n\t\tlet connectionFailed = false;\n\n\t\tif (!immediate && this.reconnectAttempts > 0) {\n\t\t\tconst delay = Math.min(1000 * 2 ** this.reconnectAttempts + Math.random() * 1000, 30000);\n\t\t\tlog.logInfo(`DingTalk: waiting ${Math.round(delay / 1000)}s before reconnecting...`);\n\t\t\tawait this.waitForDelay(delay);\n\t\t\tif (this.isStopped || !this.client) {\n\t\t\t\tthis.isReconnecting = false;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tconst socket = this.getSocket();\n\t\t\tif (socket?.readyState === 1 || socket?.readyState === 3) {\n\t\t\t\tawait Promise.resolve(this.client.disconnect());\n\t\t\t}\n\n\t\t\tawait this.client.connect();\n\n\t\t\tthis.lastSocketAvailableTime = Date.now();\n\t\t\tthis.reconnectAttempts = 0; // Success, reset backoff\n\t\t\tlog.logInfo(\"DingTalk: connected to stream.\");\n\n\t\t\t// Setup keep alive\n\t\t\tthis.clearKeepAliveTimer();\n\t\t\tthis.keepAliveTimer = this.setTrackedInterval(() => {\n\t\t\t\tif (this.isStopped) return;\n\n\t\t\t\tconst elapsed = Date.now() - this.lastSocketAvailableTime;\n\t\t\t\tif (elapsed > 90 * 1000 && !this.activeMessageProcessing) {\n\t\t\t\t\tlog.logWarning(\"DingTalk: connection timeout detected (>90s). Keeping active where possible...\");\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tconst s = this.getSocket();\n\t\t\t\t\tif (s?.readyState === 1) {\n\t\t\t\t\t\ts.ping?.();\n\t\t\t\t\t}\n\t\t\t\t} catch (_err) {\n\t\t\t\t\t// Ignore\n\t\t\t\t}\n\t\t\t}, 30 * 1000);\n\n\t\t\t// Setup native socket events\n\t\t\tconst s = this.getSocket();\n\n\t\t\ts?.on(\"pong\", () => {\n\t\t\t\tthis.lastSocketAvailableTime = Date.now();\n\t\t\t});\n\n\t\t\ts?.on(\"close\", (code: number, reason: string) => {\n\t\t\t\tlog.logWarning(`DingTalk: WebSocket closed: code=${code}, reason=${reason}`);\n\t\t\t\tif (this.isStopped) return;\n\t\t\t\tthis.scheduleReconnect(1000, true);\n\t\t\t});\n\n\t\t\ts?.on(\"message\", (raw: string) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst msg = JSON.parse(raw);\n\t\t\t\t\tif (msg.type === \"SYSTEM\" && msg.headers?.topic === \"disconnect\") {\n\t\t\t\t\t\tlog.logWarning(\"DingTalk: disconnect event received from server.\");\n\t\t\t\t\t\tif (!this.isStopped) {\n\t\t\t\t\t\t\tthis.doReconnect(true).catch(() => {});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch (_e) {\n\t\t\t\t\t// skip\n\t\t\t\t}\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tthis.reconnectAttempts++;\n\t\t\tconnectionFailed = true;\n\t\t\tlog.logWarning(\"DingTalk: connection failed\", err instanceof Error ? err.message : String(err));\n\t\t} finally {\n\t\t\tthis.isReconnecting = false;\n\t\t}\n\n\t\t// Auto-retry on failure with exponential backoff\n\t\tif (connectionFailed && !this.isStopped) {\n\t\t\tthis.scheduleReconnect(0, false);\n\t\t}\n\t}\n\n\tasync stop(): Promise<void> {\n\t\tlog.logInfo(\"DingTalk: stopping bot\");\n\t\tthis.isStopped = true;\n\t\tthis.clearAllTimers();\n\t\tfor (const queue of this.queues.values()) {\n\t\t\tqueue.stop();\n\t\t}\n\t\tif (this.client) {\n\t\t\ttry {\n\t\t\t\tawait Promise.resolve(this.client.disconnect());\n\t\t\t} catch (err) {\n\t\t\t\tlog.logWarning(\"DingTalk: failed to disconnect cleanly\", err instanceof Error ? err.message : String(err));\n\t\t\t} finally {\n\t\t\t\tthis.client = null;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Enqueue an event for processing.\n\t * Returns true if enqueued, false if queue is full (max 5).\n\t */\n\tenqueueEvent(event: DingTalkEvent): boolean {\n\t\tif (this.isStopped) {\n\t\t\treturn false;\n\t\t}\n\t\tconst queue = this.getQueue(event.channelId);\n\t\tif (queue.size() >= 5) {\n\t\t\tlog.logWarning(`Event queue full for ${event.channelId}, discarding: ${event.text.substring(0, 50)}`);\n\t\t\treturn false;\n\t\t}\n\t\tlog.logInfo(`Enqueueing event for ${event.channelId}: ${event.text.substring(0, 50)}`);\n\t\tqueue.enqueue(async () => {\n\t\t\tthis.activeMessageProcessing = true;\n\t\t\ttry {\n\t\t\t\tawait this.handler.handleEvent(event, this, true);\n\t\t\t} finally {\n\t\t\t\tthis.activeMessageProcessing = false;\n\t\t\t\tthis.lastSocketAvailableTime = Date.now();\n\t\t\t}\n\t\t});\n\t\treturn true;\n\t}\n\n\t// ==========================================================================\n\t// AI Card operations\n\t// ==========================================================================\n\n\t/**\n\t * Get or create an AI Card for a channel.\n\t */\n\tasync ensureCard(channelId: string): Promise<void> {\n\t\tif (!this.config.cardTemplateId) return;\n\t\tconst existing = this.activeCards.get(channelId);\n\t\tif (existing && !existing.finished) return;\n\t\tawait this.createCard(channelId);\n\t}\n\n\t/**\n\t * Stream content to the active AI Card for a channel.\n\t */\n\tasync streamToCard(channelId: string, content: string, finalize: boolean = false): Promise<boolean> {\n\t\tlet card = this.activeCards.get(channelId);\n\t\tif ((!card || card.finished) && !finalize && this.config.cardTemplateId && content.trim()) {\n\t\t\tawait this.ensureCard(channelId);\n\t\t\tcard = this.activeCards.get(channelId);\n\t\t}\n\t\tif (!card || card.finished) {\n\t\t\tif (finalize) {\n\t\t\t\treturn this.sendPlain(channelId, content);\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\tconst streamed = await this.streamCard(card, content, finalize);\n\t\tif (!streamed) {\n\t\t\tthis.activeCards.delete(channelId);\n\t\t}\n\t\treturn streamed;\n\t}\n\n\t/**\n\t * Finalize the active card for a channel without falling back to a plain message.\n\t * Returns true if a card was finalized, false if no active card existed.\n\t */\n\tasync finalizeExistingCard(channelId: string, content: string): Promise<boolean> {\n\t\tlet card = this.activeCards.get(channelId);\n\t\tif ((!card || card.finished) && this.config.cardTemplateId && content.trim()) {\n\t\t\tawait this.ensureCard(channelId);\n\t\t\tcard = this.activeCards.get(channelId);\n\t\t}\n\t\tif (!card || card.finished) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst finalized = await this.streamCard(card, content, true);\n\t\tthis.activeCards.delete(channelId);\n\t\treturn finalized;\n\t}\n\n\t/**\n\t * Finalize and remove the active card for a channel.\n\t */\n\tasync finalizeCard(channelId: string, content: string): Promise<boolean> {\n\t\tconst finalized = await this.finalizeExistingCard(channelId, content);\n\t\tif (!finalized) {\n\t\t\treturn this.sendPlain(channelId, content);\n\t\t}\n\t\treturn true;\n\t}\n\n\tdiscardCard(channelId: string): void {\n\t\tthis.activeCards.delete(channelId);\n\t}\n\n\t/**\n\t * Send a normal message natively mapping DM and Group to correct endpoints (fallback when no card).\n\t */\n\tasync sendPlain(channelId: string, text: string): Promise<boolean> {\n\t\tconst token = await this.getAccessToken();\n\t\tif (!token) return false;\n\n\t\tconst meta = this.getConversationMeta(channelId);\n\t\tif (!meta) {\n\t\t\tlog.logWarning(`No conversation metadata for ${channelId}, cannot send plain message`);\n\t\t\treturn false;\n\t\t}\n\n\t\tconst robotCode = this.config.robotCode || this.config.clientId;\n\t\tconst isGroup = meta.conversationType === \"2\";\n\n\t\tconst hasMarkdown = /^#{1,6}\\s|^\\s*[-*]\\s|\\*\\*.*\\*\\*|```|`[^`]+`|\\[.*?\\]\\(.*?\\)/m.test(text);\n\n\t\tconst msgKey = hasMarkdown ? \"sampleMarkdown\" : \"sampleText\";\n\t\tconst msgParam = hasMarkdown ? JSON.stringify({ text, title: \"Bot\" }) : JSON.stringify({ content: text });\n\n\t\tconst url = isGroup\n\t\t\t? `${DINGTALK_API}/v1.0/robot/groupMessages/send`\n\t\t\t: `${DINGTALK_API}/v1.0/robot/oToMessages/batchSend`;\n\n\t\tconst body: any = {\n\t\t\trobotCode,\n\t\t\tmsgKey,\n\t\t\tmsgParam,\n\t\t};\n\n\t\tif (isGroup) {\n\t\t\tbody.openConversationId = meta.conversationId;\n\t\t} else {\n\t\t\tbody.userIds = [meta.senderId];\n\t\t}\n\n\t\ttry {\n\t\t\tawait axios.post(url, body, {\n\t\t\t\theaders: {\n\t\t\t\t\t\"x-acs-dingtalk-access-token\": token,\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t},\n\t\t\t});\n\t\t\treturn true;\n\t\t} catch (err) {\n\t\t\tif (axios.isAxiosError(err) && err.response) {\n\t\t\t\tlog.logWarning(`DingTalk plain send failed (${err.response.status})`, JSON.stringify(err.response.data));\n\t\t\t} else {\n\t\t\t\tlog.logWarning(\"DingTalk plain send error\", err instanceof Error ? err.message : String(err));\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// ==========================================================================\n\t// Private - AI Card implementation\n\t// ==========================================================================\n\n\tprivate async createCard(channelId: string): Promise<AICard | null> {\n\t\tconst token = await this.getAccessToken();\n\t\tif (!token) return null;\n\n\t\tconst meta = this.getConversationMeta(channelId);\n\t\tif (!meta) {\n\t\t\tlog.logWarning(`No conversation metadata for ${channelId}, cannot create card`);\n\t\t\treturn null;\n\t\t}\n\n\t\tconst isGroup = meta.conversationType === \"2\";\n\t\tconst instanceId = `card_${Date.now()}_${Math.random().toString(36).substring(2, 8)}`;\n\t\tconst robotCode = this.config.robotCode || this.config.clientId;\n\n\t\t// openSpaceId format:\n\t\t// 群聊: dtv1.card//IM_GROUP.{openConversationId}\n\t\t// 单聊: dtv1.card//IM_ROBOT.{userId}\n\t\tconst openSpaceId = isGroup\n\t\t\t? `dtv1.card//IM_GROUP.${meta.conversationId}`\n\t\t\t: `dtv1.card//IM_ROBOT.${meta.senderId}`;\n\n\t\tconst body: Record<string, unknown> = {\n\t\t\tcardTemplateId: this.config.cardTemplateId,\n\t\t\toutTrackId: instanceId,\n\t\t\tcardData: { cardParamMap: {} },\n\t\t\tcallbackType: \"STREAM\",\n\t\t\timGroupOpenSpaceModel: { supportForward: true },\n\t\t\timRobotOpenSpaceModel: { supportForward: true },\n\t\t\topenSpaceId,\n\t\t\tuserIdType: 1,\n\t\t};\n\n\t\tif (isGroup) {\n\t\t\tbody.imGroupOpenDeliverModel = { robotCode };\n\t\t} else {\n\t\t\tbody.imRobotOpenDeliverModel = { spaceType: \"IM_ROBOT\" };\n\t\t}\n\n\t\ttry {\n\t\t\tawait axios.post(`${DINGTALK_API}/v1.0/card/instances/createAndDeliver`, body, {\n\t\t\t\theaders: {\n\t\t\t\t\t\"x-acs-dingtalk-access-token\": token,\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t},\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tif (axios.isAxiosError(err) && err.response) {\n\t\t\t\tlog.logWarning(`DingTalk Card: create failed (${err.response.status})`, JSON.stringify(err.response.data));\n\t\t\t} else {\n\t\t\t\tlog.logWarning(\"DingTalk Card: create failed\", err instanceof Error ? err.message : String(err));\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\n\t\tconst card: AICard = {\n\t\t\tinstanceId,\n\t\t\tconversationId: meta.conversationId,\n\t\t\taccessToken: token,\n\t\t\ttemplateKey: this.config.cardTemplateKey || \"content\",\n\t\t\tcreatedAt: Date.now() / 1000,\n\t\t\tlastUpdated: Date.now() / 1000,\n\t\t\tcontent: \"\",\n\t\t\tfinished: false,\n\t\t};\n\t\tthis.activeCards.set(channelId, card);\n\t\treturn card;\n\t}\n\n\tprivate async streamCard(card: AICard, content: string, finalize: boolean = false): Promise<boolean> {\n\t\t// Refresh token if needed\n\t\tconst ageSecs = Date.now() / 1000 - card.createdAt;\n\t\tif (ageSecs > TOKEN_REFRESH_SECS) {\n\t\t\tconst token = await this.getAccessToken();\n\t\t\tif (token) {\n\t\t\t\tcard.accessToken = token;\n\t\t\t}\n\t\t}\n\n\t\tconst body = {\n\t\t\toutTrackId: card.instanceId,\n\t\t\tguid: `${Date.now()}_${Math.random().toString(36).substring(2, 8)}`,\n\t\t\tkey: card.templateKey,\n\t\t\tcontent,\n\t\t\tisFull: true,\n\t\t\tisFinalize: finalize,\n\t\t\tisError: false,\n\t\t};\n\n\t\tconst start = Date.now();\n\t\ttry {\n\t\t\tawait axios.put(`${DINGTALK_API}/v1.0/card/streaming`, body, {\n\t\t\t\theaders: {\n\t\t\t\t\t\"x-acs-dingtalk-access-token\": card.accessToken,\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tconst duration = Date.now() - start;\n\t\t\tif (duration > 1000) {\n\t\t\t\tlog.logWarning(`DingTalk Card: streaming request took ${duration}ms (slow)`);\n\t\t\t}\n\n\t\t\tcard.lastUpdated = Date.now() / 1000;\n\t\t\tcard.content = content;\n\t\t\tif (finalize) {\n\t\t\t\tcard.finished = true;\n\t\t\t}\n\t\t\treturn true;\n\t\t} catch (err) {\n\t\t\tif (axios.isAxiosError(err) && err.response) {\n\t\t\t\tlog.logWarning(\n\t\t\t\t\t`DingTalk Card: streaming failed (${err.response.status})`,\n\t\t\t\t\tJSON.stringify(err.response.data),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tlog.logWarning(\"DingTalk Card: streaming failed\", err instanceof Error ? err.message : String(err));\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// ==========================================================================\n\t// Private - Access Token\n\t// ==========================================================================\n\n\tprivate async getAccessToken(): Promise<string | null> {\n\t\tif (this.accessToken && Date.now() / 1000 < this.tokenExpiry) {\n\t\t\treturn this.accessToken;\n\t\t}\n\n\t\t// Coalesce concurrent refresh requests into a single HTTP call\n\t\tif (!this.tokenRefreshPromise) {\n\t\t\tthis.tokenRefreshPromise = this.refreshAccessToken().finally(() => {\n\t\t\t\tthis.tokenRefreshPromise = null;\n\t\t\t});\n\t\t}\n\t\treturn this.tokenRefreshPromise;\n\t}\n\n\tprivate async refreshAccessToken(): Promise<string | null> {\n\t\ttry {\n\t\t\tconst resp = await axios.post(\n\t\t\t\t`${DINGTALK_API}/v1.0/oauth2/accessToken`,\n\t\t\t\t{\n\t\t\t\t\tappKey: this.config.clientId,\n\t\t\t\t\tappSecret: this.config.clientSecret,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tconst data = resp.data as { accessToken?: string; expireIn?: number };\n\t\t\tthis.accessToken = data.accessToken || null;\n\t\t\tthis.tokenExpiry = Date.now() / 1000 + (data.expireIn || 7200) - 60;\n\t\t\treturn this.accessToken;\n\t\t} catch (err) {\n\t\t\tif (axios.isAxiosError(err) && err.response) {\n\t\t\t\tlog.logWarning(\n\t\t\t\t\t`DingTalk: failed to get access token (${err.response.status})`,\n\t\t\t\t\tJSON.stringify(err.response.data),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tlog.logWarning(\"DingTalk: failed to get access token\", err instanceof Error ? err.message : String(err));\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t// ==========================================================================\n\t// Private - Message handling\n\t// ==========================================================================\n\n\tprivate extractContent(data: DingTalkIncomingMessage): string {\n\t\t// 1. text 类型消息:从 text.content 提取\n\t\tconst textContent = (data.text?.content || \"\").trim();\n\t\tif (textContent) return textContent;\n\n\t\t// 2. richText 类型消息:从 content.richText 列表提取文本片段\n\t\tif (data.content?.richText) {\n\t\t\tconst parts: string[] = [];\n\t\t\tfor (const item of data.content.richText) {\n\t\t\t\tif (item.text) parts.push(item.text);\n\t\t\t}\n\t\t\tconst joined = parts.join(\"\").trim();\n\t\t\tif (joined) return joined;\n\t\t}\n\n\t\treturn \"\";\n\t}\n\n\tprivate async onStreamMessage(data: DingTalkIncomingMessage): Promise<void> {\n\t\tif (this.isStopped) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst content = this.extractContent(data);\n\t\tconst senderId = data.senderStaffId || data.senderId || \"\";\n\t\tconst senderName = data.senderNick || \"Unknown\";\n\t\tconst conversationId = data.conversationId || \"\";\n\t\tconst conversationType = data.conversationType || \"1\";\n\n\t\tif (!content) {\n\t\t\tconst msgtype = typeof data.msgtype === \"string\" ? data.msgtype : \"unknown\";\n\t\t\tlog.logWarning(`DingTalk: empty message (type=${msgtype})`);\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.config.allowFrom && this.config.allowFrom.length > 0) {\n\t\t\tif (!this.config.allowFrom.includes(senderId)) {\n\t\t\t\tlog.logWarning(`DingTalk: ignoring message from unauthorized user ${senderName} (${senderId})`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Determine channel ID\n\t\tconst channelId = conversationType === \"2\" ? `group_${conversationId}` : `dm_${senderId}`;\n\n\t\tlog.logInfo(`DingTalk ← ${senderName} (${senderId}) [${channelId}]: ${content.substring(0, 80)}`);\n\n\t\t// Cache conversation metadata for card creation\n\t\tthis.setConversationMeta(channelId, {\n\t\t\tconversationId,\n\t\t\tconversationType,\n\t\t\tsenderId,\n\t\t});\n\n\t\t// Build event\n\t\tconst event: DingTalkEvent = {\n\t\t\ttype: conversationType === \"2\" ? \"group\" : \"dm\",\n\t\t\tchannelId,\n\t\t\tts: Date.now().toString(),\n\t\t\tuser: senderId,\n\t\t\tuserName: senderName,\n\t\t\ttext: content,\n\t\t\tconversationId,\n\t\t\tconversationType,\n\t\t};\n\n\t\tconst builtInCommand = parseBuiltInCommand(content);\n\t\tconst isSlashCommand = content.trim().startsWith(\"/\");\n\n\t\t// Check if busy\n\t\tif (this.handler.isRunning(channelId)) {\n\t\t\tif (builtInCommand?.name === \"help\") {\n\t\t\t\tawait this.sendPlain(channelId, renderBuiltInHelp());\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (builtInCommand?.name === \"stop\") {\n\t\t\t\tawait this.handler.handleStop(channelId, this);\n\t\t\t\tawait this.sendPlain(channelId, \"Stopping the current task.\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (builtInCommand?.name === \"steer\") {\n\t\t\t\tawait this.handler.handleBusyMessage(event, this, \"steer\", builtInCommand.args);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (builtInCommand?.name === \"followup\") {\n\t\t\t\tawait this.handler.handleBusyMessage(event, this, \"followUp\", builtInCommand.args);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (builtInCommand) {\n\t\t\t\tawait this.sendPlain(\n\t\t\t\t\tchannelId,\n\t\t\t\t\t\"A task is already running. Use `/stop`, `/steer <message>`, or `/followup <message>`. Plain messages default to steer.\",\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (isSlashCommand) {\n\t\t\t\tawait this.sendPlain(\n\t\t\t\t\tchannelId,\n\t\t\t\t\t\"A task is already running. Only `/stop`, `/steer <message>`, and `/followup <message>` are available while streaming.\",\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait this.handler.handleBusyMessage(event, this, \"steer\", content);\n\t\t\treturn;\n\t\t}\n\n\t\t// Enqueue for processing\n\t\tthis.getQueue(channelId).enqueue(async () => {\n\t\t\tthis.activeMessageProcessing = true;\n\t\t\ttry {\n\t\t\t\tawait this.handler.handleEvent(event, this);\n\t\t\t} finally {\n\t\t\t\tthis.activeMessageProcessing = false;\n\t\t\t\tthis.lastSocketAvailableTime = Date.now();\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate getQueue(channelId: string): ChannelQueue {\n\t\tlet queue = this.queues.get(channelId);\n\t\tif (!queue) {\n\t\t\tqueue = new ChannelQueue();\n\t\t\tthis.queues.set(channelId, queue);\n\t\t}\n\t\treturn queue;\n\t}\n\n\tprivate getConversationMeta(channelId: string): ConversationMeta | null {\n\t\tconst cached = this.convMeta.get(channelId);\n\t\tif (cached) return cached;\n\n\t\tconst metaPath = this.getConversationMetaPath(channelId);\n\t\tif (!metaPath || !existsSync(metaPath)) {\n\t\t\treturn null;\n\t\t}\n\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(readFileSync(metaPath, \"utf-8\")) as Partial<ConversationMeta>;\n\t\t\tif (!parsed.conversationId || !parsed.conversationType || !parsed.senderId) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst meta: ConversationMeta = {\n\t\t\t\tconversationId: parsed.conversationId,\n\t\t\t\tconversationType: parsed.conversationType,\n\t\t\t\tsenderId: parsed.senderId,\n\t\t\t};\n\t\t\tthis.convMeta.set(channelId, meta);\n\t\t\treturn meta;\n\t\t} catch (err) {\n\t\t\tlog.logWarning(\n\t\t\t\t`Failed to load conversation metadata for ${channelId}`,\n\t\t\t\terr instanceof Error ? err.message : String(err),\n\t\t\t);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate setConversationMeta(channelId: string, meta: ConversationMeta): void {\n\t\tthis.convMeta.set(channelId, meta);\n\n\t\tconst metaPath = this.getConversationMetaPath(channelId);\n\t\tif (!metaPath) return;\n\n\t\ttry {\n\t\t\tmkdirSync(dirname(metaPath), { recursive: true });\n\t\t\twriteFileSync(metaPath, JSON.stringify(meta, null, 2), \"utf-8\");\n\t\t} catch (err) {\n\t\t\tlog.logWarning(\n\t\t\t\t`Failed to persist conversation metadata for ${channelId}`,\n\t\t\t\terr instanceof Error ? err.message : String(err),\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate getConversationMetaPath(channelId: string): string | null {\n\t\tif (!this.config.stateDir) return null;\n\t\treturn join(this.config.stateDir, channelId, \".channel-meta.json\");\n\t}\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/runtime/events.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAiB,MAAM,eAAe,CAAC;AAMhE,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,cAAc,GAAG,cAAc,GAAG,YAAY,GAAG,aAAa,CAAC;AAW3E,qBAAa,aAAa;IASxB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,GAAG;IATZ,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,KAAK,CAAgC;IAC7C,OAAO,CAAC,cAAc,CAA0C;IAChE,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,UAAU,CAA0B;gBAGnC,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,WAAW;IAKzB,KAAK,IAAI,IAAI;IAiBb,IAAI,IAAI,IAAI;IAyBZ,OAAO,CAAC,QAAQ;IAchB,OAAO,CAAC,YAAY;IAcpB,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,eAAe;YAcT,UAAU;IAwCxB,OAAO,CAAC,UAAU;IAqClB,OAAO,CAAC,eAAe;IAkBvB,OAAO,CAAC,aAAa;IAoCrB,OAAO,CAAC,cAAc;IAiBtB,OAAO,CAAC,OAAO;IAwCf,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,KAAK;CAGb;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,aAAa,CAGzF"}