@x-code-cli/core 0.1.11 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/dist/agent/api-errors.d.ts.map +1 -1
  2. package/dist/agent/api-errors.js +18 -0
  3. package/dist/agent/api-errors.js.map +1 -1
  4. package/dist/agent/diff.d.ts +35 -0
  5. package/dist/agent/diff.d.ts.map +1 -0
  6. package/dist/agent/diff.js +83 -0
  7. package/dist/agent/diff.js.map +1 -0
  8. package/dist/agent/loop-state.d.ts +45 -3
  9. package/dist/agent/loop-state.d.ts.map +1 -1
  10. package/dist/agent/loop-state.js +24 -3
  11. package/dist/agent/loop-state.js.map +1 -1
  12. package/dist/agent/loop.d.ts +10 -6
  13. package/dist/agent/loop.d.ts.map +1 -1
  14. package/dist/agent/loop.js +212 -30
  15. package/dist/agent/loop.js.map +1 -1
  16. package/dist/agent/plan-storage.d.ts +55 -0
  17. package/dist/agent/plan-storage.d.ts.map +1 -0
  18. package/dist/agent/plan-storage.js +156 -0
  19. package/dist/agent/plan-storage.js.map +1 -0
  20. package/dist/agent/session-store.d.ts +114 -0
  21. package/dist/agent/session-store.d.ts.map +1 -0
  22. package/dist/agent/session-store.js +415 -0
  23. package/dist/agent/session-store.js.map +1 -0
  24. package/dist/agent/sub-agents/built-in.d.ts +3 -0
  25. package/dist/agent/sub-agents/built-in.d.ts.map +1 -0
  26. package/dist/agent/sub-agents/built-in.js +98 -0
  27. package/dist/agent/sub-agents/built-in.js.map +1 -0
  28. package/dist/agent/sub-agents/index.d.ts +7 -0
  29. package/dist/agent/sub-agents/index.d.ts.map +1 -0
  30. package/dist/agent/sub-agents/index.js +5 -0
  31. package/dist/agent/sub-agents/index.js.map +1 -0
  32. package/dist/agent/sub-agents/loader.d.ts +5 -0
  33. package/dist/agent/sub-agents/loader.d.ts.map +1 -0
  34. package/dist/agent/sub-agents/loader.js +117 -0
  35. package/dist/agent/sub-agents/loader.js.map +1 -0
  36. package/dist/agent/sub-agents/registry.d.ts +14 -0
  37. package/dist/agent/sub-agents/registry.d.ts.map +1 -0
  38. package/dist/agent/sub-agents/registry.js +37 -0
  39. package/dist/agent/sub-agents/registry.js.map +1 -0
  40. package/dist/agent/sub-agents/runner.d.ts +26 -0
  41. package/dist/agent/sub-agents/runner.d.ts.map +1 -0
  42. package/dist/agent/sub-agents/runner.js +287 -0
  43. package/dist/agent/sub-agents/runner.js.map +1 -0
  44. package/dist/agent/sub-agents/types.d.ts +63 -0
  45. package/dist/agent/sub-agents/types.d.ts.map +1 -0
  46. package/dist/agent/sub-agents/types.js +2 -0
  47. package/dist/agent/sub-agents/types.js.map +1 -0
  48. package/dist/agent/system-prompt.d.ts +15 -0
  49. package/dist/agent/system-prompt.d.ts.map +1 -1
  50. package/dist/agent/system-prompt.js +161 -0
  51. package/dist/agent/system-prompt.js.map +1 -1
  52. package/dist/agent/tool-execution.d.ts +4 -3
  53. package/dist/agent/tool-execution.d.ts.map +1 -1
  54. package/dist/agent/tool-execution.js +316 -14
  55. package/dist/agent/tool-execution.js.map +1 -1
  56. package/dist/agent/tool-result-sanitize.d.ts +12 -0
  57. package/dist/agent/tool-result-sanitize.d.ts.map +1 -1
  58. package/dist/agent/tool-result-sanitize.js +70 -0
  59. package/dist/agent/tool-result-sanitize.js.map +1 -1
  60. package/dist/config/index.d.ts +6 -0
  61. package/dist/config/index.d.ts.map +1 -1
  62. package/dist/config/index.js.map +1 -1
  63. package/dist/index.d.ts +11 -5
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +10 -3
  66. package/dist/index.js.map +1 -1
  67. package/dist/knowledge/session.d.ts +4 -7
  68. package/dist/knowledge/session.d.ts.map +1 -1
  69. package/dist/knowledge/session.js +20 -55
  70. package/dist/knowledge/session.js.map +1 -1
  71. package/dist/permissions/index.d.ts +18 -3
  72. package/dist/permissions/index.d.ts.map +1 -1
  73. package/dist/permissions/index.js +20 -2
  74. package/dist/permissions/index.js.map +1 -1
  75. package/dist/tools/ask-user.d.ts.map +1 -1
  76. package/dist/tools/ask-user.js +8 -6
  77. package/dist/tools/ask-user.js.map +1 -1
  78. package/dist/tools/enter-plan-mode.d.ts +25 -0
  79. package/dist/tools/enter-plan-mode.d.ts.map +1 -0
  80. package/dist/tools/enter-plan-mode.js +120 -0
  81. package/dist/tools/enter-plan-mode.js.map +1 -0
  82. package/dist/tools/exit-plan-mode.d.ts +13 -0
  83. package/dist/tools/exit-plan-mode.d.ts.map +1 -0
  84. package/dist/tools/exit-plan-mode.js +22 -0
  85. package/dist/tools/exit-plan-mode.js.map +1 -0
  86. package/dist/tools/grep.d.ts +1 -1
  87. package/dist/tools/index.d.ts +20 -4
  88. package/dist/tools/index.d.ts.map +1 -1
  89. package/dist/tools/index.js +7 -1
  90. package/dist/tools/index.js.map +1 -1
  91. package/dist/tools/save-knowledge.d.ts +2 -2
  92. package/dist/tools/shell-provider.d.ts +4 -0
  93. package/dist/tools/shell-provider.d.ts.map +1 -1
  94. package/dist/tools/shell-provider.js +2 -0
  95. package/dist/tools/shell-provider.js.map +1 -1
  96. package/dist/tools/task.d.ts +14 -0
  97. package/dist/tools/task.d.ts.map +1 -0
  98. package/dist/tools/task.js +95 -0
  99. package/dist/tools/task.js.map +1 -0
  100. package/dist/tools/todo-write.d.ts +21 -0
  101. package/dist/tools/todo-write.d.ts.map +1 -0
  102. package/dist/tools/todo-write.js +117 -0
  103. package/dist/tools/todo-write.js.map +1 -0
  104. package/dist/types/index.d.ts +103 -0
  105. package/dist/types/index.d.ts.map +1 -1
  106. package/dist/types/index.js.map +1 -1
  107. package/package.json +1 -1
  108. package/dist/knowledge/session-usage.d.ts +0 -24
  109. package/dist/knowledge/session-usage.d.ts.map +0 -1
  110. package/dist/knowledge/session-usage.js +0 -86
  111. package/dist/knowledge/session-usage.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"api-errors.d.ts","sourceRoot":"","sources":["../../src/agent/api-errors.ts"],"names":[],"mappings":"AAaA,wEAAwE;AACxE,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGrD;AAED,oFAAoF;AACpF,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAM3D;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,OAAO,CAAA;CACnB;AA2FD,sEAAsE;AACtE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,eAAe,CAiF9D"}
1
+ {"version":3,"file":"api-errors.d.ts","sourceRoot":"","sources":["../../src/agent/api-errors.ts"],"names":[],"mappings":"AAaA,wEAAwE;AACxE,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGrD;AAED,oFAAoF;AACpF,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAM3D;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,OAAO,CAAA;CACnB;AA0GD,sEAAsE;AACtE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,eAAe,CAwF9D"}
@@ -70,6 +70,18 @@ function isTypeValidationError(err, msg) {
70
70
  return ((err instanceof Error && err.constructor.name === 'AI_TypeValidationError') ||
71
71
  msg.includes('Type validation failed'));
72
72
  }
73
+ /** Provider rejection due to malformed tool_call ↔ tool_result pairing
74
+ * in the message history. Most often surfaces against DeepSeek with a
75
+ * specific wording; OpenAI and others have variants. The
76
+ * `repairOrphanToolCalls` sweep in `runTurn` should prevent this from
77
+ * happening — but if it leaks through (or for older session state),
78
+ * surface a directly actionable message instead of the raw provider
79
+ * dump. */
80
+ function isMalformedToolHistoryError(msg) {
81
+ return (msg.includes("Messages with role 'tool' must be a response to a preceding message with 'tool_calls'") ||
82
+ msg.includes('tool_calls and tool_call_ids') ||
83
+ msg.includes('tool_call_id'));
84
+ }
73
85
  /** Pull a provider name out of "Anthropic API key is missing" → "Anthropic". */
74
86
  function extractProviderName(msg) {
75
87
  const m = msg.match(/^(\w+)\s+API key/i);
@@ -172,6 +184,12 @@ export function classifyApiError(err) {
172
184
  retryable: false,
173
185
  };
174
186
  }
187
+ if (isMalformedToolHistoryError(msg)) {
188
+ return {
189
+ message: 'Conversation history has an orphan tool call (model emitted a malformed tool input that the SDK rejected). The next turn will auto-repair, but if this keeps happening you can /clear to reset the conversation.',
190
+ retryable: false,
191
+ };
192
+ }
175
193
  return { message: msg, retryable: false };
176
194
  }
177
195
  //# sourceMappingURL=api-errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"api-errors.js","sourceRoot":"","sources":["../../src/agent/api-errors.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api-errors.js","sourceRoot":"","sources":["../../src/agent/api-errors.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAElE,8EAA8E;AAC9E,MAAM,yBAAyB,GAAG;IAChC,wBAAwB;IACxB,yBAAyB;IACzB,aAAa;IACb,oBAAoB;IACpB,iBAAiB;IACjB,cAAc;IACd,gBAAgB;CACR,CAAA;AAEV,wEAAwE;AACxE,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,mCAAmC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;IACnH,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AACrC,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,qBAAqB,CAAC,GAAY;IAChD,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IAC5D,KAAK,MAAM,OAAO,IAAI,yBAAyB,EAAE,CAAC;QAChD,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,CAAA;IACxC,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAOD,4EAA4E;AAC5E,0EAA0E;AAC1E,yEAAyE;AACzE,0EAA0E;AAE1E,SAAS,uBAAuB,CAAC,GAAW;IAC1C,qEAAqE;IACrE,8DAA8D;IAC9D,OAAO,GAAG,CAAC,QAAQ,CAAC,6BAA6B,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAA;AACzF,CAAC;AAED,SAAS,oBAAoB,CAAC,GAAW;IACvC,OAAO,GAAG,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;AACtE,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAW,EAAE,MAAc;IACtD,OAAO,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAA;AAC1F,CAAC;AAED,SAAS,0BAA0B,CAAC,GAAW,EAAE,MAAc;IAC7D,OAAO,CACL,MAAM,KAAK,GAAG;QACd,GAAG,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QACpC,GAAG,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QACpC,GAAG,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QAClC,GAAG,CAAC,QAAQ,CAAC,6BAA6B,CAAC,CAC5C,CAAA;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW,EAAE,MAAc;IACnD,OAAO,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;AACpD,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW;IACnC,IAAI,GAAG,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,qBAAqB,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAClH,OAAO,IAAI,CAAA;IACb,CAAC;IACD,+EAA+E;IAC/E,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC;QAAE,OAAO,KAAK,CAAA;IAC7C,OAAO,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACnC,CAAC;AAED,SAAS,yBAAyB,CAAC,GAAW,EAAE,MAAc;IAC5D,OAAO,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,qBAAqB,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;AAC5F,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAW,EAAE,MAAc;IACrD,OAAO,MAAM,KAAK,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAClD,CAAC;AAED,SAAS,cAAc,CAAC,GAAW;IACjC,OAAO,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;AAC3F,CAAC;AAED,SAAS,qBAAqB,CAAC,GAAY,EAAE,GAAW;IACtD,OAAO,CACL,CAAC,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,WAAW,CAAC,IAAI,KAAK,wBAAwB,CAAC;QAC3E,GAAG,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CACvC,CAAA;AACH,CAAC;AAED;;;;;;YAMY;AACZ,SAAS,2BAA2B,CAAC,GAAW;IAC9C,OAAO,CACL,GAAG,CAAC,QAAQ,CAAC,uFAAuF,CAAC;QACrG,GAAG,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QAC5C,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,CAC7B,CAAA;AACH,CAAC;AAED,gFAAgF;AAChF,SAAS,mBAAmB,CAAC,GAAW;IACtC,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAA;IACxC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,UAAU,CAAA;AAC/B,CAAC;AAED;;;;;;GAMG;AACH,SAAS,mBAAmB,CAAC,GAAY;IACvC,IAAI,CAAC,CAAC,GAAG,YAAY,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAA;IAC/C,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAA;IACvB,wEAAwE;IACxE,MAAM,GAAG,GAAI,GAA0C,CAAC,KAAK,CAAA;IAC7D,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACnC,MAAM,KAAK,GAAI,GAA+B,CAAC,KAAK,CAAA;QACpD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvC,MAAM,QAAQ,GAAI,KAAgC,CAAC,OAAO,CAAA;YAC1D,IAAI,OAAO,QAAQ,KAAK,QAAQ;gBAAE,OAAO,QAAQ,CAAA;QACnD,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,MAAM,GAAG,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAA;IACpC,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAA;IAErC,IAAI,qBAAqB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/B,OAAO;YACL,OAAO,EACL,mIAAmI;YACrI,SAAS,EAAE,KAAK;SACjB,CAAA;IACH,CAAC;IACD,IAAI,uBAAuB,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC,OAAO;YACL,OAAO,EACL,4JAA4J;YAC9J,SAAS,EAAE,KAAK;SACjB,CAAA;IACH,CAAC;IACD,IAAI,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAA;QACzC,OAAO;YACL,OAAO,EAAE,GAAG,QAAQ,gFAAgF,QAAQ,CAAC,WAAW,EAAE,YAAY;YACtI,SAAS,EAAE,KAAK;SACjB,CAAA;IACH,CAAC;IACD,IAAI,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC;QACrC,OAAO;YACL,OAAO,EAAE,uGAAuG;YAChH,SAAS,EAAE,KAAK;SACjB,CAAA;IACH,CAAC;IACD,IAAI,0BAA0B,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC;QAC5C,OAAO;YACL,OAAO,EACL,sHAAsH;YACxH,SAAS,EAAE,KAAK;SACjB,CAAA;IACH,CAAC;IACD,IAAI,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC;QAClC,OAAO;YACL,OAAO,EAAE,kFAAkF;YAC3F,SAAS,EAAE,KAAK;SACjB,CAAA;IACH,CAAC;IACD,IAAI,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO;YACL,OAAO,EACL,gKAAgK;YAClK,SAAS,EAAE,KAAK;SACjB,CAAA;IACH,CAAC;IACD,IAAI,yBAAyB,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC;QAC3C,OAAO;YACL,OAAO,EAAE,kFAAkF;YAC3F,SAAS,EAAE,KAAK;SACjB,CAAA;IACH,CAAC;IACD,IAAI,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC;QACpC,OAAO;YACL,OAAO,EACL,gHAAgH;YAClH,SAAS,EAAE,IAAI;SAChB,CAAA;IACH,CAAC;IACD,IAAI,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO;YACL,OAAO,EAAE,kBAAkB,GAAG,eAAe;YAC7C,SAAS,EAAE,IAAI;SAChB,CAAA;IACH,CAAC;IACD,yEAAyE;IACzE,uEAAuE;IACvE,oEAAoE;IACpE,IAAI,qBAAqB,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;QACpC,OAAO;YACL,OAAO,EAAE,+BAA+B,GAAG,sCAAsC;YACjF,SAAS,EAAE,KAAK;SACjB,CAAA;IACH,CAAC;IACD,IAAI,2BAA2B,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,OAAO;YACL,OAAO,EACL,kNAAkN;YACpN,SAAS,EAAE,KAAK;SACjB,CAAA;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,CAAA;AAC3C,CAAC"}
@@ -0,0 +1,35 @@
1
+ /** One contiguous diff hunk. Mirrors `diff` package's `StructuredPatchHunk`
2
+ * shape but redefined here so consumers don't need a `diff` peer dep just
3
+ * to type the payload. Each entry in `lines` carries a leading sigil
4
+ * character: `' '` (context), `'+'` (added), `'-'` (removed). */
5
+ export interface EditDiffHunk {
6
+ oldStart: number;
7
+ oldLines: number;
8
+ newStart: number;
9
+ newLines: number;
10
+ lines: string[];
11
+ }
12
+ export interface EditDiffPayload {
13
+ filePath: string;
14
+ hunks: EditDiffHunk[];
15
+ additions: number;
16
+ removals: number;
17
+ /** True when the file did not exist before the write — used by the UI to
18
+ * flip the header from "Added X lines, removed Y" to "Created N lines"
19
+ * and render a content preview instead of an (empty) hunk list. */
20
+ isCreate: boolean;
21
+ /** Full new file content. Populated for create payloads so the UI can
22
+ * render the first ~10 lines as a preview under the "Created N lines"
23
+ * header (matching Claude Code's FileWriteToolCreatedMessage). Left
24
+ * undefined for update payloads — there's already a hunk list to show. */
25
+ content?: string;
26
+ }
27
+ /**
28
+ * Build a structured patch + counts for a single file change. Returns
29
+ * `null` when no actual change was made (writeFile with identical content)
30
+ * so callers can elide the diff display entirely. For brand-new files pass
31
+ * `oldContent: null` — the helper still computes a hunk-less payload with
32
+ * `additions = lineCount(newContent)`.
33
+ */
34
+ export declare function computeEditDiff(filePath: string, oldContent: string | null, newContent: string): EditDiffPayload | null;
35
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/agent/diff.ts"],"names":[],"mappings":"AAYA;;;kEAGkE;AAClE,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,YAAY,EAAE,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB;;wEAEoE;IACpE,QAAQ,EAAE,OAAO,CAAA;IACjB;;;+EAG2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAKD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,UAAU,EAAE,MAAM,GACjB,eAAe,GAAG,IAAI,CA8CxB"}
@@ -0,0 +1,83 @@
1
+ // @x-code-cli/core — Edit-tool diff payload.
2
+ //
3
+ // Computed by tool-execution after a successful writeFile / edit, and
4
+ // emitted to the UI via AgentCallbacks.onFileEdit so the scrollback row
5
+ // can render a colored diff block under the tool bullet (matching
6
+ // Claude Code's `Update(file)` → `Added X lines, removed Y` view).
7
+ //
8
+ // The model still sees only the short result string from executeWriteTool
9
+ // (`File edited: ...`) — the diff payload is a UI-side side channel and
10
+ // never round-trips through state.messages.
11
+ import { structuredPatch } from 'diff';
12
+ const CONTEXT_LINES = 3;
13
+ const DIFF_TIMEOUT_MS = 5_000;
14
+ /**
15
+ * Build a structured patch + counts for a single file change. Returns
16
+ * `null` when no actual change was made (writeFile with identical content)
17
+ * so callers can elide the diff display entirely. For brand-new files pass
18
+ * `oldContent: null` — the helper still computes a hunk-less payload with
19
+ * `additions = lineCount(newContent)`.
20
+ */
21
+ export function computeEditDiff(filePath, oldContent, newContent) {
22
+ if (oldContent === null) {
23
+ return {
24
+ filePath,
25
+ hunks: [],
26
+ additions: countLines(newContent),
27
+ removals: 0,
28
+ isCreate: true,
29
+ content: newContent,
30
+ };
31
+ }
32
+ if (oldContent === newContent)
33
+ return null;
34
+ const result = structuredPatch(filePath, filePath, oldContent, newContent, undefined, undefined, {
35
+ context: CONTEXT_LINES,
36
+ timeout: DIFF_TIMEOUT_MS,
37
+ });
38
+ // structuredPatch returns `false`-y on timeout. The change really did
39
+ // happen on disk; we just don't have a hunk view, so fall back to a
40
+ // counts-only summary derived line-by-line. Better than dropping the
41
+ // payload (UI would silently skip the diff block).
42
+ const hunks = result?.hunks ? result.hunks.map(toHunk) : [];
43
+ let additions = 0;
44
+ let removals = 0;
45
+ for (const h of hunks) {
46
+ for (const line of h.lines) {
47
+ if (line.startsWith('+'))
48
+ additions++;
49
+ else if (line.startsWith('-'))
50
+ removals++;
51
+ }
52
+ }
53
+ if (additions === 0 && removals === 0 && hunks.length === 0) {
54
+ // Timed-out diff with no hunks — count lines manually so the header
55
+ // still makes sense. Approximation: max(0, newLines - oldLines) added,
56
+ // and max(0, oldLines - newLines) removed. Not accurate for a pure
57
+ // replace, but honest given we couldn't compute a real diff.
58
+ const oldLines = countLines(oldContent);
59
+ const newLines = countLines(newContent);
60
+ additions = Math.max(0, newLines - oldLines);
61
+ removals = Math.max(0, oldLines - newLines);
62
+ }
63
+ return { filePath, hunks, additions, removals, isCreate: false };
64
+ }
65
+ function toHunk(h) {
66
+ return {
67
+ oldStart: h.oldStart,
68
+ oldLines: h.oldLines,
69
+ newStart: h.newStart,
70
+ newLines: h.newLines,
71
+ lines: h.lines,
72
+ };
73
+ }
74
+ /** Count visible lines, treating a single trailing `\n` as a terminator
75
+ * (matches how editors number lines: a 3-line file is 3 lines whether or
76
+ * not it ends in a newline). */
77
+ function countLines(s) {
78
+ if (s.length === 0)
79
+ return 0;
80
+ const parts = s.split('\n');
81
+ return s.endsWith('\n') ? parts.length - 1 : parts.length;
82
+ }
83
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/agent/diff.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { ModelMessage } from 'ai';
2
- import type { TokenUsage } from '../types/index.js';
2
+ import type { PermissionMode, TodoItem, TokenUsage } from '../types/index.js';
3
3
  export interface LoopState {
4
4
  messages: ModelMessage[];
5
5
  tokenUsage: TokenUsage;
@@ -18,8 +18,50 @@ export interface LoopState {
18
18
  }>;
19
19
  /** Cached system prompt text — rebuilt once per session so the prefix
20
20
  * stays byte-stable across turns, enabling automatic prefix-caching on
21
- * OpenAI-compatible providers (DeepSeek, Moonshot, Alibaba, …). */
21
+ * OpenAI-compatible providers (DeepSeek, Moonshot, Alibaba, …).
22
+ * Invalidated (set to null) on `permissionMode` change so the next turn
23
+ * rebuilds it with / without the plan-mode overlay. */
22
24
  systemPromptCache: string | null;
25
+ /** Current approval mode — flips between 'default' and 'plan' via
26
+ * Shift+Tab (user) or the enterPlanMode/exitPlanMode tools (model).
27
+ * Read by tool-execution to decide which system prompt overlay
28
+ * applies and which tools are advertised. */
29
+ permissionMode: PermissionMode;
30
+ /** Path to the plan file when in plan mode (`.x-code/plans/{sessionId}.md`),
31
+ * null otherwise. Created lazily the first time the model calls
32
+ * `enterPlanMode` and re-used for the remainder of that plan-mode
33
+ * session. Cleared on exit. */
34
+ currentPlanPath: string | null;
35
+ /** Lowercase-hyphen slug derived from the user's first message, used
36
+ * to give session-usage files a human-skimmable name (mirrors how
37
+ * plan files are named). Empty string when the first message had no
38
+ * ASCII content (e.g. CJK-only) — session file then falls back to
39
+ * pure timestamp. Set ONCE on the first agentLoop turn and never
40
+ * changed; renaming mid-session would orphan the previous turn's
41
+ * on-disk usage file. */
42
+ taskSlug: string;
43
+ /** Current checklist maintained by the model via the `todoWrite`
44
+ * tool. Full-replacement semantics — every todoWrite call rewrites
45
+ * this array. In-memory only, never persisted. Auto-cleared back
46
+ * to [] when the model submits a list with all items completed.
47
+ * Survives `/clear` (matches Claude Code) so a multi-feature
48
+ * checklist isn't wiped by an unrelated context reset. */
49
+ todos: TodoItem[];
50
+ /** Number of messages already persisted to the session jsonl file.
51
+ * The agent loop calls `flushPendingMessages` at turn boundaries,
52
+ * which appends `state.messages.slice(persistedMessageCount)` and
53
+ * bumps the counter. Reset to `state.messages.length` after any
54
+ * compaction (light or deep) — those rewritten messages get
55
+ * re-flushed after a `compact-boundary` line so the loader's
56
+ * "everything-after-last-boundary wins" rule reconstructs the same
57
+ * in-memory state on resume. See `agent/session-store.ts`. */
58
+ persistedMessageCount: number;
59
+ /** Cached knowledge context for sub-agent system prompts. Set once in
60
+ * agentLoop after buildKnowledgeContext resolves; transparent to
61
+ * sub-agent loops (they don't call buildKnowledgeContext themselves). */
62
+ knowledgeContext?: string;
63
+ /** Whether cwd is a git repo. Cached for sub-agent system prompts. */
64
+ isGitRepo?: boolean;
23
65
  }
24
- export declare function createLoopState(): LoopState;
66
+ export declare function createLoopState(initialMode?: PermissionMode): LoopState;
25
67
  //# sourceMappingURL=loop-state.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"loop-state.d.ts","sourceRoot":"","sources":["../../src/agent/loop-state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AAEtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAEnD,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,YAAY,EAAE,CAAA;IACxB,UAAU,EAAE,UAAU,CAAA;IACtB,6FAA6F;IAC7F,eAAe,EAAE,MAAM,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB;;qEAEiE;IACjE,eAAe,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC1D;;wEAEoE;IACpE,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;CACjC;AAED,wBAAgB,eAAe,IAAI,SAAS,CAY3C"}
1
+ {"version":3,"file":"loop-state.d.ts","sourceRoot":"","sources":["../../src/agent/loop-state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AAEtC,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAE7E,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,YAAY,EAAE,CAAA;IACxB,UAAU,EAAE,UAAU,CAAA;IACtB,6FAA6F;IAC7F,eAAe,EAAE,MAAM,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB;;qEAEiE;IACjE,eAAe,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC1D;;;;4DAIwD;IACxD,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC;;;kDAG8C;IAC9C,cAAc,EAAE,cAAc,CAAA;IAC9B;;;oCAGgC;IAChC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B;;;;;;8BAM0B;IAC1B,QAAQ,EAAE,MAAM,CAAA;IAChB;;;;;+DAK2D;IAC3D,KAAK,EAAE,QAAQ,EAAE,CAAA;IACjB;;;;;;;mEAO+D;IAC/D,qBAAqB,EAAE,MAAM,CAAA;IAI7B;;8EAE0E;IAC1E,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,sEAAsE;IACtE,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAiBD,wBAAgB,eAAe,CAAC,WAAW,GAAE,cAA0B,GAAG,SAAS,CAqBlF"}
@@ -1,14 +1,35 @@
1
- export function createLoopState() {
1
+ /** Generate a human-skimmable session id: `YYYYMMDD-HHMMSS-mmm` (local
2
+ * time, milliseconds tail for uniqueness across rapid successive
3
+ * starts). Replaces the old `Date.now().toString(36)` (`mohbm95d`)
4
+ * which was unreadable in `ls .x-code/sessions/` — the timestamp shape
5
+ * matches plan-file naming so the two directory listings sort and
6
+ * scan the same way. */
7
+ function generateSessionId(now = new Date()) {
8
+ const pad = (n, w = 2) => String(n).padStart(w, '0');
9
+ return (`${now.getFullYear()}${pad(now.getMonth() + 1)}${pad(now.getDate())}` +
10
+ `-${pad(now.getHours())}${pad(now.getMinutes())}${pad(now.getSeconds())}` +
11
+ `-${pad(now.getMilliseconds(), 3)}`);
12
+ }
13
+ export function createLoopState(initialMode = 'default') {
2
14
  return {
3
15
  messages: [],
4
- tokenUsage: { inputTokens: 0, outputTokens: 0, totalTokens: 0, cacheReadTokens: 0, cacheCreationTokens: 0 },
16
+ tokenUsage: { inputTokens: 0, outputTokens: 0, totalTokens: 0, cacheReadTokens: 0, cacheCreationTokens: 0, currentContextTokens: 0 },
5
17
  lastInputTokens: 0,
6
- sessionId: Date.now().toString(36),
18
+ sessionId: generateSessionId(),
7
19
  startedAt: new Date().toISOString(),
8
20
  filesModified: new Set(),
9
21
  turnCount: 0,
10
22
  recentToolCalls: [],
11
23
  systemPromptCache: null,
24
+ permissionMode: initialMode,
25
+ // Plan path is derived LAZILY from the user's task text once a
26
+ // message lands — done in agentLoop / enterPlanMode handler. We
27
+ // can't slugify here because the user's intent isn't visible at
28
+ // session-construction time.
29
+ currentPlanPath: null,
30
+ taskSlug: '',
31
+ todos: [],
32
+ persistedMessageCount: 0,
12
33
  };
13
34
  }
14
35
  //# sourceMappingURL=loop-state.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"loop-state.js","sourceRoot":"","sources":["../../src/agent/loop-state.ts"],"names":[],"mappings":"AAwBA,MAAM,UAAU,eAAe;IAC7B,OAAO;QACL,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,mBAAmB,EAAE,CAAC,EAAE;QAC3G,eAAe,EAAE,CAAC;QAClB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,aAAa,EAAE,IAAI,GAAG,EAAE;QACxB,SAAS,EAAE,CAAC;QACZ,eAAe,EAAE,EAAE;QACnB,iBAAiB,EAAE,IAAI;KACxB,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"loop-state.js","sourceRoot":"","sources":["../../src/agent/loop-state.ts"],"names":[],"mappings":"AAqEA;;;;;yBAKyB;AACzB,SAAS,iBAAiB,CAAC,MAAY,IAAI,IAAI,EAAE;IAC/C,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAC5D,OAAO,CACL,GAAG,GAAG,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,EAAE;QACrE,IAAI,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,EAAE;QACzE,IAAI,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,EAAE,CACpC,CAAA;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,cAA8B,SAAS;IACrE,OAAO;QACL,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,mBAAmB,EAAE,CAAC,EAAE,oBAAoB,EAAE,CAAC,EAAE;QACpI,eAAe,EAAE,CAAC;QAClB,SAAS,EAAE,iBAAiB,EAAE;QAC9B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,aAAa,EAAE,IAAI,GAAG,EAAE;QACxB,SAAS,EAAE,CAAC;QACZ,eAAe,EAAE,EAAE;QACnB,iBAAiB,EAAE,IAAI;QACvB,cAAc,EAAE,WAAW;QAC3B,+DAA+D;QAC/D,gEAAgE;QAChE,gEAAgE;QAChE,6BAA6B;QAC7B,eAAe,EAAE,IAAI;QACrB,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,EAAE;QACT,qBAAqB,EAAE,CAAC;KACzB,CAAA;AACH,CAAC"}
@@ -6,10 +6,14 @@ export type { LoopState } from './loop-state.js';
6
6
  export declare function compressMessages(messages: ModelMessage[], model: LanguageModel): Promise<ModelMessage[]>;
7
7
  /** Main agent loop. */
8
8
  export declare function agentLoop(userMessage: UserContent, model: LanguageModel, options: AgentOptions, callbacks: AgentCallbacks, existingState?: LoopState): Promise<LoopState>;
9
- /** Save session on exit. Summary generation makes an LLM call that can be
10
- * slow, so we bound it with a 2s timeout on Ctrl+C we want to return
11
- * to the shell promptly, not wait for a roundtrip. If the timeout fires
12
- * or the call fails, we silently skip (session summaries are nice-to-have,
13
- * not critical for exit). */
14
- export declare function saveSession(state: LoopState, model: LanguageModel, timeoutMs?: number): Promise<void>;
9
+ /** Sync any in-memory messages to the session jsonl. Called on exit /
10
+ * cleanup paths so a process kill doesn't lose the last turn. Per-turn
11
+ * appends already happen during agentLoop this is the safety-net
12
+ * drain for whatever is left. Tolerant of a half-initialized state
13
+ * (no taskSlug yet etc.); flushPendingMessages no-ops when there's
14
+ * nothing to write. The `model` parameter is kept for API stability
15
+ * with the previous summary-generating implementation but is unused
16
+ * here — summaries now ride along on `compact-boundary` lines, not
17
+ * on a separate exit-time call. */
18
+ export declare function saveSession(state: LoopState, _model: LanguageModel): Promise<void>;
15
19
  //# sourceMappingURL=loop.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"loop.d.ts","sourceRoot":"","sources":["../../src/agent/loop.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,IAAI,CAAA;AASlE,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAMrE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAQhD,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAKhD,4CAA4C;AAC5C,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAc9G;AAsPD,uBAAuB;AACvB,wBAAsB,SAAS,CAC7B,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,YAAY,EACrB,SAAS,EAAE,cAAc,EACzB,aAAa,CAAC,EAAE,SAAS,GACxB,OAAO,CAAC,SAAS,CAAC,CA2GpB;AAED;;;;8BAI8B;AAC9B,wBAAsB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,SAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBzG"}
1
+ {"version":3,"file":"loop.d.ts","sourceRoot":"","sources":["../../src/agent/loop.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,IAAI,CAAA;AASlE,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AA6BrE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAQhD,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAKhD,4CAA4C;AAC5C,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAc9G;AAwVD,uBAAuB;AACvB,wBAAsB,SAAS,CAC7B,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,YAAY,EACrB,SAAS,EAAE,cAAc,EACzB,aAAa,CAAC,EAAE,SAAS,GACxB,OAAO,CAAC,SAAS,CAAC,CA4LpB;AAED;;;;;;;;oCAQoC;AACpC,wBAAsB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAExF"}