@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
@@ -70,4 +70,3 @@ export function resolveInitialModel(modelRegistry, settingsManager) {
70
70
  }
71
71
  return defaultModel;
72
72
  }
73
- //# sourceMappingURL=model-utils.js.map
package/dist/paths.d.ts CHANGED
@@ -7,4 +7,3 @@ export declare const CHANNEL_CONFIG_PATH: string;
7
7
  export declare const AUTH_CONFIG_PATH: string;
8
8
  export declare const MODELS_CONFIG_PATH: string;
9
9
  export declare const SETTINGS_CONFIG_PATH: string;
10
- //# sourceMappingURL=paths.d.ts.map
package/dist/paths.js CHANGED
@@ -9,4 +9,3 @@ export const CHANNEL_CONFIG_PATH = join(APP_HOME_DIR, "channel.json");
9
9
  export const AUTH_CONFIG_PATH = join(APP_HOME_DIR, "auth.json");
10
10
  export const MODELS_CONFIG_PATH = join(APP_HOME_DIR, "models.json");
11
11
  export const SETTINGS_CONFIG_PATH = join(APP_HOME_DIR, "settings.json");
12
- //# sourceMappingURL=paths.js.map
@@ -3,4 +3,3 @@ export interface AppendSystemPromptOptions {
3
3
  subAgentList?: string;
4
4
  }
5
5
  export declare function buildAppendSystemPrompt(workspacePath: string, channelId: string, sandboxConfig: SandboxConfig, options?: AppendSystemPromptOptions): string;
6
- //# sourceMappingURL=prompt-builder.d.ts.map
@@ -143,4 +143,3 @@ Important rules:
143
143
  - Use temporary inline sub-agents only when that extra flexibility is genuinely useful`);
144
144
  return sections.join("\n\n");
145
145
  }
146
- //# sourceMappingURL=prompt-builder.js.map
@@ -45,4 +45,3 @@ export declare function printBootstrapSummary(result: BootstrapResult, io?: Boot
45
45
  export declare function loadConfig(paths?: BootstrapPaths, io?: BootstrapIO): DingTalkConfig;
46
46
  export declare function parseArgs(argv: string[], paths?: BootstrapPaths, io?: BootstrapIO): ParsedArgs;
47
47
  export declare function bootstrap(argv: string[], options?: BootstrapOptions): Promise<AppContext>;
48
- //# sourceMappingURL=bootstrap.d.ts.map
@@ -448,4 +448,3 @@ export async function bootstrap(argv, options = {}) {
448
448
  },
449
449
  };
450
450
  }
451
- //# sourceMappingURL=bootstrap.js.map
@@ -1,4 +1,3 @@
1
1
  import type { DingTalkBot, DingTalkContext, DingTalkEvent } from "./dingtalk.js";
2
2
  import type { ChannelStore } from "./store.js";
3
3
  export declare function createDingTalkContext(event: DingTalkEvent, bot: DingTalkBot, store: ChannelStore): DingTalkContext;
4
- //# sourceMappingURL=delivery.d.ts.map
@@ -215,4 +215,3 @@ class ChannelDeliveryController {
215
215
  export function createDingTalkContext(event, bot, store) {
216
216
  return new ChannelDeliveryController(event, bot, store).buildContext();
217
217
  }
218
- //# sourceMappingURL=delivery.js.map
@@ -120,4 +120,3 @@ export declare class DingTalkBot {
120
120
  private setConversationMeta;
121
121
  private getConversationMetaPath;
122
122
  }
123
- //# sourceMappingURL=dingtalk.d.ts.map
@@ -764,4 +764,3 @@ export class DingTalkBot {
764
764
  return join(this.config.stateDir, channelId, ".channel-meta.json");
765
765
  }
766
766
  }
767
- //# sourceMappingURL=dingtalk.js.map
@@ -48,4 +48,3 @@ export declare class EventsWatcher {
48
48
  * Create and start an events watcher.
49
49
  */
50
50
  export declare function createEventsWatcher(workspaceDir: string, bot: DingTalkBot): EventsWatcher;
51
- //# sourceMappingURL=events.d.ts.map
@@ -292,4 +292,3 @@ export function createEventsWatcher(workspaceDir, bot) {
292
292
  const eventsDir = join(workspaceDir, "events");
293
293
  return new EventsWatcher(eventsDir, bot);
294
294
  }
295
- //# sourceMappingURL=events.js.map
@@ -77,4 +77,3 @@ export declare class ChannelStore {
77
77
  private startCleanupTimer;
78
78
  private cleanupExpiredEntries;
79
79
  }
80
- //# sourceMappingURL=store.d.ts.map
@@ -194,4 +194,3 @@ export class ChannelStore {
194
194
  }
195
195
  }
196
196
  }
197
- //# sourceMappingURL=store.js.map
package/dist/sandbox.d.ts CHANGED
@@ -32,4 +32,3 @@ export interface ExecResult {
32
32
  stderr: string;
33
33
  code: number;
34
34
  }
35
- //# sourceMappingURL=sandbox.d.ts.map
package/dist/sandbox.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { spawn } from "child_process";
2
- import { shellEscape } from "./shell-escape.js";
2
+ import { shellEscape } from "./shared/shell-escape.js";
3
3
  export function parseSandboxArg(value) {
4
4
  if (value === "host") {
5
5
  return { type: "host" };
@@ -219,4 +219,3 @@ function killProcessTree(pid) {
219
219
  }
220
220
  }
221
221
  }
222
- //# sourceMappingURL=sandbox.js.map
@@ -4,4 +4,3 @@ export declare class LlmJsonParseError extends Error {
4
4
  }
5
5
  export declare function extractJsonObject(text: string): string;
6
6
  export declare function parseJsonObject(text: string): unknown;
7
- //# sourceMappingURL=llm-json.d.ts.map
@@ -74,4 +74,3 @@ export function extractJsonObject(text) {
74
74
  export function parseJsonObject(text) {
75
75
  return JSON.parse(extractJsonObject(text));
76
76
  }
77
- //# sourceMappingURL=llm-json.js.map
@@ -4,4 +4,3 @@ export interface MarkdownSection {
4
4
  }
5
5
  export declare function splitH1Sections(content: string): MarkdownSection[];
6
6
  export declare function splitH2Sections(content: string): MarkdownSection[];
7
- //# sourceMappingURL=markdown-sections.d.ts.map
@@ -38,4 +38,3 @@ export function splitH1Sections(content) {
38
38
  export function splitH2Sections(content) {
39
39
  return splitSectionsByHeading(content, "## ");
40
40
  }
41
- //# sourceMappingURL=markdown-sections.js.map
@@ -3,4 +3,3 @@
3
3
  * Wraps in single quotes and escapes internal single quotes.
4
4
  */
5
5
  export declare function shellEscape(s: string): string;
6
- //# sourceMappingURL=shell-escape.d.ts.map
@@ -5,4 +5,3 @@
5
5
  export function shellEscape(s) {
6
6
  return `'${s.replace(/'/g, "'\\''")}'`;
7
7
  }
8
- //# sourceMappingURL=shell-escape.js.map
@@ -7,4 +7,3 @@ export declare function truncate(text: string, maxLen: number): string;
7
7
  export declare const HAN_REGEX: RegExp;
8
8
  export declare function extractLabelFromArgs(args: unknown): string | null;
9
9
  export declare function extractAssistantText(message: AssistantMessage): string;
10
- //# sourceMappingURL=text-utils.d.ts.map
@@ -34,4 +34,3 @@ export function extractAssistantText(message) {
34
34
  .join("\n")
35
35
  .trim();
36
36
  }
37
- //# sourceMappingURL=text-utils.js.map
@@ -3,4 +3,3 @@ import type { Message } from "@mariozechner/pi-ai";
3
3
  export declare function isRecord(value: unknown): value is Record<string, unknown>;
4
4
  export declare function isStandardAgentMessage(message: AgentMessage): message is Message;
5
5
  export declare function buildStandardMessages(messages: AgentMessage[]): Message[];
6
- //# sourceMappingURL=type-guards.d.ts.map
@@ -10,4 +10,3 @@ export function isStandardAgentMessage(message) {
10
10
  export function buildStandardMessages(messages) {
11
11
  return messages.filter(isStandardAgentMessage);
12
12
  }
13
- //# sourceMappingURL=type-guards.js.map
@@ -12,4 +12,3 @@ export interface UsageTotals {
12
12
  total: number;
13
13
  };
14
14
  }
15
- //# sourceMappingURL=types.d.ts.map
@@ -1,2 +1 @@
1
1
  export {};
2
- //# sourceMappingURL=types.js.map
@@ -24,4 +24,3 @@ export declare class SidecarParseError extends Error {
24
24
  constructor(taskName: string, rawText: string, cause: unknown);
25
25
  }
26
26
  export declare function runSidecarTask<T>(task: SidecarTask<T>): Promise<SidecarResult<T>>;
27
- //# sourceMappingURL=sidecar-worker.d.ts.map
@@ -96,4 +96,3 @@ export async function runSidecarTask(task) {
96
96
  removeAbortListener();
97
97
  }
98
98
  }
99
- //# sourceMappingURL=sidecar-worker.js.map
@@ -58,4 +58,3 @@ export declare function resolveSubAgentConfig(availableModels: Model<Api>[], cur
58
58
  };
59
59
  export declare function formatSubAgentList(agents: SubAgentConfig[], maxItems?: number): string;
60
60
  export {};
61
- //# sourceMappingURL=discovery.d.ts.map
@@ -366,4 +366,3 @@ export function formatSubAgentList(agents, maxItems = 12) {
366
366
  }
367
367
  return `${listed.join("\n")}\n- ... and ${agents.length - maxItems} more`;
368
368
  }
369
- //# sourceMappingURL=discovery.js.map
@@ -64,4 +64,3 @@ interface SubAgentWorker {
64
64
  }
65
65
  export declare function createSubAgentTool(options: SubAgentToolOptions): AgentTool<typeof subagentSchema, SubAgentToolDetails>;
66
66
  export {};
67
- //# sourceMappingURL=tool.d.ts.map
@@ -373,4 +373,3 @@ export function createSubAgentTool(options) {
373
373
  },
374
374
  };
375
375
  }
376
- //# sourceMappingURL=tool.js.map
@@ -11,4 +11,3 @@ export type UploadFunction = (filePath: string, title?: string) => Promise<void>
11
11
  */
12
12
  export declare function createAttachTool(uploadFn?: UploadFunction): AgentTool<typeof attachSchema>;
13
13
  export {};
14
- //# sourceMappingURL=attach.d.ts.map
@@ -32,4 +32,3 @@ export function createAttachTool(uploadFn) {
32
32
  },
33
33
  };
34
34
  }
35
- //# sourceMappingURL=attach.js.map
@@ -10,4 +10,3 @@ export interface BashToolOptions {
10
10
  }
11
11
  export declare function createBashTool(executor: Executor, options?: BashToolOptions): AgentTool<typeof bashSchema>;
12
12
  export {};
13
- //# sourceMappingURL=bash.d.ts.map
@@ -76,4 +76,3 @@ export function createBashTool(executor, options = {}) {
76
76
  },
77
77
  };
78
78
  }
79
- //# sourceMappingURL=bash.js.map
@@ -8,4 +8,3 @@ declare const editSchema: import("@sinclair/typebox").TObject<{
8
8
  }>;
9
9
  export declare function createEditTool(executor: Executor): AgentTool<typeof editSchema>;
10
10
  export {};
11
- //# sourceMappingURL=edit.d.ts.map
@@ -1,6 +1,6 @@
1
1
  import { Type } from "@sinclair/typebox";
2
2
  import * as Diff from "diff";
3
- import { shellEscape } from "../shell-escape.js";
3
+ import { shellEscape } from "../shared/shell-escape.js";
4
4
  import { writeContent } from "./write-content.js";
5
5
  /**
6
6
  * Generate a unified diff string with line numbers and context
@@ -122,4 +122,3 @@ export function createEditTool(executor) {
122
122
  },
123
123
  };
124
124
  }
125
- //# sourceMappingURL=edit.js.map
@@ -18,4 +18,3 @@ export interface CreatePipiclawToolsOptions {
18
18
  }
19
19
  export declare function createPipiclawBaseTools(executor: Executor): AgentTool<any>[];
20
20
  export declare function createPipiclawTools(options: CreatePipiclawToolsOptions): AgentTool<any>[];
21
- //# sourceMappingURL=index.d.ts.map
@@ -27,4 +27,3 @@ export function createPipiclawTools(options) {
27
27
  }),
28
28
  ];
29
29
  }
30
- //# sourceMappingURL=index.js.map
@@ -8,4 +8,3 @@ declare const readSchema: import("@sinclair/typebox").TObject<{
8
8
  }>;
9
9
  export declare function createReadTool(executor: Executor): AgentTool<typeof readSchema>;
10
10
  export {};
11
- //# sourceMappingURL=read.d.ts.map
@@ -1,6 +1,6 @@
1
1
  import { Type } from "@sinclair/typebox";
2
2
  import { extname } from "path";
3
- import { shellEscape } from "../shell-escape.js";
3
+ import { shellEscape } from "../shared/shell-escape.js";
4
4
  import { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, formatSize, truncateHead } from "./truncate.js";
5
5
  /**
6
6
  * Map of file extensions to MIME types for common image formats
@@ -129,4 +129,3 @@ export function createReadTool(executor) {
129
129
  },
130
130
  };
131
131
  }
132
- //# sourceMappingURL=read.js.map
@@ -54,4 +54,3 @@ export declare function truncateHead(content: string, options?: TruncationOption
54
54
  * May return partial first line if the last line of original content exceeds byte limit.
55
55
  */
56
56
  export declare function truncateTail(content: string, options?: TruncationOptions): TruncationResult;
57
- //# sourceMappingURL=truncate.d.ts.map
@@ -181,4 +181,3 @@ function truncateStringToBytesFromEnd(str, maxBytes) {
181
181
  }
182
182
  return buf.slice(start).toString("utf-8");
183
183
  }
184
- //# sourceMappingURL=truncate.js.map
@@ -2,4 +2,3 @@ import type { Executor } from "../sandbox.js";
2
2
  export declare function writeContent(executor: Executor, path: string, content: string, signal: AbortSignal | undefined, options?: {
3
3
  createParentDir?: boolean;
4
4
  }): Promise<void>;
5
- //# sourceMappingURL=write-content.d.ts.map
@@ -1,4 +1,4 @@
1
- import { shellEscape } from "../shell-escape.js";
1
+ import { shellEscape } from "../shared/shell-escape.js";
2
2
  const INLINE_WRITE_MAX_BYTES = 64 * 1024;
3
3
  function getDir(path) {
4
4
  return path.includes("/") ? path.substring(0, path.lastIndexOf("/")) : ".";
@@ -27,4 +27,3 @@ export async function writeContent(executor, path, content, signal, options) {
27
27
  });
28
28
  ensureSuccess(result, path);
29
29
  }
30
- //# sourceMappingURL=write-content.js.map
@@ -7,4 +7,3 @@ declare const writeSchema: import("@sinclair/typebox").TObject<{
7
7
  }>;
8
8
  export declare function createWriteTool(executor: Executor): AgentTool<typeof writeSchema>;
9
9
  export {};
10
- //# sourceMappingURL=write.d.ts.map
@@ -20,4 +20,3 @@ export function createWriteTool(executor) {
20
20
  },
21
21
  };
22
22
  }
23
- //# sourceMappingURL=write.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oyasmi/pipiclaw",
3
- "version": "0.5.2",
3
+ "version": "0.5.3",
4
4
  "description": "An AI assistant runtime for coding and team workflows, with DingTalk AI Cards, sub-agents, memory, and scheduled events.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -17,8 +17,6 @@
17
17
  },
18
18
  "files": [
19
19
  "dist",
20
- "docs",
21
- "CHANGELOG.md",
22
20
  "README.md",
23
21
  "LICENSE"
24
22
  ],
@@ -62,6 +60,14 @@
62
60
  "pi",
63
61
  "harness-engineering"
64
62
  ],
63
+ "repository": {
64
+ "type": "git",
65
+ "url": "git+https://github.com/oyasmi/pipiclaw.git"
66
+ },
67
+ "homepage": "https://github.com/oyasmi/pipiclaw#readme",
68
+ "bugs": {
69
+ "url": "https://github.com/oyasmi/pipiclaw/issues"
70
+ },
65
71
  "license": "Apache-2.0",
66
72
  "publishConfig": {
67
73
  "access": "public"
package/CHANGELOG.md DELETED
@@ -1,47 +0,0 @@
1
- # Changelog
2
-
3
- ## [Unreleased]
4
-
5
- ### Added
6
-
7
- - Initial implementation of pipiclaw package
8
- - Standalone npm project scaffolding for the independent Pipiclaw repository
9
- - Memory management guidelines in system prompt
10
- - MEMORY.md size warning (> 5000 chars prompts Agent to consolidate)
11
- - log.jsonl rotation (> 1MB archived to .1)
12
- - Periodic memory consolidation event template in README
13
- - DingTalk channel now intercepts `/help`, `/new`, `/compact`, `/session`, and `/model` as built-in slash commands instead of sending them to the LLM
14
- - DingTalk channel now supports busy-time steering controls: plain messages default to steer, and `/steer`, `/followup`, and `/stop` are handled directly while a task is running
15
- - Channel-level `HISTORY.md` for runtime-managed summarized history
16
- - Runtime memory consolidation pipeline for channel `MEMORY.md` and `HISTORY.md`
17
-
18
- ### Changed
19
-
20
- - `syncLogToSessionManager` uses byte-offset incremental reads instead of full file scan
21
- - `syncLogToSessionManager` uses timestamp-based dedup instead of text matching (fixes duplicate-text-drop bug)
22
- - Shared `shellEscape` utility replaces 4 duplicated definitions
23
- - `attachTool` uses factory function instead of module-level global state
24
- - Debug file (`last_prompt.json`) gated behind `PIPICLAW_DEBUG` env var
25
- - Markdown detection regex is more conservative (no longer triggers on plain multi-line text)
26
- - DingTalk reconnection logic auto-retries with exponential backoff on failure
27
- - Message dedup uses `Set` with FIFO eviction instead of `O(n)` array scan
28
- - Replaced inline `await import("axios")` with top-level import
29
- - Refactored DingTalk delivery into an explicit progress/final lifecycle so AI Cards only show process output and final answers are sent as standalone Markdown messages
30
- - Final answer emission now keys off agent turn completion instead of every assistant `message_end`, avoiding intermediate assistant text being sent as the final reply
31
- - Conversation metadata is persisted per channel so scheduled events and proactive sends continue to work after process restarts
32
- - Package, CLI, and data directory renamed to `pipiclaw`, `@oyasmi/pipiclaw`, and `~/.pi/pipiclaw/`
33
- - Pipiclaw now bootstraps `channel.json`, `auth.json`, `models.json`, `settings.json`, and the workspace skeleton automatically on first start
34
- - Auto-generated `models.json` now starts as an empty valid config, and `SOUL.md` / `AGENTS.md` are guidance templates instead of prefilled behavior
35
- - Global pipiclaw settings now live in `~/.pi/pipiclaw/settings.json`, and saved default models are restored on restart
36
- - DingTalk channel configuration is now read from `~/.pi/pipiclaw/channel.json`
37
- - Workspace `SOUL.md` and `AGENTS.md` now load only at session start instead of every turn
38
- - Workspace and channel memory files are no longer injected into the system prompt by default
39
- - `log.jsonl` and `context.jsonl` are now treated as cold raw storage and are no longer proactively scanned for memory/context loading
40
- - Channel memory consolidation now hooks into AgentSession compaction and session-switch lifecycle without replacing AgentSession auto-compaction
41
- - Session commands and prompt loading now run through pi extension/resource hooks instead of parallel pipiclaw-specific prompt plumbing
42
- - Pipiclaw now reloads AgentSession resources before the first turn so `SOUL.md`, `AGENTS.md`, and skill summaries apply immediately
43
- - Workspace `SOUL.md` now appends to the default pi system prompt instead of replacing the pi base prompt
44
- - Channel directories now create `MEMORY.md` and `HISTORY.md` immediately when the channel state is initialized
45
- - Workspace and channel memory templates are now structured around stable shared context instead of placeholder comments only
46
- - Sub-agent frontmatter parsing now accepts native YAML arrays and numeric values instead of assuming every field is a string
47
- - Pipiclaw no longer relies on the pi-mono monorepo build configuration and now ships with its own standalone TypeScript, test, lint, and CI setup
@@ -1 +0,0 @@
1
- {"version":3,"file":"channel-runner.d.ts","sourceRoot":"","sources":["../../src/agent/channel-runner.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,KAAK,cAAc,EAAqB,MAAM,gBAAgB,CAAC;AAYxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAkB,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AASnE,OAAO,EACN,KAAK,WAAW,EAKhB,MAAM,YAAY,CAAC;AA6BpB,qBAAa,aAAc,YAAW,WAAW;IAEhD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA0B;IAC1D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgB;IAC7C,OAAO,CAAC,iBAAiB,CAA0B;IAGnD,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,aAAa,CAAU;IAC/B,OAAO,CAAC,+BAA+B,CAAQ;IAG/C,OAAO,CAAC,QAAQ,CAAmC;gBAEvC,aAAa,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IAoIzE,GAAG,CAAC,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAsItG,oBAAoB,CAAC,GAAG,EAAE,eAAe,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IA+BlF,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1D,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAMd,gBAAgB;IAQ9B,OAAO,CAAC,oBAAoB;IAQ5B,OAAO,CAAC,sBAAsB;IAI9B,OAAO,CAAC,iBAAiB;YAUX,gBAAgB;IAe9B,OAAO,CAAC,aAAa;YAWP,uBAAuB;YAQvB,iBAAiB;YAQjB,kBAAkB;IAIhC,OAAO,CAAC,wBAAwB;IAWhC,OAAO,CAAC,wBAAwB;YAkBlB,6BAA6B;CAmB3C"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"channel-runner.js","sourceRoot":"","sources":["../../src/agent/channel-runner.ts"],"names":[],"mappings":"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","sourcesContent":["import { Agent } from \"@mariozechner/pi-agent-core\";\nimport type { Api, Model } from \"@mariozechner/pi-ai\";\nimport {\n\tAgentSession,\n\tAuthStorage,\n\tconvertToLlm,\n\tDefaultResourceLoader,\n\tModelRegistry,\n\ttype SettingsManager as SDKSettingsManager,\n\tSessionManager,\n\ttype Skill,\n} from \"@mariozechner/pi-coding-agent\";\nimport { mkdir, readFile, writeFile } from \"fs/promises\";\nimport { dirname, join, resolve } from \"path\";\nimport { createCommandExtension } from \"../command-extension.js\";\nimport { type BuiltInCommand, renderBuiltInHelp } from \"../commands.js\";\nimport { getAgentConfig, getApiKeyForModel, getSoul, loadPipiclawSkills } from \"../config-loader.js\";\nimport { PipiclawSettingsManager } from \"../context.js\";\nimport * as log from \"../log.js\";\nimport { buildFirstTurnMemoryBootstrap as renderFirstTurnMemoryBootstrap } from \"../memory/bootstrap.js\";\nimport { createMemoryCandidateCache } from \"../memory/candidates.js\";\nimport { getChannelMemoryPath } from \"../memory/files.js\";\nimport { MemoryLifecycle } from \"../memory/lifecycle.js\";\nimport { recallRelevantMemory } from \"../memory/recall.js\";\nimport { resolveInitialModel } from \"../model-utils.js\";\nimport { APP_HOME_DIR, AUTH_CONFIG_PATH, MODELS_CONFIG_PATH } from \"../paths.js\";\nimport { buildAppendSystemPrompt } from \"../prompt-builder.js\";\nimport type { DingTalkContext } from \"../runtime/dingtalk.js\";\nimport type { ChannelStore } from \"../runtime/store.js\";\nimport { createExecutor, type SandboxConfig } from \"../sandbox.js\";\nimport { HAN_REGEX } from \"../shared/text-utils.js\";\nimport { isRecord } from \"../shared/type-guards.js\";\nimport { discoverSubAgents, formatSubAgentList, type SubAgentDiscoveryResult } from \"../subagents/discovery.js\";\nimport { createPipiclawTools } from \"../tools/index.js\";\nimport { clipUserInput } from \"./progress-formatter.js\";\nimport { createRunQueue } from \"./run-queue.js\";\nimport { handleSessionEvent } from \"./session-events.js\";\nimport { getLastAssistantUsage } from \"./type-guards.js\";\nimport {\n\ttype AgentRunner,\n\tcreateEmptyRunState,\n\ttype FinalOutcome,\n\tMAX_USER_MESSAGE_CHARS,\n\ttype RunState,\n} from \"./types.js\";\n\ntype ModelRegistryClass = {\n\tcreate?: (authStorage: AuthStorage, modelsJsonPath?: string) => ModelRegistry;\n\tnew (authStorage: AuthStorage, modelsJsonPath?: string): ModelRegistry;\n};\n\nfunction isSilentOutcome(outcome: FinalOutcome): outcome is { kind: \"silent\" } {\n\treturn outcome.kind === \"silent\";\n}\n\nfunction isFinalOutcome(outcome: FinalOutcome): outcome is { kind: \"final\"; text: string } {\n\treturn outcome.kind === \"final\";\n}\n\nfunction getFinalOutcomeText(outcome: FinalOutcome): string | null {\n\treturn isFinalOutcome(outcome) ? outcome.text : null;\n}\n\nfunction createModelRegistry(authStorage: AuthStorage, modelsJsonPath: string): ModelRegistry {\n\tconst registryClass = ModelRegistry as unknown as ModelRegistryClass;\n\treturn typeof registryClass.create === \"function\"\n\t\t? registryClass.create(authStorage, modelsJsonPath)\n\t\t: new registryClass(authStorage, modelsJsonPath);\n}\n\nfunction asSdkSettingsManager(manager: PipiclawSettingsManager): SDKSettingsManager {\n\treturn manager as unknown as SDKSettingsManager;\n}\nexport class ChannelRunner implements AgentRunner {\n\t// --- Constructed once ---\n\tprivate readonly sandboxConfig: SandboxConfig;\n\tprivate readonly channelId: string;\n\tprivate readonly channelDir: string;\n\tprivate readonly workspacePath: string;\n\tprivate readonly workspaceDir: string;\n\tprivate readonly session: AgentSession;\n\tprivate readonly agent: Agent;\n\tprivate readonly sessionManager: SessionManager;\n\tprivate readonly settingsManager: PipiclawSettingsManager;\n\tprivate readonly modelRegistry: ModelRegistry;\n\tprivate readonly memoryLifecycle: MemoryLifecycle;\n\tprivate readonly sessionReady: Promise<void>;\n\tprivate subAgentDiscovery: SubAgentDiscoveryResult;\n\n\t// --- Mutable across runs ---\n\tprivate activeModel: Model<Api>;\n\tprivate currentSkills: Skill[];\n\tprivate firstTurnMemoryBootstrapPending = true;\n\n\t// --- Per run ---\n\tprivate runState: RunState = createEmptyRunState();\n\n\tconstructor(sandboxConfig: SandboxConfig, channelId: string, channelDir: string) {\n\t\tthis.sandboxConfig = sandboxConfig;\n\t\tthis.channelId = channelId;\n\t\tthis.channelDir = channelDir;\n\n\t\tconst executor = createExecutor(sandboxConfig);\n\t\tthis.workspaceDir = resolve(dirname(channelDir));\n\t\tthis.workspacePath = executor.getWorkspacePath(this.workspaceDir);\n\n\t\t// Initial skill summaries\n\t\tconst initialSkills = loadPipiclawSkills(channelDir, this.workspacePath);\n\t\tthis.currentSkills = initialSkills;\n\n\t\t// Create session manager\n\t\tconst contextFile = join(channelDir, \"context.jsonl\");\n\t\tthis.sessionManager = SessionManager.open(contextFile, channelDir);\n\t\tthis.settingsManager = new PipiclawSettingsManager(APP_HOME_DIR);\n\n\t\t// Create AuthStorage and ModelRegistry\n\t\tconst authStorage = AuthStorage.create(AUTH_CONFIG_PATH);\n\t\tthis.modelRegistry = createModelRegistry(authStorage, MODELS_CONFIG_PATH);\n\n\t\t// Resolve model: prefer saved global default, fall back to first available model\n\t\tthis.activeModel = resolveInitialModel(this.modelRegistry, this.settingsManager);\n\t\tlog.logInfo(`Using model: ${this.activeModel.provider}/${this.activeModel.id} (${this.activeModel.name})`);\n\t\tthis.subAgentDiscovery = this.refreshSubAgentDiscovery();\n\n\t\t// Create tools\n\t\tconst tools = createPipiclawTools({\n\t\t\texecutor,\n\t\t\tgetCurrentModel: () => this.activeModel,\n\t\t\tgetAvailableModels: () => this.modelRegistry.getAvailable(),\n\t\t\tresolveApiKey: async (model) => getApiKeyForModel(this.modelRegistry, model),\n\t\t\tworkspaceDir: this.workspaceDir,\n\t\t\tchannelDir: this.channelDir,\n\t\t\tworkspacePath: this.workspacePath,\n\t\t\tchannelId: this.channelId,\n\t\t\tsandboxConfig: this.sandboxConfig,\n\t\t\tgetSubAgentDiscovery: () => this.subAgentDiscovery,\n\t\t\tgetMemoryRecallSettings: () => this.settingsManager.getMemoryRecallSettings(),\n\t\t});\n\n\t\t// Create agent\n\t\tthis.agent = new Agent({\n\t\t\tinitialState: {\n\t\t\t\tsystemPrompt: \"\",\n\t\t\t\tmodel: this.activeModel,\n\t\t\t\tthinkingLevel: \"off\",\n\t\t\t\ttools,\n\t\t\t},\n\t\t\tconvertToLlm,\n\t\t\tgetApiKey: async () => getApiKeyForModel(this.modelRegistry, this.activeModel),\n\t\t});\n\n\t\tthis.memoryLifecycle = new MemoryLifecycle({\n\t\t\tchannelId: this.channelId,\n\t\t\tchannelDir: this.channelDir,\n\t\t\tgetMessages: () => this.session.messages,\n\t\t\tgetSessionEntries: () => this.sessionManager.getBranch(),\n\t\t\tgetModel: () => this.session.model ?? this.activeModel,\n\t\t\tresolveApiKey: async (model) => getApiKeyForModel(this.modelRegistry, model),\n\t\t\tgetSessionMemorySettings: () => this.settingsManager.getSessionMemorySettings(),\n\t\t});\n\n\t\tconst resourceLoader = new DefaultResourceLoader({\n\t\t\tcwd: process.cwd(),\n\t\t\tagentDir: APP_HOME_DIR,\n\t\t\tsettingsManager: asSdkSettingsManager(this.settingsManager),\n\t\t\textensionFactories: [\n\t\t\t\tthis.memoryLifecycle.createExtensionFactory(),\n\t\t\t\tcreateCommandExtension({\n\t\t\t\t\tgetCurrentModel: () => this.session.model ?? this.activeModel,\n\t\t\t\t\tgetAvailableModels: async () => {\n\t\t\t\t\t\tthis.modelRegistry.refresh();\n\t\t\t\t\t\treturn await this.modelRegistry.getAvailable();\n\t\t\t\t\t},\n\t\t\t\t\tgetSessionStats: () => this.session.getSessionStats(),\n\t\t\t\t\tgetThinkingLevel: () => this.session.thinkingLevel,\n\t\t\t\t\tswitchModel: async (model) => {\n\t\t\t\t\t\tawait this.session.setModel(model);\n\t\t\t\t\t\tthis.activeModel = model;\n\t\t\t\t\t},\n\t\t\t\t\trefreshSessionResources: async () => {\n\t\t\t\t\t\tawait this.refreshSessionResources();\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t],\n\t\t\tappendSystemPromptOverride: (base) => {\n\t\t\t\tconst soul = getSoul(this.workspaceDir);\n\t\t\t\tconst sections = [...base];\n\t\t\t\tif (soul) {\n\t\t\t\t\tsections.unshift(soul);\n\t\t\t\t}\n\t\t\t\tsections.push(\n\t\t\t\t\tbuildAppendSystemPrompt(this.workspacePath, this.channelId, this.sandboxConfig, {\n\t\t\t\t\t\tsubAgentList: formatSubAgentList(this.subAgentDiscovery.agents),\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\treturn sections;\n\t\t\t},\n\t\t\tagentsFilesOverride: () => {\n\t\t\t\tconst agentConfig = getAgentConfig(this.channelDir);\n\t\t\t\treturn {\n\t\t\t\t\tagentsFiles: agentConfig ? [{ path: `${this.workspacePath}/AGENTS.md`, content: agentConfig }] : [],\n\t\t\t\t};\n\t\t\t},\n\t\t\tskillsOverride: (base) => ({\n\t\t\t\tskills: [...base.skills, ...this.currentSkills],\n\t\t\t\tdiagnostics: base.diagnostics,\n\t\t\t}),\n\t\t});\n\n\t\tconst baseToolsOverride = Object.fromEntries(tools.map((tool) => [tool.name, tool]));\n\n\t\t// Create AgentSession\n\t\tthis.session = new AgentSession({\n\t\t\tagent: this.agent,\n\t\t\tsessionManager: this.sessionManager,\n\t\t\tsettingsManager: asSdkSettingsManager(this.settingsManager),\n\t\t\tcwd: process.cwd(),\n\t\t\tmodelRegistry: this.modelRegistry,\n\t\t\tresourceLoader,\n\t\t\tbaseToolsOverride,\n\t\t});\n\n\t\t// Subscribe to session events\n\t\tthis.subscribeToSessionEvents();\n\t\tthis.sessionReady = this.initializeSession();\n\t}\n\n\t// === Public API ===\n\n\tasync run(ctx: DingTalkContext, store: ChannelStore): Promise<{ stopReason: string; errorMessage?: string }> {\n\t\tthis.resetRunState(ctx, store);\n\n\t\tconst runQueue = createRunQueue(ctx);\n\t\tthis.runState.queue = runQueue.queue;\n\n\t\ttry {\n\t\t\tawait this.ensureSessionReady();\n\n\t\t\t// Ensure channel directory exists\n\t\t\tawait mkdir(this.channelDir, { recursive: true });\n\n\t\t\tconst candidateCache = createMemoryCandidateCache();\n\t\t\tconst clippedInput = clipUserInput(ctx.message.text, MAX_USER_MESSAGE_CHARS);\n\t\t\tconst userMessage = this.formatUserMessage(clippedInput, ctx.message.userName);\n\t\t\tlet promptText = this.shouldPreserveRawInput(ctx.message.text) ? clippedInput : userMessage;\n\t\t\tlet recalledContextText = \"\";\n\t\t\tlet durableMemoryBootstrapText = \"\";\n\n\t\t\tthis.memoryLifecycle.noteUserTurnStarted();\n\n\t\t\tif (!this.shouldPreserveRawInput(ctx.message.text)) {\n\t\t\t\tconst recallSettings = this.settingsManager.getMemoryRecallSettings();\n\t\t\t\tif (recallSettings.enabled) {\n\t\t\t\t\tconst recall = await recallRelevantMemory({\n\t\t\t\t\t\tquery: clippedInput,\n\t\t\t\t\t\tworkspaceDir: this.workspaceDir,\n\t\t\t\t\t\tchannelDir: this.channelDir,\n\t\t\t\t\t\tmaxCandidates: recallSettings.maxCandidates,\n\t\t\t\t\t\tmaxInjected: recallSettings.maxInjected,\n\t\t\t\t\t\tmaxChars: recallSettings.maxChars,\n\t\t\t\t\t\trerankWithModel: recallSettings.rerankWithModel,\n\t\t\t\t\t\tautoRerank: HAN_REGEX.test(clippedInput),\n\t\t\t\t\t\tmodel: this.session.model ?? this.activeModel,\n\t\t\t\t\t\tresolveApiKey: async (model) => getApiKeyForModel(this.modelRegistry, model),\n\t\t\t\t\t\tcandidateCache,\n\t\t\t\t\t});\n\n\t\t\t\t\tif (recall.renderedText) {\n\t\t\t\t\t\trecalledContextText = recall.renderedText;\n\t\t\t\t\t\tpromptText = `${recall.renderedText}\\n\\n<user_message>\\n${promptText}\\n</user_message>`;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this.firstTurnMemoryBootstrapPending) {\n\t\t\t\t\tdurableMemoryBootstrapText = await this.buildFirstTurnMemoryBootstrap();\n\t\t\t\t\tif (durableMemoryBootstrapText) {\n\t\t\t\t\t\tpromptText = `${durableMemoryBootstrapText}\\n\\n${promptText}`;\n\t\t\t\t\t}\n\t\t\t\t\tthis.firstTurnMemoryBootstrapPending = false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Debug: write context to last_prompt.json (only with PIPICLAW_DEBUG=1)\n\t\t\tif (process.env.PIPICLAW_DEBUG) {\n\t\t\t\tconst debugContext = {\n\t\t\t\t\tsystemPrompt: this.agent.state.systemPrompt,\n\t\t\t\t\tmessages: this.session.messages,\n\t\t\t\t\tdurableMemoryBootstrap: durableMemoryBootstrapText || undefined,\n\t\t\t\t\trecalledContext: recalledContextText || undefined,\n\t\t\t\t\tnewUserMessage: promptText,\n\t\t\t\t};\n\t\t\t\tawait writeFile(join(this.channelDir, \"last_prompt.json\"), JSON.stringify(debugContext, null, 2));\n\t\t\t}\n\n\t\t\tawait this.session.prompt(promptText);\n\t\t} catch (err) {\n\t\t\tthis.runState.stopReason = \"error\";\n\t\t\tthis.runState.errorMessage = err instanceof Error ? err.message : String(err);\n\t\t\tlog.logWarning(`[${this.channelId}] Runner failed`, this.runState.errorMessage);\n\t\t} finally {\n\t\t\tawait runQueue.drain();\n\t\t\tconst finalOutcome = this.runState.finalOutcome;\n\t\t\tconst finalOutcomeText = getFinalOutcomeText(finalOutcome);\n\n\t\t\ttry {\n\t\t\t\tif (\n\t\t\t\t\tthis.runState.stopReason === \"error\" &&\n\t\t\t\t\tthis.runState.errorMessage &&\n\t\t\t\t\t!this.runState.finalResponseDelivered\n\t\t\t\t) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait ctx.replaceMessage(\"_Sorry, something went wrong_\");\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tconst errMsg = err instanceof Error ? err.message : String(err);\n\t\t\t\t\t\tlog.logWarning(\"Failed to post error message\", errMsg);\n\t\t\t\t\t}\n\t\t\t\t} else if (isSilentOutcome(finalOutcome)) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait ctx.deleteMessage();\n\t\t\t\t\t\tlog.logInfo(\"Silent response - deleted message\");\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tconst errMsg = err instanceof Error ? err.message : String(err);\n\t\t\t\t\t\tlog.logWarning(\"Failed to delete message for silent response\", errMsg);\n\t\t\t\t\t}\n\t\t\t\t} else if (finalOutcomeText && !this.runState.finalResponseDelivered) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait ctx.replaceMessage(finalOutcomeText);\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tconst errMsg = err instanceof Error ? err.message : String(err);\n\t\t\t\t\t\tlog.logWarning(\"Failed to replace message with final text\", errMsg);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tawait ctx.flush();\n\t\t\t} finally {\n\t\t\t\tawait ctx.close();\n\t\t\t}\n\n\t\t\t// Log usage summary\n\t\t\tif (this.runState.totalUsage.cost.total > 0) {\n\t\t\t\tconst lastAssistantMessage = getLastAssistantUsage(this.session.messages);\n\n\t\t\t\tconst contextTokens = lastAssistantMessage\n\t\t\t\t\t? lastAssistantMessage.usage.input +\n\t\t\t\t\t\tlastAssistantMessage.usage.output +\n\t\t\t\t\t\tlastAssistantMessage.usage.cacheRead +\n\t\t\t\t\t\tlastAssistantMessage.usage.cacheWrite\n\t\t\t\t\t: 0;\n\t\t\t\tconst currentRunModel = this.session.model ?? this.activeModel;\n\t\t\t\tconst contextWindow = currentRunModel.contextWindow || 200000;\n\n\t\t\t\tlog.logUsageSummary(this.runState.logCtx!, this.runState.totalUsage, contextTokens, contextWindow);\n\t\t\t}\n\n\t\t\t// Clear run state\n\t\t\tthis.runState.ctx = null;\n\t\t\tthis.runState.logCtx = null;\n\t\t\tthis.runState.queue = null;\n\t\t}\n\n\t\treturn { stopReason: this.runState.stopReason, errorMessage: this.runState.errorMessage };\n\t}\n\n\tasync handleBuiltinCommand(ctx: DingTalkContext, command: BuiltInCommand): Promise<void> {\n\t\ttry {\n\t\t\tswitch (command.name) {\n\t\t\t\tcase \"help\":\n\t\t\t\t\tawait this.sendCommandReply(ctx, renderBuiltInHelp());\n\t\t\t\t\treturn;\n\t\t\t\tcase \"stop\":\n\t\t\t\t\tawait this.sendCommandReply(ctx, \"No task is running. Use `/stop` only while a task is running.\");\n\t\t\t\t\treturn;\n\t\t\t\tcase \"steer\":\n\t\t\t\t\tthis.requireQueuedMessage(command.args, \"steer\");\n\t\t\t\t\tawait this.sendCommandReply(\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\"No task is running. Send the message directly instead of using `/steer`.\",\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\tcase \"followup\":\n\t\t\t\t\tthis.requireQueuedMessage(command.args, \"followup\");\n\t\t\t\t\tawait this.sendCommandReply(\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\"No task is running. Send the message directly now, or use `/followup` while a task is running.\",\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconst errMsg = err instanceof Error ? err.message : String(err);\n\t\t\tlog.logWarning(`[${this.channelId}] Built-in command failed`, errMsg);\n\t\t\tawait this.sendCommandReply(ctx, `命令执行失败:${errMsg}`);\n\t\t}\n\t}\n\n\tasync queueSteer(text: string, userName?: string): Promise<void> {\n\t\tawait this.queueBusyMessage(\"steer\", this.requireQueuedMessage(text, \"steer\"), userName);\n\t}\n\n\tasync queueFollowUp(text: string, userName?: string): Promise<void> {\n\t\tawait this.queueBusyMessage(\"followUp\", this.requireQueuedMessage(text, \"followup\"), userName);\n\t}\n\n\tasync abort(): Promise<void> {\n\t\tawait this.session.abort();\n\t}\n\n\t// === Private helpers ===\n\n\tprivate async sendCommandReply(ctx: DingTalkContext, text: string): Promise<void> {\n\t\tconst delivered = await ctx.respondPlain(text);\n\t\tif (!delivered) {\n\t\t\tawait ctx.replaceMessage(text);\n\t\t\tawait ctx.flush();\n\t\t}\n\t}\n\n\tprivate requireQueuedMessage(text: string, commandName: \"steer\" | \"followup\"): string {\n\t\tconst trimmedText = text.trim();\n\t\tif (!trimmedText) {\n\t\t\tthrow new Error(`/${commandName} requires a message.`);\n\t\t}\n\t\treturn trimmedText;\n\t}\n\n\tprivate shouldPreserveRawInput(text: string): boolean {\n\t\treturn text.trim().startsWith(\"/\");\n\t}\n\n\tprivate formatUserMessage(text: string, userName?: string, now: Date = new Date()): string {\n\t\tconst pad = (n: number) => n.toString().padStart(2, \"0\");\n\t\tconst offset = -now.getTimezoneOffset();\n\t\tconst offsetSign = offset >= 0 ? \"+\" : \"-\";\n\t\tconst offsetHours = pad(Math.floor(Math.abs(offset) / 60));\n\t\tconst offsetMins = pad(Math.abs(offset) % 60);\n\t\tconst timestamp = `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())} ${pad(now.getHours())}:${pad(now.getMinutes())}:${pad(now.getSeconds())}${offsetSign}${offsetHours}:${offsetMins}`;\n\t\treturn `[${timestamp}] [${userName || \"unknown\"}]: ${text}`;\n\t}\n\n\tprivate async queueBusyMessage(delivery: \"steer\" | \"followUp\", text: string, userName?: string): Promise<void> {\n\t\tif (!this.session.isStreaming) {\n\t\t\tthrow new Error(\"No task is currently running.\");\n\t\t}\n\n\t\tconst clippedText = clipUserInput(text, MAX_USER_MESSAGE_CHARS);\n\t\tif (clippedText !== text.trim()) {\n\t\t\tlog.logWarning(`[${this.channelId}] Queued message exceeded ${MAX_USER_MESSAGE_CHARS} chars and was clipped`);\n\t\t}\n\n\t\tawait this.session.prompt(this.formatUserMessage(clippedText, userName), {\n\t\t\tstreamingBehavior: delivery,\n\t\t});\n\t}\n\n\tprivate resetRunState(ctx: DingTalkContext, store: ChannelStore): void {\n\t\tthis.runState = createEmptyRunState();\n\t\tthis.runState.ctx = ctx;\n\t\tthis.runState.logCtx = {\n\t\t\tchannelId: ctx.message.channel,\n\t\t\tuserName: ctx.message.userName,\n\t\t\tchannelName: ctx.channelName,\n\t\t};\n\t\tthis.runState.store = store;\n\t}\n\n\tprivate async refreshSessionResources(): Promise<void> {\n\t\tawait this.ensureSessionReady();\n\t\tconst skills = loadPipiclawSkills(this.channelDir, this.workspacePath);\n\t\tthis.currentSkills = skills;\n\t\tthis.subAgentDiscovery = this.refreshSubAgentDiscovery();\n\t\tawait this.session.reload();\n\t}\n\n\tprivate async initializeSession(): Promise<void> {\n\t\tconst skills = loadPipiclawSkills(this.channelDir, this.workspacePath);\n\t\tthis.currentSkills = skills;\n\t\tthis.subAgentDiscovery = this.refreshSubAgentDiscovery();\n\t\tthis.firstTurnMemoryBootstrapPending = true;\n\t\tawait this.session.reload();\n\t}\n\n\tprivate async ensureSessionReady(): Promise<void> {\n\t\tawait this.sessionReady;\n\t}\n\n\tprivate refreshSubAgentDiscovery(): SubAgentDiscoveryResult {\n\t\tthis.modelRegistry.refresh();\n\t\tconst discovery = discoverSubAgents(this.workspaceDir, this.modelRegistry.getAvailable());\n\t\tfor (const warning of discovery.warnings) {\n\t\t\tlog.logWarning(`Sub-agent config warning (${this.channelId})`, warning);\n\t\t}\n\t\treturn discovery;\n\t}\n\n\t// === Session event subscription ===\n\n\tprivate subscribeToSessionEvents(): void {\n\t\tthis.session.subscribe(async (event: unknown) => {\n\t\t\tif (isRecord(event) && \"reason\" in event && event.reason === \"new\") {\n\t\t\t\tthis.firstTurnMemoryBootstrapPending = true;\n\t\t\t}\n\t\t\tif (!this.runState.ctx || !this.runState.logCtx || !this.runState.queue) return;\n\t\t\tawait handleSessionEvent(event, {\n\t\t\t\tctx: this.runState.ctx,\n\t\t\t\tlogCtx: this.runState.logCtx,\n\t\t\t\tqueue: this.runState.queue,\n\t\t\t\tpendingTools: this.runState.pendingTools,\n\t\t\t\tstore: this.runState.store,\n\t\t\t\trunState: this.runState,\n\t\t\t\tmemoryLifecycle: this.memoryLifecycle,\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate async buildFirstTurnMemoryBootstrap(): Promise<string> {\n\t\tconst readOptionalFile = async (path: string): Promise<string> => {\n\t\t\ttry {\n\t\t\t\treturn await readFile(path, \"utf-8\");\n\t\t\t} catch {\n\t\t\t\treturn \"\";\n\t\t\t}\n\t\t};\n\n\t\tconst [channelMemory, workspaceMemory] = await Promise.all([\n\t\t\treadOptionalFile(getChannelMemoryPath(this.channelDir)),\n\t\t\treadOptionalFile(join(this.workspaceDir, \"MEMORY.md\")),\n\t\t]);\n\n\t\treturn renderFirstTurnMemoryBootstrap({\n\t\t\tchannelMemory,\n\t\t\tworkspaceMemory,\n\t\t});\n\t}\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC","sourcesContent":["export { ChannelRunner } from \"./channel-runner.js\";\nexport { getOrCreateRunner } from \"./runner-factory.js\";\nexport type { AgentRunner } from \"./types.js\";\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"progress-formatter.d.ts","sourceRoot":"","sources":["../../src/agent/progress-formatter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AASpD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CASpE;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAejF;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAwB7D"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"progress-formatter.js","sourceRoot":"","sources":["../../src/agent/progress-formatter.ts"],"names":[],"mappings":"AAEA,SAAS,oBAAoB,CAAC,IAAY;IACzC,OAAO,IAAI;SACT,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;SACtB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;SAClB,IAAI,EAAE,CAAC;AACV,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,QAAgB;IAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAClD,IAAI,UAAU,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC;QACnC,OAAO,UAAU,CAAC;IACnB,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;IACvC,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,oBAAoB,UAAU,CAAC,MAAM,GAAG,QAAQ,kBAAkB,UAAU,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;AAC1I,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAuB,EAAE,IAAY;IACxE,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAExB,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACvD,QAAQ,IAAI,EAAE,CAAC;QACd,KAAK,MAAM;YACV,OAAO,YAAY,UAAU,EAAE,CAAC;QACjC,KAAK,UAAU;YACd,OAAO,aAAa,UAAU,EAAE,CAAC;QAClC,KAAK,OAAO;YACX,OAAO,UAAU,UAAU,EAAE,CAAC;QAC/B,KAAK,WAAW;YACf,OAAO,UAAU,CAAC;IACpB,CAAC;AACF,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAe;IACpD,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,MAAM,CAAC;IACf,CAAC;IAED,IACC,MAAM;QACN,OAAO,MAAM,KAAK,QAAQ;QAC1B,SAAS,IAAI,MAAM;QACnB,KAAK,CAAC,OAAO,CAAE,MAA+B,CAAC,OAAO,CAAC,EACtD,CAAC;QACF,MAAM,OAAO,GAAI,MAA8D,CAAC,OAAO,CAAC;QACxF,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACvC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3B,CAAC;QACF,CAAC;QACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;IACF,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC","sourcesContent":["import type { ProgressEntryKind } from \"./types.js\";\n\nfunction sanitizeProgressText(text: string): string {\n\treturn text\n\t\t.replace(/\\uFFFC/g, \"\")\n\t\t.replace(/\\r/g, \"\")\n\t\t.trim();\n}\n\nexport function clipUserInput(text: string, maxChars: number): string {\n\tconst normalized = text.replace(/\\r/g, \"\").trim();\n\tif (normalized.length <= maxChars) {\n\t\treturn normalized;\n\t}\n\n\tconst headChars = Math.floor(maxChars * 0.6);\n\tconst tailChars = maxChars - headChars;\n\treturn `${normalized.slice(0, headChars)}\\n\\n[... omitted ${normalized.length - maxChars} chars ...]\\n\\n${normalized.slice(-tailChars)}`;\n}\n\nexport function formatProgressEntry(kind: ProgressEntryKind, text: string): string {\n\tconst cleaned = sanitizeProgressText(text);\n\tif (!cleaned) return \"\";\n\n\tconst normalized = cleaned.replace(/\\n+/g, \" \").trim();\n\tswitch (kind) {\n\t\tcase \"tool\":\n\t\t\treturn `Running: ${normalized}`;\n\t\tcase \"thinking\":\n\t\t\treturn `Thinking: ${normalized}`;\n\t\tcase \"error\":\n\t\t\treturn `Error: ${normalized}`;\n\t\tcase \"assistant\":\n\t\t\treturn normalized;\n\t}\n}\n\nexport function extractToolResultText(result: unknown): string {\n\tif (typeof result === \"string\") {\n\t\treturn result;\n\t}\n\n\tif (\n\t\tresult &&\n\t\ttypeof result === \"object\" &&\n\t\t\"content\" in result &&\n\t\tArray.isArray((result as { content: unknown }).content)\n\t) {\n\t\tconst content = (result as { content: Array<{ type: string; text?: string }> }).content;\n\t\tconst textParts: string[] = [];\n\t\tfor (const part of content) {\n\t\t\tif (part.type === \"text\" && part.text) {\n\t\t\t\ttextParts.push(part.text);\n\t\t\t}\n\t\t}\n\t\tif (textParts.length > 0) {\n\t\t\treturn textParts.join(\"\\n\");\n\t\t}\n\t}\n\n\treturn JSON.stringify(result);\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"run-queue.d.ts","sourceRoot":"","sources":["../../src/agent/run-queue.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,QAAQ,CAAC;IAChB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,eAAe,GAAG,eAAe,CAwBpE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"run-queue.js","sourceRoot":"","sources":["../../src/agent/run-queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,WAAW,CAAC;AASjC,MAAM,UAAU,cAAc,CAAC,GAAoB;IAClD,IAAI,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IACnC,MAAM,KAAK,GAAa;QACvB,OAAO,EAAE,CAAC,EAAuB,EAAE,YAAoB,EAAQ,EAAE;YAChE,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;gBACvC,IAAI,CAAC;oBACJ,MAAM,EAAE,EAAE,CAAC;gBACZ,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACd,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBAChE,GAAG,CAAC,UAAU,CAAC,uBAAuB,YAAY,GAAG,EAAE,MAAM,CAAC,CAAC;gBAChE,CAAC;YACF,CAAC,CAAC,CAAC;QACJ,CAAC;QACD,cAAc,EAAE,UAAU,IAAY,EAAE,MAAyB,EAAE,YAAoB,EAAE,KAAK,GAAG,IAAI;YACpG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;QAC9G,CAAC;KACD,CAAC;IAEF,OAAO;QACN,KAAK;QACL,KAAK,EAAE,KAAK,IAAI,EAAE;YACjB,MAAM,UAAU,CAAC;QAClB,CAAC;KACD,CAAC;AACH,CAAC","sourcesContent":["import * as log from \"../log.js\";\nimport type { DingTalkContext } from \"../runtime/dingtalk.js\";\nimport type { RunQueue } from \"./types.js\";\n\nexport interface CreatedRunQueue {\n\tqueue: RunQueue;\n\tdrain: () => Promise<void>;\n}\n\nexport function createRunQueue(ctx: DingTalkContext): CreatedRunQueue {\n\tlet queueChain = Promise.resolve();\n\tconst queue: RunQueue = {\n\t\tenqueue: (fn: () => Promise<void>, errorContext: string): void => {\n\t\t\tqueueChain = queueChain.then(async () => {\n\t\t\t\ttry {\n\t\t\t\t\tawait fn();\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconst errMsg = err instanceof Error ? err.message : String(err);\n\t\t\t\t\tlog.logWarning(`DingTalk API error (${errorContext})`, errMsg);\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tenqueueMessage: function (text: string, target: \"main\" | \"thread\", errorContext: string, doLog = true): void {\n\t\t\tthis.enqueue(() => (target === \"main\" ? ctx.respond(text, doLog) : ctx.respondInThread(text)), errorContext);\n\t\t},\n\t};\n\n\treturn {\n\t\tqueue,\n\t\tdrain: async () => {\n\t\t\tawait queueChain;\n\t\t},\n\t};\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"runner-factory.d.ts","sourceRoot":"","sources":["../../src/agent/runner-factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9C,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW,CAOlH"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"runner-factory.js","sourceRoot":"","sources":["../../src/agent/runner-factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAuB,CAAC;AAEtD,MAAM,UAAU,iBAAiB,CAAC,aAA4B,EAAE,SAAiB,EAAE,UAAkB;IACpG,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC/C,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,aAAa,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IACvE,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACtC,OAAO,MAAM,CAAC;AACf,CAAC","sourcesContent":["import type { SandboxConfig } from \"../sandbox.js\";\nimport { ChannelRunner } from \"./channel-runner.js\";\nimport type { AgentRunner } from \"./types.js\";\n\nconst channelRunners = new Map<string, AgentRunner>();\n\nexport function getOrCreateRunner(sandboxConfig: SandboxConfig, channelId: string, channelDir: string): AgentRunner {\n\tconst existing = channelRunners.get(channelId);\n\tif (existing) return existing;\n\n\tconst runner = new ChannelRunner(sandboxConfig, channelId, channelDir);\n\tchannelRunners.set(channelId, runner);\n\treturn runner;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-events.d.ts","sourceRoot":"","sources":["../../src/agent/session-events.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAsBxD,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEjF,MAAM,WAAW,0BAA0B;IAC1C,GAAG,EAAE,eAAe,CAAC;IACrB,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,EAAE,QAAQ,CAAC;IAChB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACvC,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,QAAQ,CAAC;IACnB,eAAe,EAAE,eAAe,CAAC;CACjC;AAwCD,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CA4N3G"}