@roackb2/heddle 0.0.15 → 0.0.17

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 (79) hide show
  1. package/README.md +31 -3
  2. package/dist/src/cli/chat/App.js +1 -1
  3. package/dist/src/cli/chat/App.js.map +1 -1
  4. package/dist/src/cli/chat/hooks/useChatSessions.d.ts +2 -2
  5. package/dist/src/cli/chat/hooks/useChatSessions.d.ts.map +1 -1
  6. package/dist/src/cli/chat/hooks/useChatSessions.js +4 -4
  7. package/dist/src/cli/chat/hooks/useChatSessions.js.map +1 -1
  8. package/dist/src/cli/chat/state/approval-rules.js +66 -5
  9. package/dist/src/cli/chat/state/approval-rules.js.map +1 -1
  10. package/dist/src/cli/chat/state/storage.d.ts +1 -1
  11. package/dist/src/cli/chat/state/storage.d.ts.map +1 -1
  12. package/dist/src/cli/chat/state/storage.js +1 -1
  13. package/dist/src/cli/chat/state/storage.js.map +1 -1
  14. package/dist/src/cli/chat/utils/format.d.ts.map +1 -1
  15. package/dist/src/cli/chat/utils/format.js +5 -4
  16. package/dist/src/cli/chat/utils/format.js.map +1 -1
  17. package/dist/src/cli/chat/utils/runtime.d.ts +1 -1
  18. package/dist/src/cli/chat/utils/runtime.d.ts.map +1 -1
  19. package/dist/src/cli/chat/utils/runtime.js +1 -1
  20. package/dist/src/cli/chat/utils/runtime.js.map +1 -1
  21. package/dist/src/cli/daemon.js +2 -2
  22. package/dist/src/cli/heartbeat.d.ts.map +1 -1
  23. package/dist/src/cli/heartbeat.js +136 -46
  24. package/dist/src/cli/heartbeat.js.map +1 -1
  25. package/dist/src/cli/main.js +107 -100
  26. package/dist/src/cli/main.js.map +1 -1
  27. package/dist/src/cli/session.d.ts +11 -0
  28. package/dist/src/cli/session.d.ts.map +1 -0
  29. package/dist/src/cli/session.js +30 -0
  30. package/dist/src/cli/session.js.map +1 -0
  31. package/dist/src/core/agent/mutation-tracking.js +13 -3
  32. package/dist/src/core/agent/mutation-tracking.js.map +1 -1
  33. package/dist/src/core/agent/tool-dispatch.d.ts.map +1 -1
  34. package/dist/src/core/agent/tool-dispatch.js +31 -1
  35. package/dist/src/core/agent/tool-dispatch.js.map +1 -1
  36. package/dist/src/core/chat/session-submit.d.ts +9 -1
  37. package/dist/src/core/chat/session-submit.d.ts.map +1 -1
  38. package/dist/src/core/chat/session-submit.js +5 -2
  39. package/dist/src/core/chat/session-submit.js.map +1 -1
  40. package/dist/src/core/chat/storage.d.ts +20 -1
  41. package/dist/src/core/chat/storage.d.ts.map +1 -1
  42. package/dist/src/core/chat/storage.js +260 -23
  43. package/dist/src/core/chat/storage.js.map +1 -1
  44. package/dist/src/core/tools/edit-file.js +1 -1
  45. package/dist/src/core/tools/edit-file.js.map +1 -1
  46. package/dist/src/core/tools/file-edit-core.d.ts.map +1 -1
  47. package/dist/src/core/tools/file-edit-core.js +7 -10
  48. package/dist/src/core/tools/file-edit-core.js.map +1 -1
  49. package/dist/src/server/app.d.ts.map +1 -1
  50. package/dist/src/server/app.js +40 -0
  51. package/dist/src/server/app.js.map +1 -1
  52. package/dist/src/server/features/control-plane/router.d.ts +80 -0
  53. package/dist/src/server/features/control-plane/router.d.ts.map +1 -1
  54. package/dist/src/server/features/control-plane/router.js +79 -5
  55. package/dist/src/server/features/control-plane/router.js.map +1 -1
  56. package/dist/src/server/features/control-plane/services/chat-sessions.d.ts +32 -7
  57. package/dist/src/server/features/control-plane/services/chat-sessions.d.ts.map +1 -1
  58. package/dist/src/server/features/control-plane/services/chat-sessions.js +191 -26
  59. package/dist/src/server/features/control-plane/services/chat-sessions.js.map +1 -1
  60. package/dist/src/server/features/control-plane/services/control-plane-state.js +1 -1
  61. package/dist/src/server/features/control-plane/services/control-plane-state.js.map +1 -1
  62. package/dist/src/server/features/control-plane/services/workspace-files.d.ts +9 -0
  63. package/dist/src/server/features/control-plane/services/workspace-files.d.ts.map +1 -0
  64. package/dist/src/server/features/control-plane/services/workspace-files.js +71 -0
  65. package/dist/src/server/features/control-plane/services/workspace-files.js.map +1 -0
  66. package/dist/src/server/features/control-plane/types.d.ts +13 -0
  67. package/dist/src/server/features/control-plane/types.d.ts.map +1 -1
  68. package/dist/src/server/index.d.ts +2 -1
  69. package/dist/src/server/index.d.ts.map +1 -1
  70. package/dist/src/server/index.js +2 -1
  71. package/dist/src/server/index.js.map +1 -1
  72. package/dist/src/server/router.d.ts +80 -0
  73. package/dist/src/server/router.d.ts.map +1 -1
  74. package/dist/src/web/assets/index-C_kziU0x.css +1 -0
  75. package/dist/src/web/assets/index-DecqlZlx.js +12 -0
  76. package/dist/src/web/index.html +2 -2
  77. package/package.json +2 -1
  78. package/dist/src/web/assets/index-DH9iWMSO.js +0 -9
  79. package/dist/src/web/assets/index-DyCJ7Ml4.css +0 -1
@@ -0,0 +1,30 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ import { deriveSessionStoragePaths, migrateLegacyChatSessions } from '../core/chat/storage.js';
4
+ export async function runSessionCli(args, options = {}) {
5
+ const parsed = parseSessionArgs(args);
6
+ if (parsed.command !== 'migrate') {
7
+ process.stdout.write('Usage: heddle session migrate\n');
8
+ return;
9
+ }
10
+ const workspaceRoot = options.workspaceRoot ?? process.cwd();
11
+ const stateDir = options.stateDir ?? '.heddle';
12
+ const sessionsPath = resolve(workspaceRoot, stateDir, 'chat-sessions.json');
13
+ const paths = deriveSessionStoragePaths(sessionsPath);
14
+ const hadLegacyFile = existsSync(paths.legacyPath);
15
+ const hadCatalog = existsSync(paths.catalogPath);
16
+ const sessions = migrateLegacyChatSessions(sessionsPath, true);
17
+ process.stdout.write([
18
+ `Migrated ${sessions.length} chat sessions.`,
19
+ `Legacy file: ${hadLegacyFile ? 'preserved' : 'not found'} at ${paths.legacyPath}`,
20
+ `Catalog: ${existsSync(paths.catalogPath) ? (hadCatalog ? 'updated' : 'created') : 'missing'} at ${paths.catalogPath}`,
21
+ `Per-session directory: ${paths.sessionsDir}`,
22
+ ].join('\n') + '\n');
23
+ }
24
+ export function parseSessionArgs(args) {
25
+ const [command] = args;
26
+ return {
27
+ command: command === 'migrate' ? 'migrate' : undefined,
28
+ };
29
+ }
30
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/cli/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAO/F,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAc,EAAE,UAA6B,EAAE;IACjF,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACxD,OAAO;IACT,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC7D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,SAAS,CAAC;IAC/C,MAAM,YAAY,GAAG,OAAO,CAAC,aAAa,EAAE,QAAQ,EAAE,oBAAoB,CAAC,CAAC;IAC5E,MAAM,KAAK,GAAG,yBAAyB,CAAC,YAAY,CAAC,CAAC;IACtD,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAEjD,MAAM,QAAQ,GAAG,yBAAyB,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IAE/D,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB;QACE,YAAY,QAAQ,CAAC,MAAM,iBAAiB;QAC5C,gBAAgB,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,OAAO,KAAK,CAAC,UAAU,EAAE;QAClF,YAAY,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,OAAO,KAAK,CAAC,WAAW,EAAE;QACtH,0BAA0B,KAAK,CAAC,WAAW,EAAE;KAC9C,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CACpB,CAAC;AACJ,CAAC;AAMD,MAAM,UAAU,gBAAgB,CAAC,IAAc;IAC7C,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;IACvB,OAAO;QACL,OAAO,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;KACvD,CAAC;AACJ,CAAC"}
@@ -109,15 +109,25 @@ function describeEditMutation(input) {
109
109
  }
110
110
  function summarizeCommandEvidence(output) {
111
111
  if (!output || typeof output !== 'object' || Array.isArray(output)) {
112
- return 'no structured command output recorded';
112
+ return 'command completed';
113
113
  }
114
114
  const candidate = output;
115
115
  const command = typeof candidate.command === 'string' && candidate.command.trim() ? candidate.command.trim() : 'command';
116
116
  const stdout = typeof candidate.stdout === 'string' ? candidate.stdout.trim() : '';
117
117
  const stderr = typeof candidate.stderr === 'string' ? candidate.stderr.trim() : '';
118
118
  const exitCode = typeof candidate.exitCode === 'number' ? candidate.exitCode : 0;
119
+ const normalized = normalizeCommand(command);
120
+ if (normalized.startsWith('git status') || normalized.startsWith('git diff')) {
121
+ return `${command} reviewed (exit ${exitCode})`;
122
+ }
123
+ if (/^(?:yarn test|yarn build|yarn lint|yarn vitest|vitest|tsc)\b/.test(normalized)) {
124
+ return `${command} passed (exit ${exitCode})`;
125
+ }
119
126
  const body = stdout || stderr;
120
- const snippet = body ? body.replace(/\s+/g, ' ').slice(0, 120) : 'no stdout/stderr output';
121
- return `${command} => exit ${exitCode}, ${snippet}`;
127
+ if (!body) {
128
+ return `${command} completed (exit ${exitCode})`;
129
+ }
130
+ const snippet = body.replace(/\s+/g, ' ').slice(0, 80);
131
+ return `${command} completed (exit ${exitCode}): ${snippet}`;
122
132
  }
123
133
  //# sourceMappingURL=mutation-tracking.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mutation-tracking.js","sourceRoot":"","sources":["../../../../src/core/agent/mutation-tracking.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mutation-tracking.js","sourceRoot":"","sources":["../../../../src/core/agent/mutation-tracking.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"tool-dispatch.d.ts","sourceRoot":"","sources":["../../../../src/core/agent/tool-dispatch.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAInC,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,cAAc,GAAG,SAAS,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,eAAe,EAAE,eAAe,CAAC,iBAAiB,CAAC,CAAC;IACpD,MAAM,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IACpC,GAAG,EAAE,MAAM,CAAC;CACb,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAAC,CAoBpD;AAED,wBAAsB,2BAA2B,CAAC,IAAI,EAAE;IACtD,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,QAAQ,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;IAChD,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,eAAe,EAAE,eAAe,CAAC,iBAAiB,CAAC,CAAC;IACpD,MAAM,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IACpC,GAAG,EAAE,MAAM,CAAC;CACb,GAAG,OAAO,CAAC;IAAE,aAAa,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC,CAAA;CAAE,CAAC,CA2CxF"}
1
+ {"version":3,"file":"tool-dispatch.d.ts","sourceRoot":"","sources":["../../../../src/core/agent/tool-dispatch.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAInC,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,cAAc,GAAG,SAAS,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,eAAe,EAAE,eAAe,CAAC,iBAAiB,CAAC,CAAC;IACpD,MAAM,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IACpC,GAAG,EAAE,MAAM,CAAC;CACb,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAAC,CAwBpD;AAED,wBAAsB,2BAA2B,CAAC,IAAI,EAAE;IACtD,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,QAAQ,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;IAChD,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,eAAe,EAAE,eAAe,CAAC,iBAAiB,CAAC,CAAC;IACpD,MAAM,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IACpC,GAAG,EAAE,MAAM,CAAC;CACb,GAAG,OAAO,CAAC;IAAE,aAAa,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC,CAAA;CAAE,CAAC,CA2CxF"}
@@ -2,12 +2,16 @@
2
2
  // Tool dispatch — approval, execution, fallback, and deduplication logic
3
3
  // for the agent loop.
4
4
  // ---------------------------------------------------------------------------
5
+ import { resolve } from 'node:path';
5
6
  import { executeTool } from '../tools/execute-tool.js';
6
7
  import { stableSerialize, normalizeToolInput, buildRepeatedToolCallResult } from './util.js';
7
8
  const MAX_IDENTICAL_TOOL_CALLS = 2;
8
9
  export async function maybeDenyToolCall(args) {
9
10
  const { call, tool, step, now, approveToolCall, record, log } = args;
10
- if (!tool?.requiresApproval) {
11
+ if (!tool) {
12
+ return undefined;
13
+ }
14
+ if (!requiresApprovalForCall(call, tool)) {
11
15
  return undefined;
12
16
  }
13
17
  const approval = await resolveToolApproval({ call, tool, step, now, approveToolCall, record });
@@ -93,6 +97,32 @@ async function resolveToolApproval(args) {
93
97
  });
94
98
  return approval;
95
99
  }
100
+ function requiresApprovalForCall(call, tool) {
101
+ if (tool.requiresApproval) {
102
+ return true;
103
+ }
104
+ return isOutsideWorkspaceInspectionCall(call);
105
+ }
106
+ function isOutsideWorkspaceInspectionCall(call) {
107
+ if (call.tool !== 'read_file' && call.tool !== 'list_files' && call.tool !== 'search_files' && call.tool !== 'edit_file') {
108
+ return false;
109
+ }
110
+ const input = call.input;
111
+ if (!input || typeof input !== 'object' || Array.isArray(input)) {
112
+ return false;
113
+ }
114
+ const record = input;
115
+ const rawPath = typeof record.path === 'string'
116
+ ? record.path
117
+ : call.tool === 'search_files' ? '.'
118
+ : undefined;
119
+ if (!rawPath) {
120
+ return false;
121
+ }
122
+ const resolvedTarget = resolve(rawPath);
123
+ const workspaceRoot = process.cwd();
124
+ return resolvedTarget !== workspaceRoot && !resolvedTarget.startsWith(`${workspaceRoot}/`);
125
+ }
96
126
  function getInspectFallbackReason(call, result) {
97
127
  if (call.tool !== 'run_shell_inspect' || result.ok) {
98
128
  return undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"tool-dispatch.js","sourceRoot":"","sources":["../../../../src/core/agent/tool-dispatch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tool-dispatch.js","sourceRoot":"","sources":["../../../../src/core/agent/tool-dispatch.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,18 @@
1
+ import type { ToolCall, ToolDefinition } from '../../index.js';
1
2
  import type { ChatSession } from './types.js';
3
+ import type { AgentLoopEvent } from '../../index.js';
2
4
  export type SubmitChatSessionPromptArgs = {
3
5
  workspaceRoot: string;
4
6
  stateRoot: string;
5
- sessionsPath: string;
7
+ sessionStoragePath: string;
6
8
  sessionId: string;
7
9
  prompt: string;
10
+ onEvent?: (event: AgentLoopEvent) => void;
11
+ approveToolCall?: (call: ToolCall, tool: ToolDefinition) => Promise<{
12
+ approved: boolean;
13
+ reason?: string;
14
+ }>;
15
+ abortSignal?: AbortSignal;
8
16
  };
9
17
  export declare function submitChatSessionPrompt(args: SubmitChatSessionPromptArgs): Promise<{
10
18
  outcome: import("../types.js").StopReason;
@@ -1 +1 @@
1
- {"version":3,"file":"session-submit.d.ts","sourceRoot":"","sources":["../../../../src/core/chat/session-submit.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAK9C,MAAM,MAAM,2BAA2B,GAAG;IACxC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,2BAA2B;;;;GAgF9E"}
1
+ {"version":3,"file":"session-submit.d.ts","sourceRoot":"","sources":["../../../../src/core/chat/session-submit.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAG/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAK9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,MAAM,MAAM,2BAA2B,GAAG;IACxC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IAC1C,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc,KAAK,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5G,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B,CAAC;AAEF,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,2BAA2B;;;;GAmF9E"}
@@ -6,7 +6,7 @@ import { buildConversationMessages, countAssistantSteps, formatChatFailureMessag
6
6
  import { saveTrace } from './trace.js';
7
7
  import { resolveApiKeyForModel } from '../../core/runtime/api-keys.js';
8
8
  export async function submitChatSessionPrompt(args) {
9
- const sessions = loadChatSessions(args.sessionsPath, true);
9
+ const sessions = loadChatSessions(args.sessionStoragePath, true);
10
10
  const session = sessions.find((candidate) => candidate.id === args.sessionId);
11
11
  if (!session) {
12
12
  throw new Error(`Chat session not found: ${args.sessionId}`);
@@ -37,6 +37,9 @@ export async function submitChatSessionPrompt(args) {
37
37
  tools,
38
38
  includeDefaultTools: false,
39
39
  history: session.history,
40
+ onEvent: args.onEvent,
41
+ approveToolCall: args.approveToolCall,
42
+ abortSignal: args.abortSignal,
40
43
  });
41
44
  const compacted = compactChatHistory({
42
45
  history: result.transcript,
@@ -70,7 +73,7 @@ export async function submitChatSessionPrompt(args) {
70
73
  turns: [...session.turns, nextTurn].slice(-8),
71
74
  });
72
75
  const nextSessions = sessions.map((candidate) => candidate.id === session.id ? updatedSession : candidate);
73
- saveChatSessions(args.sessionsPath, nextSessions);
76
+ saveChatSessions(args.sessionStoragePath, nextSessions);
74
77
  return {
75
78
  outcome: result.outcome,
76
79
  summary: formattedSummary,
@@ -1 +1 @@
1
- {"version":3,"file":"session-submit.js","sourceRoot":"","sources":["../../../../src/core/chat/session-submit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-submit.js","sourceRoot":"","sources":["../../../../src/core/chat/session-submit.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,14 @@
1
- import type { ChatSession, ConversationLine } from './types.js';
1
+ import type { ChatContextStats, ChatSession, ConversationLine } from './types.js';
2
+ type ChatSessionCatalogEntry = {
3
+ id: string;
4
+ name: string;
5
+ createdAt: string;
6
+ updatedAt: string;
7
+ model?: string;
8
+ driftEnabled?: boolean;
9
+ lastContinuePrompt?: string;
10
+ context?: ChatContextStats;
11
+ };
2
12
  export declare function createInitialMessages(apiKeyPresent: boolean): ConversationLine[];
3
13
  export declare function createChatSession(options: {
4
14
  id: string;
@@ -10,5 +20,14 @@ export declare function touchSession(session: ChatSession): ChatSession;
10
20
  export declare function summarizeSession(session: ChatSession): string;
11
21
  export declare function isGenericSessionName(name: string): boolean;
12
22
  export declare function loadChatSessions(sessionsPath: string, apiKeyPresent: boolean): ChatSession[];
23
+ export declare function readChatSessionCatalog(sessionsPath: string): ChatSessionCatalogEntry[];
24
+ export declare function readChatSession(sessionsPath: string, sessionId: string, apiKeyPresent: boolean): ChatSession | undefined;
25
+ export declare function migrateLegacyChatSessions(sessionsPath: string, apiKeyPresent: boolean): ChatSession[];
13
26
  export declare function saveChatSessions(sessionsPath: string, sessions: ChatSession[]): void;
27
+ export declare function deriveSessionStoragePaths(storagePath: string): {
28
+ legacyPath: string;
29
+ catalogPath: string;
30
+ sessionsDir: string;
31
+ };
32
+ export {};
14
33
  //# sourceMappingURL=storage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../../src/core/chat/storage.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAoB,WAAW,EAAE,gBAAgB,EAAe,MAAM,YAAY,CAAC;AAG/F,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,OAAO,GAAG,gBAAgB,EAAE,CAiBhF;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,WAAW,CAed;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,WAAW,CAE9D;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAI7D;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,GAAG,WAAW,EAAE,CAmC5F;AAED,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,QAG7E"}
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../../src/core/chat/storage.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,gBAAgB,EAAe,MAAM,YAAY,CAAC;AAG/F,KAAK,uBAAuB,GAAG;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,EAAE,gBAAgB,CAAC;CAC5B,CAAC;AAOF,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,OAAO,GAAG,gBAAgB,EAAE,CAiBhF;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,WAAW,CAed;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,WAAW,CAE9D;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAI7D;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,GAAG,WAAW,EAAE,CAkB5F;AAED,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,MAAM,GAAG,uBAAuB,EAAE,CAItF;AAED,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS,CASxH;AAED,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,GAAG,WAAW,EAAE,CAQrG;AAED,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,QA0B7E;AAED,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM;;;;EAQ5D"}
@@ -1,5 +1,5 @@
1
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
2
- import { dirname } from 'node:path';
1
+ import { existsSync, mkdirSync, readdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';
2
+ import { dirname, join } from 'node:path';
3
3
  import { truncate } from './format.js';
4
4
  export function createInitialMessages(apiKeyPresent) {
5
5
  return [
@@ -45,40 +45,274 @@ export function isGenericSessionName(name) {
45
45
  return /^Session \d+$/.test(name.trim());
46
46
  }
47
47
  export function loadChatSessions(sessionsPath, apiKeyPresent) {
48
+ const resolved = loadChatSessionsFromCurrentStorage(sessionsPath, apiKeyPresent);
49
+ if (resolved.length > 0) {
50
+ return resolved;
51
+ }
52
+ const migrated = migrateLegacyChatSessions(sessionsPath, apiKeyPresent);
53
+ if (migrated.length > 0) {
54
+ return migrated;
55
+ }
56
+ return [
57
+ createChatSession({
58
+ id: 'session-1',
59
+ name: 'Session 1',
60
+ apiKeyPresent,
61
+ }),
62
+ ];
63
+ }
64
+ export function readChatSessionCatalog(sessionsPath) {
65
+ const paths = deriveSessionStoragePaths(sessionsPath);
66
+ const catalog = readCatalog(paths.catalogPath);
67
+ return catalog?.sessions.sort((left, right) => right.updatedAt.localeCompare(left.updatedAt)) ?? [];
68
+ }
69
+ export function readChatSession(sessionsPath, sessionId, apiKeyPresent) {
70
+ const paths = deriveSessionStoragePaths(sessionsPath);
71
+ const catalog = readCatalog(paths.catalogPath);
72
+ const entry = catalog?.sessions.find((candidate) => candidate.id === sessionId);
73
+ if (!entry) {
74
+ return undefined;
75
+ }
76
+ return readSessionFile(paths.sessionsDir, entry, apiKeyPresent)[0];
77
+ }
78
+ export function migrateLegacyChatSessions(sessionsPath, apiKeyPresent) {
79
+ const legacySessions = loadLegacyChatSessions(sessionsPath, apiKeyPresent);
80
+ if (legacySessions.length === 0) {
81
+ return [];
82
+ }
83
+ saveChatSessions(sessionsPath, legacySessions);
84
+ return legacySessions.sort((left, right) => right.updatedAt.localeCompare(left.updatedAt));
85
+ }
86
+ export function saveChatSessions(sessionsPath, sessions) {
87
+ mkdirSync(dirname(sessionsPath), { recursive: true });
88
+ const paths = deriveSessionStoragePaths(sessionsPath);
89
+ mkdirSync(paths.sessionsDir, { recursive: true });
90
+ const sorted = dedupeSessionsById(sessions).sort((left, right) => right.updatedAt.localeCompare(left.updatedAt));
91
+ const previousCatalog = readCatalog(paths.catalogPath);
92
+ const previousSessionBodies = new Map();
93
+ for (const entry of previousCatalog?.sessions ?? []) {
94
+ const body = readSessionFileContents(paths.sessionsDir, entry.id);
95
+ if (body !== undefined) {
96
+ previousSessionBodies.set(entry.id, body);
97
+ }
98
+ }
99
+ for (const session of sorted) {
100
+ writeSessionFileIfChanged(paths.sessionsDir, session, previousSessionBodies.get(session.id));
101
+ }
102
+ const catalog = {
103
+ version: 1,
104
+ sessions: sorted.map((session) => projectCatalogEntry(session)),
105
+ };
106
+ writeCatalogIfChanged(paths.catalogPath, catalog, previousCatalog);
107
+ removeOrphanedSessionFiles(paths.sessionsDir, catalog.sessions.map((session) => session.id));
108
+ }
109
+ export function deriveSessionStoragePaths(storagePath) {
110
+ const stateDir = dirname(storagePath);
111
+ const legacyPath = storagePath.endsWith('chat-sessions.catalog.json') ? join(stateDir, 'chat-sessions.json') : storagePath;
112
+ return {
113
+ legacyPath,
114
+ catalogPath: join(stateDir, 'chat-sessions.catalog.json'),
115
+ sessionsDir: join(stateDir, 'chat-sessions'),
116
+ };
117
+ }
118
+ function loadChatSessionsFromCurrentStorage(sessionsPath, apiKeyPresent) {
119
+ const paths = deriveSessionStoragePaths(sessionsPath);
120
+ return loadSessionsFromCatalog(paths, apiKeyPresent);
121
+ }
122
+ function loadSessionsFromCatalog(paths, apiKeyPresent) {
123
+ if (!existsSync(paths.catalogPath)) {
124
+ return [];
125
+ }
126
+ try {
127
+ const raw = JSON.parse(readFileSync(paths.catalogPath, 'utf8'));
128
+ const catalog = parseCatalog(raw);
129
+ if (!catalog) {
130
+ return [];
131
+ }
132
+ const sessions = catalog.sessions.flatMap((entry) => readSessionFile(paths.sessionsDir, entry, apiKeyPresent));
133
+ return sessions.sort((left, right) => right.updatedAt.localeCompare(left.updatedAt));
134
+ }
135
+ catch (error) {
136
+ process.stderr.write(`Failed to load chat session catalog from ${paths.catalogPath}: ${error instanceof Error ? error.message : String(error)}\n`);
137
+ return [];
138
+ }
139
+ }
140
+ function loadLegacyChatSessions(sessionsPath, apiKeyPresent) {
48
141
  try {
49
142
  if (!existsSync(sessionsPath)) {
50
- return [
51
- createChatSession({
52
- id: 'session-1',
53
- name: 'Session 1',
54
- apiKeyPresent,
55
- }),
56
- ];
143
+ return [];
57
144
  }
58
145
  const raw = readFileSync(sessionsPath, 'utf8');
59
146
  const parsed = JSON.parse(raw);
60
147
  if (!Array.isArray(parsed)) {
61
148
  throw new Error('Expected session array');
62
149
  }
63
- const sessions = parsed.flatMap((value) => parseSavedSession(value, apiKeyPresent));
64
- if (sessions.length > 0) {
65
- return sessions.sort((left, right) => right.updatedAt.localeCompare(left.updatedAt));
66
- }
150
+ return parsed
151
+ .flatMap((value) => parseSavedSession(value, apiKeyPresent))
152
+ .sort((left, right) => right.updatedAt.localeCompare(left.updatedAt));
67
153
  }
68
154
  catch (error) {
69
155
  process.stderr.write(`Failed to load chat sessions from ${sessionsPath}: ${error instanceof Error ? error.message : String(error)}\n`);
156
+ return [];
70
157
  }
71
- return [
72
- createChatSession({
73
- id: 'session-1',
74
- name: 'Session 1',
75
- apiKeyPresent,
76
- }),
77
- ];
78
158
  }
79
- export function saveChatSessions(sessionsPath, sessions) {
80
- mkdirSync(dirname(sessionsPath), { recursive: true });
81
- writeFileSync(sessionsPath, JSON.stringify(sessions, null, 2));
159
+ function parseCatalog(value) {
160
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
161
+ return undefined;
162
+ }
163
+ const candidate = value;
164
+ if (candidate.version !== 1 || !Array.isArray(candidate.sessions)) {
165
+ return undefined;
166
+ }
167
+ const sessions = candidate.sessions.flatMap(parseCatalogEntry);
168
+ return { version: 1, sessions };
169
+ }
170
+ function parseCatalogEntry(value) {
171
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
172
+ return [];
173
+ }
174
+ const candidate = value;
175
+ if (typeof candidate.id !== 'string' || typeof candidate.name !== 'string') {
176
+ return [];
177
+ }
178
+ const createdAt = typeof candidate.createdAt === 'string' ? candidate.createdAt : new Date().toISOString();
179
+ const updatedAt = typeof candidate.updatedAt === 'string' ? candidate.updatedAt : createdAt;
180
+ return [{
181
+ id: candidate.id,
182
+ name: candidate.name,
183
+ createdAt,
184
+ updatedAt,
185
+ model: typeof candidate.model === 'string' ? candidate.model : undefined,
186
+ driftEnabled: typeof candidate.driftEnabled === 'boolean' ? candidate.driftEnabled : true,
187
+ lastContinuePrompt: typeof candidate.lastContinuePrompt === 'string' ? candidate.lastContinuePrompt : undefined,
188
+ context: isChatContextStats(candidate.context) ? candidate.context : undefined,
189
+ }];
190
+ }
191
+ function projectCatalogEntry(session) {
192
+ return {
193
+ id: session.id,
194
+ name: session.name,
195
+ createdAt: session.createdAt,
196
+ updatedAt: session.updatedAt,
197
+ model: session.model,
198
+ driftEnabled: session.driftEnabled,
199
+ lastContinuePrompt: session.lastContinuePrompt,
200
+ context: session.context,
201
+ };
202
+ }
203
+ function readSessionFile(sessionsDir, entry, apiKeyPresent) {
204
+ const path = sessionFilePath(sessionsDir, entry.id);
205
+ if (!existsSync(path)) {
206
+ return [];
207
+ }
208
+ try {
209
+ const parsed = JSON.parse(readFileSync(path, 'utf8'));
210
+ const payload = readObjectRecord(parsed);
211
+ if (!payload) {
212
+ return [];
213
+ }
214
+ return [{
215
+ id: entry.id,
216
+ name: entry.name,
217
+ createdAt: entry.createdAt,
218
+ updatedAt: entry.updatedAt,
219
+ model: entry.model,
220
+ driftEnabled: entry.driftEnabled,
221
+ lastContinuePrompt: entry.lastContinuePrompt,
222
+ context: entry.context,
223
+ history: Array.isArray(payload.history) ? payload.history : [],
224
+ messages: Array.isArray(payload.messages) && payload.messages.length > 0 ?
225
+ payload.messages.filter(isConversationLine)
226
+ : createInitialMessages(apiKeyPresent),
227
+ turns: Array.isArray(payload.turns) ? payload.turns.filter(isTurnSummary) : [],
228
+ }];
229
+ }
230
+ catch (error) {
231
+ process.stderr.write(`Failed to load chat session file ${path}: ${error instanceof Error ? error.message : String(error)}\n`);
232
+ return [];
233
+ }
234
+ }
235
+ function writeSessionFileIfChanged(sessionsDir, session, previousContent) {
236
+ const path = sessionFilePath(sessionsDir, session.id);
237
+ const nextContent = serializeSessionBody(session);
238
+ if (previousContent === nextContent) {
239
+ return;
240
+ }
241
+ writeFileSync(path, nextContent);
242
+ }
243
+ function writeCatalogIfChanged(catalogPath, catalog, previousCatalog) {
244
+ const nextContent = `${JSON.stringify(catalog, null, 2)}\n`;
245
+ const previousContent = previousCatalog ? `${JSON.stringify(previousCatalog, null, 2)}\n` : undefined;
246
+ if (previousContent === nextContent) {
247
+ return;
248
+ }
249
+ writeFileSync(catalogPath, nextContent);
250
+ }
251
+ function serializeSessionBody(session) {
252
+ return `${JSON.stringify({
253
+ id: session.id,
254
+ history: session.history,
255
+ messages: session.messages,
256
+ turns: session.turns,
257
+ }, null, 2)}\n`;
258
+ }
259
+ function readSessionFileContents(sessionsDir, sessionId) {
260
+ const path = sessionFilePath(sessionsDir, sessionId);
261
+ if (!existsSync(path)) {
262
+ return undefined;
263
+ }
264
+ try {
265
+ return readFileSync(path, 'utf8');
266
+ }
267
+ catch {
268
+ return undefined;
269
+ }
270
+ }
271
+ function readCatalog(catalogPath) {
272
+ if (!existsSync(catalogPath)) {
273
+ return undefined;
274
+ }
275
+ try {
276
+ return parseCatalog(JSON.parse(readFileSync(catalogPath, 'utf8')));
277
+ }
278
+ catch {
279
+ return undefined;
280
+ }
281
+ }
282
+ function dedupeSessionsById(sessions) {
283
+ const seen = new Set();
284
+ const deduped = [];
285
+ for (const session of sessions) {
286
+ if (seen.has(session.id)) {
287
+ continue;
288
+ }
289
+ seen.add(session.id);
290
+ deduped.push(session);
291
+ }
292
+ return deduped;
293
+ }
294
+ function sessionFilePath(sessionsDir, sessionId) {
295
+ return join(sessionsDir, `${sessionId}.json`);
296
+ }
297
+ function removeOrphanedSessionFiles(sessionsDir, activeSessionIds) {
298
+ if (!existsSync(sessionsDir)) {
299
+ return;
300
+ }
301
+ const allowed = new Set(activeSessionIds.map((id) => `${id}.json`));
302
+ for (const name of safeReadDirFiles(sessionsDir)) {
303
+ if (allowed.has(name) || !name.endsWith('.json')) {
304
+ continue;
305
+ }
306
+ unlinkSync(join(sessionsDir, name));
307
+ }
308
+ }
309
+ function safeReadDirFiles(path) {
310
+ try {
311
+ return readdirSync(path);
312
+ }
313
+ catch {
314
+ return [];
315
+ }
82
316
  }
83
317
  function parseSavedSession(value, apiKeyPresent) {
84
318
  if (!value || typeof value !== 'object' || Array.isArray(value)) {
@@ -144,4 +378,7 @@ function isChatContextStats(value) {
144
378
  (candidate.compactedMessages === undefined || typeof candidate.compactedMessages === 'number') &&
145
379
  (candidate.compactedAt === undefined || typeof candidate.compactedAt === 'string'));
146
380
  }
381
+ function readObjectRecord(value) {
382
+ return value && typeof value === 'object' && !Array.isArray(value) ? value : undefined;
383
+ }
147
384
  //# sourceMappingURL=storage.js.map