@gencode/agents 0.0.3 → 0.0.5

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 (72) hide show
  1. package/dist/commands/help.js +6 -6
  2. package/dist/commands/help.js.map +1 -1
  3. package/dist/commands/new.d.ts.map +1 -1
  4. package/dist/commands/new.js +12 -1
  5. package/dist/commands/new.js.map +1 -1
  6. package/dist/commands/registry.js +5 -5
  7. package/dist/commands/registry.js.map +1 -1
  8. package/dist/plugins/hooks.d.ts +20 -1
  9. package/dist/plugins/hooks.d.ts.map +1 -1
  10. package/dist/plugins/hooks.js.map +1 -1
  11. package/dist/plugins/index.d.ts +1 -1
  12. package/dist/plugins/index.d.ts.map +1 -1
  13. package/dist/plugins/index.js.map +1 -1
  14. package/dist/plugins/loader.js +1 -1
  15. package/dist/plugins/loader.js.map +1 -1
  16. package/dist/plugins/runtime.d.ts +9 -1
  17. package/dist/plugins/runtime.d.ts.map +1 -1
  18. package/dist/plugins/runtime.js +24 -4
  19. package/dist/plugins/runtime.js.map +1 -1
  20. package/dist/runner/agent-runtime.d.ts +62 -0
  21. package/dist/runner/agent-runtime.d.ts.map +1 -0
  22. package/dist/runner/agent-runtime.js +179 -0
  23. package/dist/runner/agent-runtime.js.map +1 -0
  24. package/dist/runner/announce-loop.d.ts +41 -0
  25. package/dist/runner/announce-loop.d.ts.map +1 -0
  26. package/dist/runner/announce-loop.js +94 -0
  27. package/dist/runner/announce-loop.js.map +1 -0
  28. package/dist/runner/event-dispatcher.d.ts +31 -0
  29. package/dist/runner/event-dispatcher.d.ts.map +1 -0
  30. package/dist/runner/event-dispatcher.js +87 -0
  31. package/dist/runner/event-dispatcher.js.map +1 -0
  32. package/dist/runner/finalizer.d.ts +30 -0
  33. package/dist/runner/finalizer.d.ts.map +1 -0
  34. package/dist/runner/finalizer.js +75 -0
  35. package/dist/runner/finalizer.js.map +1 -0
  36. package/dist/runner/invocation-resolver.d.ts +67 -0
  37. package/dist/runner/invocation-resolver.d.ts.map +1 -0
  38. package/dist/runner/invocation-resolver.js +224 -0
  39. package/dist/runner/invocation-resolver.js.map +1 -0
  40. package/dist/runner/plugin-context.d.ts +18 -0
  41. package/dist/runner/plugin-context.d.ts.map +1 -0
  42. package/dist/runner/plugin-context.js +26 -0
  43. package/dist/runner/plugin-context.js.map +1 -0
  44. package/dist/runner/run-context.d.ts +38 -0
  45. package/dist/runner/run-context.d.ts.map +1 -0
  46. package/dist/runner/run-context.js +159 -0
  47. package/dist/runner/run-context.js.map +1 -0
  48. package/dist/runner/runner-session.d.ts +34 -0
  49. package/dist/runner/runner-session.d.ts.map +1 -0
  50. package/dist/runner/runner-session.js +61 -0
  51. package/dist/runner/runner-session.js.map +1 -0
  52. package/dist/runner/runner.d.ts +1 -2
  53. package/dist/runner/runner.d.ts.map +1 -1
  54. package/dist/runner/runner.js +115 -874
  55. package/dist/runner/runner.js.map +1 -1
  56. package/dist/runner/runtime.d.ts +7 -0
  57. package/dist/runner/runtime.d.ts.map +1 -0
  58. package/dist/runner/runtime.js +21 -0
  59. package/dist/runner/runtime.js.map +1 -0
  60. package/dist/runner/session-lifecycle.d.ts +31 -0
  61. package/dist/runner/session-lifecycle.d.ts.map +1 -0
  62. package/dist/runner/session-lifecycle.js +46 -0
  63. package/dist/runner/session-lifecycle.js.map +1 -0
  64. package/dist/runner/title.d.ts +3 -0
  65. package/dist/runner/title.d.ts.map +1 -0
  66. package/dist/runner/title.js +6 -0
  67. package/dist/runner/title.js.map +1 -0
  68. package/dist/runner/turn-executor.d.ts +51 -0
  69. package/dist/runner/turn-executor.d.ts.map +1 -0
  70. package/dist/runner/turn-executor.js +255 -0
  71. package/dist/runner/turn-executor.js.map +1 -0
  72. package/package.json +1 -1
@@ -0,0 +1,224 @@
1
+ import { handleSlashCommand, parseResetCommand } from "../commands/index.js";
2
+ import { compactTranscriptNow } from "../commands/compact.js";
3
+ import { handleNewCommand } from "../commands/new.js";
4
+ import { handleResetCommand } from "../commands/reset.js";
5
+ import { loadTranscript } from "../session/session.js";
6
+ import { finalizeShortCircuitRun } from "./finalizer.js";
7
+ import { RunEventDispatcher } from "./event-dispatcher.js";
8
+ export function prepareInvocation(params) {
9
+ const inputMode = isTextRunParams(params) ? "text" : "messages";
10
+ const rawMessage = inputMode === "text" ? params.message : undefined;
11
+ const inputMessages = inputMode === "messages" ? params.messages : undefined;
12
+ const structuredUserText = inputMessages ? extractLeadingUserTextMessage(inputMessages) : null;
13
+ const slashCommandSource = rawMessage ?? structuredUserText?.text;
14
+ const resetCommand = slashCommandSource ? parseResetCommand(slashCommandSource) : null;
15
+ const resetRemainder = resetCommand?.remainder ?? "";
16
+ const resetShortCircuit = Boolean(resetCommand && !resetRemainder);
17
+ const messageForRun = resetCommand && resetRemainder ? resetRemainder : slashCommandSource;
18
+ const promptInput = inputMode === "text"
19
+ ? (messageForRun ?? "")
20
+ : (resetCommand && resetRemainder && inputMessages
21
+ ? replaceLeadingUserTextMessage(inputMessages, resetRemainder)
22
+ : inputMessages);
23
+ const transcriptMessage = inputMode === "text"
24
+ ? (resetShortCircuit ? rawMessage : (messageForRun ?? ""))
25
+ : serializeUserInput(promptInput);
26
+ return {
27
+ inputMode,
28
+ rawMessage,
29
+ promptInput,
30
+ transcriptMessage,
31
+ slashCommandSource,
32
+ messageForRun,
33
+ requestedSessionId: resetCommand ? undefined : params.sessionId,
34
+ previousSessionId: resetCommand ? params.sessionId : undefined,
35
+ resetCommand: resetCommand ?? undefined,
36
+ resetShortCircuit,
37
+ };
38
+ }
39
+ export function resolveSlashInvocation(invocation, skills) {
40
+ if (invocation.resetShortCircuit) {
41
+ return {
42
+ kind: "reset_reply",
43
+ action: invocation.resetCommand?.action ?? "new",
44
+ transcriptMessage: invocation.transcriptMessage,
45
+ initialUserEntryPersisted: true,
46
+ };
47
+ }
48
+ if (!invocation.slashCommandSource) {
49
+ return {
50
+ kind: "run",
51
+ effectivePrompt: invocation.promptInput,
52
+ transcriptMessage: invocation.transcriptMessage,
53
+ };
54
+ }
55
+ const slashResult = handleSlashCommand({ message: invocation.messageForRun ?? "", skills });
56
+ if (slashResult.kind === "reply") {
57
+ return {
58
+ kind: "reply",
59
+ replyText: slashResult.text,
60
+ transcriptMessage: invocation.transcriptMessage,
61
+ };
62
+ }
63
+ if (slashResult.kind === "compact") {
64
+ return {
65
+ kind: "compact",
66
+ transcriptMessage: invocation.transcriptMessage,
67
+ instructions: slashResult.instructions,
68
+ initialUserEntryPersisted: invocation.resetCommand ? true : undefined,
69
+ };
70
+ }
71
+ if (slashResult.kind === "rewrite") {
72
+ const effectivePrompt = invocation.inputMode === "text"
73
+ ? slashResult.message
74
+ : replaceLeadingUserTextMessage(invocation.promptInput, slashResult.message);
75
+ return {
76
+ kind: "run",
77
+ effectivePrompt,
78
+ transcriptMessage: serializeUserInput(effectivePrompt),
79
+ };
80
+ }
81
+ return {
82
+ kind: "run",
83
+ effectivePrompt: invocation.inputMode === "text" ? (invocation.messageForRun ?? "") : invocation.promptInput,
84
+ transcriptMessage: invocation.inputMode === "text"
85
+ ? (invocation.messageForRun ?? "")
86
+ : invocation.transcriptMessage,
87
+ };
88
+ }
89
+ export async function handleInvocation(params) {
90
+ const resolvedInvocation = resolveSlashInvocation(params.invocation, params.skills);
91
+ if (resolvedInvocation.kind === "run") {
92
+ return {
93
+ kind: "continue",
94
+ effectivePrompt: resolvedInvocation.effectivePrompt,
95
+ transcriptMessage: resolvedInvocation.transcriptMessage,
96
+ };
97
+ }
98
+ if (resolvedInvocation.kind === "reset_reply") {
99
+ const resetReply = resolvedInvocation.action === "reset" ? handleResetCommand() : handleNewCommand();
100
+ return {
101
+ kind: "completed",
102
+ result: await finalizeShortCircuitRun({
103
+ replyText: resetReply.text,
104
+ sessionId: params.sessionId,
105
+ isNewSession: params.isNewSession,
106
+ transcriptMessage: resolvedInvocation.transcriptMessage,
107
+ initialUserEntryPersisted: resolvedInvocation.initialUserEntryPersisted || params.initialUserEntryPersisted,
108
+ runParams: params.runParams,
109
+ hookRegistry: params.hookRegistry,
110
+ hookContext: params.hookContext,
111
+ startTime: params.startTime,
112
+ eventDispatcher: params.eventDispatcher,
113
+ }),
114
+ };
115
+ }
116
+ if (resolvedInvocation.kind === "reply") {
117
+ return {
118
+ kind: "completed",
119
+ result: await finalizeShortCircuitRun({
120
+ replyText: resolvedInvocation.replyText,
121
+ sessionId: params.sessionId,
122
+ isNewSession: params.isNewSession,
123
+ transcriptMessage: resolvedInvocation.transcriptMessage,
124
+ initialUserEntryPersisted: resolvedInvocation.initialUserEntryPersisted || params.initialUserEntryPersisted,
125
+ runParams: params.runParams,
126
+ hookRegistry: params.hookRegistry,
127
+ hookContext: params.hookContext,
128
+ startTime: params.startTime,
129
+ eventDispatcher: params.eventDispatcher,
130
+ }),
131
+ };
132
+ }
133
+ const rawHistory = params.runParams.channel === "CRON" ? [] : await loadTranscript(params.runParams.dataDir, params.sessionId);
134
+ const compactResult = await compactTranscriptNow({
135
+ entries: rawHistory,
136
+ contextWindowTokens: params.runParams.llm.contextWindow ?? 200_000,
137
+ llm: {
138
+ baseUrl: params.runParams.llm.baseUrl,
139
+ apiKey: params.runParams.llm.apiKey,
140
+ model: params.runParams.llm.model,
141
+ },
142
+ instructions: resolvedInvocation.instructions,
143
+ signal: params.runParams.abortSignal,
144
+ hooks: params.hookRegistry,
145
+ hookCtx: params.hookContext,
146
+ });
147
+ const compactText = compactResult.status === "compacted"
148
+ ? `⚙️ Compacted (kept ${compactResult.keptCount}, dropped ${compactResult.droppedCount}).`
149
+ : `⚙️ Compaction skipped: ${compactResult.reason}`;
150
+ return {
151
+ kind: "completed",
152
+ result: await finalizeShortCircuitRun({
153
+ replyText: compactText,
154
+ sessionId: params.sessionId,
155
+ isNewSession: params.isNewSession,
156
+ transcriptMessage: resolvedInvocation.transcriptMessage,
157
+ initialUserEntryPersisted: resolvedInvocation.initialUserEntryPersisted || params.initialUserEntryPersisted,
158
+ runParams: params.runParams,
159
+ hookRegistry: params.hookRegistry,
160
+ hookContext: params.hookContext,
161
+ startTime: params.startTime,
162
+ compactionEntry: compactResult.status === "compacted" ? compactResult.entry : undefined,
163
+ eventDispatcher: params.eventDispatcher,
164
+ }),
165
+ };
166
+ }
167
+ function isTextRunParams(params) {
168
+ return typeof params.message === "string";
169
+ }
170
+ function extractLeadingUserTextMessage(messages) {
171
+ for (let index = 0; index < messages.length; index += 1) {
172
+ const candidate = messages[index];
173
+ if (candidate.role !== "user") {
174
+ continue;
175
+ }
176
+ if (typeof candidate.content === "string") {
177
+ return { index, text: candidate.content };
178
+ }
179
+ if (!Array.isArray(candidate.content) || candidate.content.length === 0) {
180
+ return null;
181
+ }
182
+ const firstBlock = candidate.content[0];
183
+ if (firstBlock?.type === "text" && typeof firstBlock.text === "string") {
184
+ return { index, text: firstBlock.text };
185
+ }
186
+ return null;
187
+ }
188
+ return null;
189
+ }
190
+ function replaceLeadingUserTextMessage(messages, replacement) {
191
+ const match = extractLeadingUserTextMessage(messages);
192
+ if (!match) {
193
+ return messages;
194
+ }
195
+ return messages.map((message, index) => {
196
+ if (index !== match.index) {
197
+ return message;
198
+ }
199
+ const candidate = message;
200
+ if (typeof candidate.content === "string") {
201
+ return { ...message, content: replacement };
202
+ }
203
+ if (Array.isArray(candidate.content) && candidate.content.length > 0) {
204
+ return {
205
+ ...message,
206
+ content: candidate.content.map((block, blockIndex) => {
207
+ if (blockIndex !== 0) {
208
+ return block;
209
+ }
210
+ const typedBlock = block;
211
+ if (typedBlock?.type === "text" && typeof typedBlock.text === "string") {
212
+ return { ...typedBlock, text: replacement };
213
+ }
214
+ return block;
215
+ }),
216
+ };
217
+ }
218
+ return message;
219
+ });
220
+ }
221
+ function serializeUserInput(input) {
222
+ return typeof input === "string" ? input : JSON.stringify(input);
223
+ }
224
+ //# sourceMappingURL=invocation-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invocation-resolver.js","sourceRoot":"","sources":["../../src/runner/invocation-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { PluginHookRegistry, type PluginHookAgentContext } from "../plugins/hooks.js";
2
+ import type { AgentRunParams } from "../types.js";
3
+ import type { AgentTool } from "@mariozechner/pi-agent-core";
4
+ export type RunnerPluginContext = {
5
+ hookRegistry: PluginHookRegistry;
6
+ pluginSkillDirs: string[];
7
+ pluginTools: AgentTool[];
8
+ memoryPluginId?: string;
9
+ };
10
+ /**
11
+ * Resolves all runner-facing plugin derivatives in one place so the caller
12
+ * does not need to understand the plugin registry layout.
13
+ */
14
+ export declare function createRunnerPluginContext(params: {
15
+ runParams: AgentRunParams;
16
+ hookContext: PluginHookAgentContext;
17
+ }): RunnerPluginContext;
18
+ //# sourceMappingURL=plugin-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-context.d.ts","sourceRoot":"","sources":["../../src/runner/plugin-context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,KAAK,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AACtF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAE7D,MAAM,MAAM,mBAAmB,GAAG;IAChC,YAAY,EAAE,kBAAkB,CAAC;IACjC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,WAAW,EAAE,SAAS,EAAE,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE;IAChD,SAAS,EAAE,cAAc,CAAC;IAC1B,WAAW,EAAE,sBAAsB,CAAC;CACrC,GAAG,mBAAmB,CAoBtB"}
@@ -0,0 +1,26 @@
1
+ import { initializePluginSystem } from "../plugins/manager.js";
2
+ import { PluginHookRegistry } from "../plugins/hooks.js";
3
+ /**
4
+ * Resolves all runner-facing plugin derivatives in one place so the caller
5
+ * does not need to understand the plugin registry layout.
6
+ */
7
+ export function createRunnerPluginContext(params) {
8
+ const { runParams, hookContext } = params;
9
+ const pluginSystem = runParams.plugins
10
+ ? initializePluginSystem({
11
+ ...runParams.plugins,
12
+ runtime: {
13
+ llm: runParams.llm,
14
+ hookCtx: hookContext,
15
+ llmAllowlist: runParams.plugins.llmAllowlist,
16
+ },
17
+ })
18
+ : undefined;
19
+ return {
20
+ hookRegistry: pluginSystem?.registry.hooks ?? new PluginHookRegistry(),
21
+ pluginSkillDirs: pluginSystem?.registry.skills ?? [],
22
+ pluginTools: pluginSystem?.registry.tools.resolveEnabled(runParams.plugins?.toolAllowlist) ?? [],
23
+ memoryPluginId: runParams.memory?.pluginId ?? pluginSystem?.normalizedConfig.slots?.memory,
24
+ };
25
+ }
26
+ //# sourceMappingURL=plugin-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-context.js","sourceRoot":"","sources":["../../src/runner/plugin-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAA+B,MAAM,qBAAqB,CAAC;AAWtF;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,MAGzC;IACC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;IAE1C,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO;QACpC,CAAC,CAAC,sBAAsB,CAAC;YACrB,GAAG,SAAS,CAAC,OAAO;YACpB,OAAO,EAAE;gBACP,GAAG,EAAE,SAAS,CAAC,GAAG;gBAClB,OAAO,EAAE,WAAW;gBACpB,YAAY,EAAE,SAAS,CAAC,OAAO,CAAC,YAAY;aAC7C;SACF,CAAC;QACJ,CAAC,CAAC,SAAS,CAAC;IAEd,OAAO;QACL,YAAY,EAAE,YAAY,EAAE,QAAQ,CAAC,KAAK,IAAI,IAAI,kBAAkB,EAAE;QACtE,eAAe,EAAE,YAAY,EAAE,QAAQ,CAAC,MAAM,IAAI,EAAE;QACpD,WAAW,EAAE,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,OAAO,EAAE,aAAa,CAAC,IAAI,EAAE;QAChG,cAAc,EAAE,SAAS,CAAC,MAAM,EAAE,QAAQ,IAAI,YAAY,EAAE,gBAAgB,CAAC,KAAK,EAAE,MAAM;KAC3F,CAAC;AACJ,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { type SessionMetadata } from "../session/session.js";
2
+ import type { PluginHookAgentContext, PluginHookRegistry } from "../plugins/hooks.js";
3
+ import type { AgentRunParams, TranscriptEntry } from "../types.js";
4
+ import { RunEventDispatcher } from "./event-dispatcher.js";
5
+ /**
6
+ * Owns the runner's session-local side effects: transcript writes, initial
7
+ * user-turn persistence, and memory watch bridging. Callers use this as a
8
+ * single session context and do not need to know how transcript writes trigger
9
+ * memory sync or deduped memory_changed notifications.
10
+ */
11
+ export type AgentRunContext = {
12
+ workspaceDir: string;
13
+ memoryProviderId?: string;
14
+ memoryPluginId?: string;
15
+ appendTranscriptEntry: (entry: TranscriptEntry) => Promise<void>;
16
+ persistInitialUserEntry: (content: string) => Promise<boolean>;
17
+ stop: () => void;
18
+ };
19
+ /**
20
+ * Creates the session-scoped runtime context used by the runner. The returned
21
+ * object hides memory provider resolution, transcript write options, and the
22
+ * watch bridge lifecycle behind a small interface.
23
+ */
24
+ export declare function createRunContext(params: {
25
+ runParams: AgentRunParams;
26
+ sessionId: string;
27
+ hookContext: PluginHookAgentContext;
28
+ memoryProviderId?: string;
29
+ memoryPluginId?: string;
30
+ eventDispatcher: RunEventDispatcher;
31
+ hookRegistry: PluginHookRegistry;
32
+ }): Promise<AgentRunContext>;
33
+ export declare function buildNewSessionMetadata(params: {
34
+ sessionId: string;
35
+ title: string;
36
+ channel: AgentRunParams["channel"];
37
+ }): SessionMetadata;
38
+ //# sourceMappingURL=run-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-context.d.ts","sourceRoot":"","sources":["../../src/runner/run-context.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,uBAAuB,CAAC;AAK/B,OAAO,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACtF,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAK3D;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qBAAqB,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,uBAAuB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/D,IAAI,EAAE,MAAM,IAAI,CAAC;CAClB,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE;IAC7C,SAAS,EAAE,cAAc,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,sBAAsB,CAAC;IACpC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,kBAAkB,CAAC;IACpC,YAAY,EAAE,kBAAkB,CAAC;CAClC,GAAG,OAAO,CAAC,eAAe,CAAC,CAyH3B;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC;CACpC,GAAG,eAAe,CASlB"}
@@ -0,0 +1,159 @@
1
+ import path from "node:path";
2
+ import { appendTranscriptEntry, } from "../session/session.js";
3
+ import { createBuiltinMemoryProvider } from "../memory/builtin-provider.js";
4
+ import { resolveMemoryProvider } from "../memory/provider-registry.js";
5
+ import { startMemoryWatchBridge } from "../memory/watch-bridge.js";
6
+ import { RunEventDispatcher } from "./event-dispatcher.js";
7
+ const MEMORY_EVENT_DEDUPE_WINDOW_MS = 1_000;
8
+ const EXTERNAL_WATCH_SUPPRESS_WINDOW_MS = 3_000;
9
+ /**
10
+ * Creates the session-scoped runtime context used by the runner. The returned
11
+ * object hides memory provider resolution, transcript write options, and the
12
+ * watch bridge lifecycle behind a small interface.
13
+ */
14
+ export async function createRunContext(params) {
15
+ const { runParams, eventDispatcher, hookRegistry } = params;
16
+ const { sessionId, hookContext, memoryProviderId, memoryPluginId } = params;
17
+ const workspaceDir = path.join(runParams.dataDir, "workspace");
18
+ const recentMemoryWrites = new Map();
19
+ const recentMemoryEvents = new Map();
20
+ let initialUserEntryPersisted = false;
21
+ const emitMemoryChanged = async (event) => {
22
+ const now = Date.now();
23
+ const normalizedFiles = normalizeMemoryChangedFiles(event.files);
24
+ if (normalizedFiles.length === 0) {
25
+ return;
26
+ }
27
+ const filteredFiles = event.reason === "external-watch" && event.source === "memory"
28
+ ? normalizedFiles.filter((file) => {
29
+ const lastWriteAt = recentMemoryWrites.get(file.toLowerCase()) ?? 0;
30
+ return now - lastWriteAt > EXTERNAL_WATCH_SUPPRESS_WINDOW_MS;
31
+ })
32
+ : normalizedFiles;
33
+ if (filteredFiles.length === 0) {
34
+ return;
35
+ }
36
+ if (event.reason !== "external-watch" && event.source === "memory") {
37
+ for (const file of filteredFiles) {
38
+ recentMemoryWrites.set(file.toLowerCase(), now);
39
+ }
40
+ }
41
+ const dedupeKey = `${event.reason}|${event.source}|${filteredFiles.map((file) => file.toLowerCase()).sort().join("|")}`;
42
+ const previousEventAt = recentMemoryEvents.get(dedupeKey) ?? 0;
43
+ if (now - previousEventAt < MEMORY_EVENT_DEDUPE_WINDOW_MS) {
44
+ return;
45
+ }
46
+ recentMemoryEvents.set(dedupeKey, now);
47
+ const eventToEmit = {
48
+ ...event,
49
+ files: filteredFiles,
50
+ };
51
+ await eventDispatcher.dispatchProgress(event.sessionId ?? sessionId, {
52
+ type: "memory_changed",
53
+ reason: eventToEmit.reason,
54
+ files: eventToEmit.files,
55
+ source: eventToEmit.source,
56
+ providerId: eventToEmit.providerId,
57
+ timestamp: eventToEmit.timestamp,
58
+ }).catch(() => { });
59
+ await hookRegistry.dispatch("memory_changed", eventToEmit, {
60
+ ...hookContext,
61
+ sessionId: eventToEmit.sessionId ?? hookContext.sessionId,
62
+ }).catch(() => { });
63
+ };
64
+ const memoryRoot = path.join(runParams.dataDir, ".aimax");
65
+ const resolvedProvider = resolveMemoryProvider({
66
+ providerId: memoryProviderId,
67
+ pluginId: memoryPluginId,
68
+ dataDir: runParams.dataDir,
69
+ memoryDir: memoryRoot,
70
+ sessionId,
71
+ });
72
+ const provider = resolvedProvider?.provider ??
73
+ createBuiltinMemoryProvider({ dataDir: runParams.dataDir, memoryDir: memoryRoot, sessionId });
74
+ const stopMemoryWatchBridge = startMemoryWatchBridge({
75
+ dataDir: runParams.dataDir,
76
+ sessionId,
77
+ providerId: memoryProviderId ?? memoryPluginId ?? provider.id,
78
+ provider,
79
+ onMemoryChanged: emitMemoryChanged,
80
+ });
81
+ if (provider.sync) {
82
+ void provider.sync("session-start").catch(() => { });
83
+ }
84
+ const appendWithMemory = async (entry) => {
85
+ await appendTranscriptEntry(runParams.dataDir, sessionId, entry, buildTranscriptOptions({
86
+ providerId: memoryProviderId,
87
+ pluginId: memoryPluginId,
88
+ onMemoryChanged: emitMemoryChanged,
89
+ }));
90
+ };
91
+ return {
92
+ workspaceDir,
93
+ memoryProviderId,
94
+ memoryPluginId,
95
+ appendTranscriptEntry: appendWithMemory,
96
+ persistInitialUserEntry: async (content) => {
97
+ if (initialUserEntryPersisted) {
98
+ return false;
99
+ }
100
+ await appendWithMemory({
101
+ role: "user",
102
+ content,
103
+ timestamp: new Date().toISOString(),
104
+ });
105
+ initialUserEntryPersisted = true;
106
+ return true;
107
+ },
108
+ stop: () => {
109
+ stopMemoryWatchBridge();
110
+ },
111
+ };
112
+ }
113
+ export function buildNewSessionMetadata(params) {
114
+ const now = new Date().toISOString();
115
+ return {
116
+ id: params.sessionId,
117
+ title: params.title,
118
+ channel: params.channel,
119
+ createdAt: now,
120
+ updatedAt: now,
121
+ };
122
+ }
123
+ /**
124
+ * Transcript writes only need memory identifiers when memory integration is
125
+ * enabled. This helper keeps that conditional wiring out of callers.
126
+ */
127
+ function buildTranscriptOptions(params) {
128
+ if (params.providerId || params.pluginId) {
129
+ return {
130
+ providerId: params.providerId,
131
+ pluginId: params.pluginId,
132
+ onMemoryChanged: params.onMemoryChanged,
133
+ };
134
+ }
135
+ return { onMemoryChanged: params.onMemoryChanged };
136
+ }
137
+ /**
138
+ * Normalizes file paths before dedupe so providers can report paths in a
139
+ * variety of formats without causing duplicate memory_changed events.
140
+ */
141
+ function normalizeMemoryChangedFiles(files) {
142
+ const result = [];
143
+ const seen = new Set();
144
+ for (const raw of files) {
145
+ const normalized = raw.replace(/\\/g, "/").replace(/^\.\//, "").trim();
146
+ if (!normalized) {
147
+ continue;
148
+ }
149
+ const canonical = normalized.toLowerCase() === "memory.md" ? "MEMORY.md" : normalized;
150
+ const key = canonical.toLowerCase();
151
+ if (seen.has(key)) {
152
+ continue;
153
+ }
154
+ seen.add(key);
155
+ result.push(canonical);
156
+ }
157
+ return result;
158
+ }
159
+ //# sourceMappingURL=run-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-context.js","sourceRoot":"","sources":["../../src/runner/run-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { AgentRunParams } from "../types.js";
2
+ import { type AgentRunContext } from "./run-context.js";
3
+ import { type RunnerPluginContext } from "./plugin-context.js";
4
+ import { RunEventDispatcher } from "./event-dispatcher.js";
5
+ import type { PluginHookAgentContext, PluginHookRegistry } from "../plugins/hooks.js";
6
+ export type RunnerSession = {
7
+ sessionId: string;
8
+ isNewSession: boolean;
9
+ workspaceDir: string;
10
+ hookContext: PluginHookAgentContext;
11
+ hookRegistry: PluginHookRegistry;
12
+ pluginContext: RunnerPluginContext;
13
+ runContext: AgentRunContext;
14
+ start: (params: {
15
+ resetCommand?: {
16
+ action: "new" | "reset";
17
+ };
18
+ previousSessionId?: string;
19
+ rawMessage?: string;
20
+ startMessage: string;
21
+ }) => Promise<void>;
22
+ };
23
+ /**
24
+ * Establishes the session-scoped objects the runner needs: concrete session
25
+ * identity, hook context, plugin derivatives, memory/transcript run context,
26
+ * and start-of-session notifications. Callers should treat the returned value
27
+ * as the single source of truth for session-local runner state.
28
+ */
29
+ export declare function createRunnerSession(params: {
30
+ runParams: AgentRunParams;
31
+ requestedSessionId?: string;
32
+ eventDispatcher: RunEventDispatcher;
33
+ }): Promise<RunnerSession>;
34
+ //# sourceMappingURL=runner-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner-session.d.ts","sourceRoot":"","sources":["../../src/runner/runner-session.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAoB,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAA6B,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1F,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEtF,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,sBAAsB,CAAC;IACpC,YAAY,EAAE,kBAAkB,CAAC;IACjC,aAAa,EAAE,mBAAmB,CAAC;IACnC,UAAU,EAAE,eAAe,CAAC;IAC5B,KAAK,EAAE,CAAC,MAAM,EAAE;QACd,YAAY,CAAC,EAAE;YAAE,MAAM,EAAE,KAAK,GAAG,OAAO,CAAA;SAAE,CAAC;QAC3C,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;KACtB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACrB,CAAC;AAEF;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE;IAChD,SAAS,EAAE,cAAc,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,kBAAkB,CAAC;CACrC,GAAG,OAAO,CAAC,aAAa,CAAC,CAgDzB"}
@@ -0,0 +1,61 @@
1
+ import path from "node:path";
2
+ import { createSession, ensureSession } from "../session/session.js";
3
+ import { createRunContext } from "./run-context.js";
4
+ import { createRunnerPluginContext } from "./plugin-context.js";
5
+ import { startSessionLifecycle } from "./session-lifecycle.js";
6
+ import { RunEventDispatcher } from "./event-dispatcher.js";
7
+ /**
8
+ * Establishes the session-scoped objects the runner needs: concrete session
9
+ * identity, hook context, plugin derivatives, memory/transcript run context,
10
+ * and start-of-session notifications. Callers should treat the returned value
11
+ * as the single source of truth for session-local runner state.
12
+ */
13
+ export async function createRunnerSession(params) {
14
+ const { runParams, requestedSessionId, eventDispatcher } = params;
15
+ const workspaceDir = path.join(runParams.dataDir, "workspace");
16
+ let sessionId = requestedSessionId;
17
+ const isNewSession = !sessionId;
18
+ if (sessionId) {
19
+ await ensureSession(runParams.dataDir, sessionId);
20
+ }
21
+ else {
22
+ sessionId = await createSession(runParams.dataDir, runParams.channel);
23
+ }
24
+ const hookContext = {
25
+ sessionId,
26
+ workspaceDir,
27
+ channel: runParams.channel,
28
+ };
29
+ const pluginContext = createRunnerPluginContext({
30
+ runParams,
31
+ hookContext,
32
+ });
33
+ const hookRegistry = pluginContext.hookRegistry;
34
+ const runContext = await createRunContext({
35
+ runParams,
36
+ sessionId,
37
+ hookContext,
38
+ memoryProviderId: runParams.memory?.providerId,
39
+ memoryPluginId: pluginContext.memoryPluginId,
40
+ eventDispatcher,
41
+ hookRegistry,
42
+ });
43
+ return {
44
+ sessionId,
45
+ isNewSession,
46
+ workspaceDir,
47
+ hookContext,
48
+ hookRegistry,
49
+ pluginContext,
50
+ runContext,
51
+ start: (startParams) => startSessionLifecycle({
52
+ sessionId,
53
+ runParams,
54
+ hookRegistry,
55
+ hookContext,
56
+ eventDispatcher,
57
+ ...startParams,
58
+ }),
59
+ };
60
+ }
61
+ //# sourceMappingURL=runner-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner-session.js","sourceRoot":"","sources":["../../src/runner/runner-session.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAErE,OAAO,EAAE,gBAAgB,EAAwB,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,yBAAyB,EAA4B,MAAM,qBAAqB,CAAC;AAC1F,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAmB3D;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,MAIzC;IACC,MAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE,eAAe,EAAE,GAAG,MAAM,CAAC;IAClE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC/D,IAAI,SAAS,GAAG,kBAAkB,CAAC;IACnC,MAAM,YAAY,GAAG,CAAC,SAAS,CAAC;IAChC,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,aAAa,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACpD,CAAC;SAAM,CAAC;QACN,SAAS,GAAG,MAAM,aAAa,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,WAAW,GAA2B;QAC1C,SAAS;QACT,YAAY;QACZ,OAAO,EAAE,SAAS,CAAC,OAAO;KAC3B,CAAC;IACF,MAAM,aAAa,GAAG,yBAAyB,CAAC;QAC9C,SAAS;QACT,WAAW;KACZ,CAAC,CAAC;IACH,MAAM,YAAY,GAAG,aAAa,CAAC,YAAY,CAAC;IAChD,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC;QACxC,SAAS;QACT,SAAS;QACT,WAAW;QACX,gBAAgB,EAAE,SAAS,CAAC,MAAM,EAAE,UAAU;QAC9C,cAAc,EAAE,aAAa,CAAC,cAAc;QAC5C,eAAe;QACf,YAAY;KACb,CAAC,CAAC;IAEH,OAAO;QACL,SAAS;QACT,YAAY;QACZ,YAAY;QACZ,WAAW;QACX,YAAY;QACZ,aAAa;QACb,UAAU;QACV,KAAK,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,qBAAqB,CAAC;YAC5C,SAAS;YACT,SAAS;YACT,YAAY;YACZ,WAAW;YACX,eAAe;YACf,GAAG,WAAW;SACf,CAAC;KACH,CAAC;AACJ,CAAC"}
@@ -1,7 +1,6 @@
1
1
  import type { AgentRunParams, AgentRunResult } from "../types.js";
2
2
  import { SubagentRegistry } from "../subagent/registry.js";
3
- /** Generates a session title by truncating the first user message */
4
- export declare function generateSessionTitle(message: string, maxLength?: number): string;
3
+ export { generateSessionTitle } from "./title.js";
5
4
  /**
6
5
  * Runs an agent session end-to-end.
7
6
  * Supports multi-agent: subagents spawned via sessions_spawn are automatically
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/runner/runner.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EAKf,MAAM,aAAa,CAAC;AASrB,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAsC3D,qEAAqE;AACrE,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,SAAK,GAAG,MAAM,CAG5E;AA8tCD;;;;;;;GAOG;AACH,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,cAAc,EACtB,mBAAmB,CAAC,EAAE,gBAAgB,GACrC,OAAO,CAAC,cAAc,CAAC,CAGzB"}
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/runner/runner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EACf,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAW3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAuOlD;;;;;;;GAOG;AACH,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,cAAc,EACtB,mBAAmB,CAAC,EAAE,gBAAgB,GACrC,OAAO,CAAC,cAAc,CAAC,CAGzB"}