@gajae-code/coding-agent 0.11.3 → 0.11.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 (213) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/dist/types/cli/notify-cli.d.ts +5 -1
  3. package/dist/types/cli/worktree-cli.d.ts +8 -25
  4. package/dist/types/commands/gc.d.ts +4 -0
  5. package/dist/types/commands/worktree.d.ts +7 -32
  6. package/dist/types/config/settings-schema.d.ts +20 -0
  7. package/dist/types/export/html/template.generated.d.ts +1 -1
  8. package/dist/types/gjc-runtime/deep-interview-state.d.ts +28 -0
  9. package/dist/types/gjc-runtime/gc-runtime.d.ts +9 -0
  10. package/dist/types/gjc-runtime/launch-tmux.d.ts +3 -0
  11. package/dist/types/gjc-runtime/managed-owner-admission.d.ts +42 -0
  12. package/dist/types/gjc-runtime/managed-owner-supervisor.d.ts +41 -0
  13. package/dist/types/gjc-runtime/state-argv.d.ts +38 -0
  14. package/dist/types/gjc-runtime/tmux-owner-isolation.d.ts +9 -0
  15. package/dist/types/gjc-runtime/ultragoal-owner-loss-recovery.d.ts +94 -0
  16. package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +1 -0
  17. package/dist/types/harness-control-plane/owner.d.ts +3 -1
  18. package/dist/types/internal-urls/local-protocol.d.ts +18 -0
  19. package/dist/types/main.d.ts +2 -2
  20. package/dist/types/modes/components/ansi-display-validator.d.ts +2 -0
  21. package/dist/types/modes/components/custom-editor.d.ts +8 -3
  22. package/dist/types/modes/components/notifications-settings-editor.d.ts +4 -0
  23. package/dist/types/modes/components/session-observer-overlay.d.ts +3 -1
  24. package/dist/types/modes/components/settings-selector.d.ts +2 -0
  25. package/dist/types/modes/components/tool-transcript-format.d.ts +77 -0
  26. package/dist/types/modes/components/transcript-viewer-overlay.d.ts +3 -0
  27. package/dist/types/modes/controllers/goal-mode-controller.d.ts +8 -1
  28. package/dist/types/modes/controllers/input-controller.d.ts +8 -2
  29. package/dist/types/modes/controllers/selector-controller.d.ts +15 -0
  30. package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +3 -0
  31. package/dist/types/modes/shared/agent-wire/workflow-gate-types.d.ts +16 -0
  32. package/dist/types/plan-mode/approved-plan.d.ts +1 -0
  33. package/dist/types/runtime-mcp/manager.d.ts +2 -0
  34. package/dist/types/runtime-mcp/oauth-discovery.d.ts +12 -1
  35. package/dist/types/sdk/broker/broker.d.ts +1 -0
  36. package/dist/types/sdk/broker/discovery.d.ts +10 -0
  37. package/dist/types/sdk/broker/ensure.d.ts +24 -1
  38. package/dist/types/sdk/broker/internal.d.ts +3 -0
  39. package/dist/types/sdk/broker/session-index.d.ts +12 -0
  40. package/dist/types/sdk/broker/state-version.d.ts +2 -1
  41. package/dist/types/sdk/bus/chat-daemon-cli.d.ts +3 -1
  42. package/dist/types/sdk/bus/chat-daemon-control.d.ts +39 -4
  43. package/dist/types/sdk/bus/config-commands.d.ts +8 -0
  44. package/dist/types/sdk/bus/config.d.ts +22 -0
  45. package/dist/types/sdk/bus/index.d.ts +162 -2
  46. package/dist/types/sdk/bus/notification-service.d.ts +71 -8
  47. package/dist/types/sdk/bus/session-control.d.ts +11 -8
  48. package/dist/types/sdk/bus/telegram-daemon-cli.d.ts +5 -0
  49. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +6 -3
  50. package/dist/types/sdk/bus/telegram-daemon-control.d.ts +23 -4
  51. package/dist/types/sdk/bus/telegram-daemon.d.ts +214 -20
  52. package/dist/types/sdk/session.d.ts +16 -1
  53. package/dist/types/secrets/index.d.ts +4 -2
  54. package/dist/types/secrets/obfuscator.d.ts +1 -1
  55. package/dist/types/session/agent-session.d.ts +31 -2
  56. package/dist/types/session/artifacts.d.ts +30 -8
  57. package/dist/types/session/internal/managed-session-scope.d.ts +7 -0
  58. package/dist/types/session/internal/managed-session-storage.d.ts +63 -6
  59. package/dist/types/session/session-manager.d.ts +88 -18
  60. package/dist/types/session/session-storage.d.ts +27 -0
  61. package/dist/types/session/streaming-output.d.ts +4 -0
  62. package/dist/types/task/executor.d.ts +9 -0
  63. package/dist/types/tool-discovery/tool-index.d.ts +2 -0
  64. package/dist/types/tools/ask.d.ts +87 -12
  65. package/dist/types/tools/bash-skill-urls.d.ts +2 -2
  66. package/dist/types/tools/browser/screenshot-format.d.ts +8 -0
  67. package/dist/types/tools/browser/tab-protocol.d.ts +11 -0
  68. package/dist/types/tools/browser/tab-supervisor.d.ts +1 -1
  69. package/dist/types/tools/browser/tab-worker-path-resolver.d.ts +2 -0
  70. package/dist/types/tools/browser/tab-worker-smoke.d.ts +16 -0
  71. package/dist/types/tools/index.d.ts +4 -0
  72. package/dist/types/tools/path-utils.d.ts +9 -14
  73. package/dist/types/tools/render-utils.d.ts +1 -8
  74. package/dist/types/tools/resource-gc.d.ts +14 -0
  75. package/dist/types/utils/image-loading.d.ts +23 -0
  76. package/dist/types/utils/image-resize.d.ts +2 -0
  77. package/dist/types/utils/pasted-image-loading.d.ts +39 -0
  78. package/dist/types/utils/pasted-image-path.d.ts +21 -19
  79. package/dist/types/web/scrapers/html-to-markdown.d.ts +5 -0
  80. package/dist/types/web/scrapers/types.d.ts +1 -5
  81. package/package.json +25 -9
  82. package/scripts/generate-sdk-operation-inventory.ts +2 -0
  83. package/scripts/run-threat-model-check.ts +60 -0
  84. package/src/cli/notify-cli.ts +40 -18
  85. package/src/cli/worktree-cli.ts +9 -287
  86. package/src/cli.ts +10 -9
  87. package/src/commands/gc.ts +11 -1
  88. package/src/commands/sdk.ts +10 -4
  89. package/src/commands/worktree.ts +10 -53
  90. package/src/config/model-profiles.ts +15 -15
  91. package/src/config/settings-schema.ts +17 -0
  92. package/src/daemon/runtime.ts +2 -2
  93. package/src/defaults/gjc/skills/deep-interview/SKILL.md +70 -49
  94. package/src/defaults/gjc/skills/ralplan/SKILL.md +0 -6
  95. package/src/defaults/gjc/skills/team/SKILL.md +7 -9
  96. package/src/defaults/gjc/skills/ultragoal/SKILL.md +0 -2
  97. package/src/eval/js/shared/runtime.ts +1 -1
  98. package/src/eval/py/index.ts +2 -2
  99. package/src/export/html/template.generated.ts +1 -1
  100. package/src/extensibility/plugins/marketplace/manager.ts +94 -10
  101. package/src/gjc-runtime/deep-interview-recorder.ts +7 -0
  102. package/src/gjc-runtime/deep-interview-runtime.ts +10 -0
  103. package/src/gjc-runtime/deep-interview-state.ts +127 -3
  104. package/src/gjc-runtime/gc-render.ts +19 -1
  105. package/src/gjc-runtime/gc-runtime.ts +68 -3
  106. package/src/gjc-runtime/launch-tmux.ts +61 -6
  107. package/src/gjc-runtime/managed-owner-admission.ts +352 -0
  108. package/src/gjc-runtime/managed-owner-supervisor.ts +162 -0
  109. package/src/gjc-runtime/state-argv.ts +292 -0
  110. package/src/gjc-runtime/state-runtime.ts +80 -222
  111. package/src/gjc-runtime/team-runtime.ts +1 -1
  112. package/src/gjc-runtime/tmux-owner-isolation.ts +117 -0
  113. package/src/gjc-runtime/ultragoal-owner-loss-recovery.ts +328 -0
  114. package/src/gjc-runtime/ultragoal-runtime.ts +14 -0
  115. package/src/harness-control-plane/owner.ts +59 -3
  116. package/src/hindsight/client.ts +65 -2
  117. package/src/internal-urls/agent-protocol.ts +76 -5
  118. package/src/internal-urls/docs-index.generated.ts +7 -6
  119. package/src/internal-urls/local-protocol.ts +416 -18
  120. package/src/lsp/index.ts +4 -88
  121. package/src/main.ts +37 -13
  122. package/src/modes/acp/acp-agent.ts +8 -0
  123. package/src/modes/components/ansi-display-validator.ts +54 -0
  124. package/src/modes/components/custom-editor.ts +103 -32
  125. package/src/modes/components/custom-provider-wizard.ts +26 -1
  126. package/src/modes/components/notifications-settings-editor.ts +26 -2
  127. package/src/modes/components/session-observer-overlay.ts +40 -37
  128. package/src/modes/components/settings-selector.ts +3 -1
  129. package/src/modes/components/tool-transcript-format.ts +393 -0
  130. package/src/modes/components/transcript-viewer-overlay.ts +63 -1
  131. package/src/modes/controllers/goal-mode-controller.ts +20 -1
  132. package/src/modes/controllers/input-controller.ts +98 -37
  133. package/src/modes/controllers/plan-mode-controller.ts +2 -0
  134. package/src/modes/controllers/runtime-mcp-command-controller.ts +3 -0
  135. package/src/modes/controllers/selector-controller.ts +71 -9
  136. package/src/modes/interactive-mode.ts +14 -2
  137. package/src/modes/shared/agent-wire/deep-interview-gate.ts +31 -1
  138. package/src/modes/shared/agent-wire/workflow-gate-broker.ts +17 -1
  139. package/src/modes/shared/agent-wire/workflow-gate-schema.ts +4 -2
  140. package/src/modes/shared/agent-wire/workflow-gate-types.ts +120 -3
  141. package/src/plan-mode/approved-plan.ts +3 -1
  142. package/src/prompts/agents/architect.md +1 -0
  143. package/src/prompts/agents/critic.md +1 -0
  144. package/src/prompts/system/custom-system-prompt.md +1 -1
  145. package/src/prompts/system/system-prompt.md +2 -1
  146. package/src/prompts/tools/lsp.md +3 -3
  147. package/src/runtime-mcp/manager.ts +16 -1
  148. package/src/runtime-mcp/oauth-discovery.ts +116 -26
  149. package/src/sdk/broker/broker.ts +139 -32
  150. package/src/sdk/broker/discovery.ts +125 -0
  151. package/src/sdk/broker/ensure.ts +103 -19
  152. package/src/sdk/broker/internal.ts +10 -0
  153. package/src/sdk/broker/session-index.ts +309 -38
  154. package/src/sdk/broker/state-version.ts +5 -2
  155. package/src/sdk/bus/chat-daemon-cli.ts +72 -10
  156. package/src/sdk/bus/chat-daemon-control.ts +526 -130
  157. package/src/sdk/bus/chat-daemon-runtime.ts +1 -0
  158. package/src/sdk/bus/config-commands.ts +22 -0
  159. package/src/sdk/bus/config.ts +37 -0
  160. package/src/sdk/bus/index.ts +384 -92
  161. package/src/sdk/bus/lifecycle-control-runtime.ts +53 -3
  162. package/src/sdk/bus/notification-service.ts +284 -62
  163. package/src/sdk/bus/recent-activity.ts +14 -5
  164. package/src/sdk/bus/session-control.ts +150 -44
  165. package/src/sdk/bus/telegram-daemon-cli.ts +20 -14
  166. package/src/sdk/bus/telegram-daemon-contract.ts +6 -3
  167. package/src/sdk/bus/telegram-daemon-control.ts +294 -76
  168. package/src/sdk/bus/telegram-daemon.ts +1842 -281
  169. package/src/sdk/protocol/operation-inventory.generated.json +11 -0
  170. package/src/sdk/session.ts +155 -27
  171. package/src/secrets/index.ts +53 -10
  172. package/src/secrets/obfuscator.ts +21 -18
  173. package/src/secrets/regex.ts +2 -0
  174. package/src/session/agent-session.ts +495 -253
  175. package/src/session/artifacts.ts +188 -23
  176. package/src/session/context-estimation.ts +7 -2
  177. package/src/session/internal/managed-session-scope.ts +215 -39
  178. package/src/session/internal/managed-session-storage.ts +1152 -46
  179. package/src/session/session-manager.ts +1055 -148
  180. package/src/session/session-storage.ts +109 -11
  181. package/src/session/streaming-output.ts +6 -0
  182. package/src/task/executor.ts +71 -26
  183. package/src/task/index.ts +63 -20
  184. package/src/tool-discovery/tool-index.ts +18 -0
  185. package/src/tools/ask.ts +329 -57
  186. package/src/tools/bash-allowed-prefixes.ts +79 -29
  187. package/src/tools/bash-skill-urls.ts +14 -3
  188. package/src/tools/bash.ts +2 -2
  189. package/src/tools/browser/launch.ts +3 -1
  190. package/src/tools/browser/readable.ts +1 -1
  191. package/src/tools/browser/screenshot-format.ts +34 -0
  192. package/src/tools/browser/tab-protocol.ts +3 -0
  193. package/src/tools/browser/tab-supervisor.ts +125 -122
  194. package/src/tools/browser/tab-worker-entry.ts +33 -14
  195. package/src/tools/browser/tab-worker-path-resolver.ts +67 -0
  196. package/src/tools/browser/tab-worker-smoke.ts +87 -0
  197. package/src/tools/browser/tab-worker.ts +7 -5
  198. package/src/tools/index.ts +4 -0
  199. package/src/tools/path-utils.ts +42 -35
  200. package/src/tools/plan-mode-guard.ts +1 -0
  201. package/src/tools/read.ts +7 -1
  202. package/src/tools/render-utils.ts +1 -27
  203. package/src/tools/resource-gc.ts +123 -34
  204. package/src/tools/sqlite-reader.ts +3 -2
  205. package/src/tools/subagent.ts +2 -0
  206. package/src/utils/image-loading.ts +85 -34
  207. package/src/utils/image-resize.ts +16 -9
  208. package/src/utils/pasted-image-loading.ts +514 -0
  209. package/src/utils/pasted-image-path.ts +223 -98
  210. package/src/web/scrapers/html-to-markdown.ts +68 -0
  211. package/src/web/scrapers/readthedocs.ts +1 -1
  212. package/src/web/scrapers/types.ts +1 -68
  213. package/src/web/search/providers/openai-compatible.ts +76 -23
@@ -15,6 +15,7 @@
15
15
  * - Questions may time out and auto-select the recommended option (configurable, disabled in plan mode)
16
16
  */
17
17
  import type { AgentTool, AgentToolContext, AgentToolResult, AgentToolUpdateCallback } from "@gajae-code/agent-core";
18
+ import type { RawArgumentValidationResult } from "@gajae-code/ai/types";
18
19
  import { type Component } from "@gajae-code/tui";
19
20
  import * as z from "zod/v4";
20
21
  import type { RenderResultOptions } from "../extensibility/custom-tools/types";
@@ -29,13 +30,35 @@ export declare const askSchema: z.ZodObject<{
29
30
  }, z.core.$strip>>;
30
31
  multi: z.ZodOptional<z.ZodBoolean>;
31
32
  recommended: z.ZodOptional<z.ZodNumber>;
32
- deepInterview: z.ZodOptional<z.ZodObject<{
33
+ deepInterview: z.ZodOptional<z.ZodUnion<readonly [z.ZodObject<{
33
34
  round_id: z.ZodOptional<z.ZodString>;
34
35
  round: z.ZodNumber;
35
36
  component: z.ZodString;
36
37
  dimension: z.ZodString;
37
38
  ambiguity: z.ZodNumber;
38
- intent_contract: z.ZodOptional<z.ZodObject<{
39
+ confused_terms: z.ZodOptional<z.ZodArray<z.ZodString>>;
40
+ references: z.ZodOptional<z.ZodArray<z.ZodObject<{
41
+ reference_id: z.ZodString;
42
+ label: z.ZodString;
43
+ origin: z.ZodString;
44
+ url: z.ZodOptional<z.ZodString>;
45
+ excerpt: z.ZodOptional<z.ZodString>;
46
+ }, z.core.$strict>>>;
47
+ }, z.core.$strict>, z.ZodObject<{
48
+ round_id: z.ZodOptional<z.ZodString>;
49
+ ambiguity: z.ZodNumber;
50
+ confused_terms: z.ZodOptional<z.ZodArray<z.ZodString>>;
51
+ references: z.ZodOptional<z.ZodArray<z.ZodObject<{
52
+ reference_id: z.ZodString;
53
+ label: z.ZodString;
54
+ origin: z.ZodString;
55
+ url: z.ZodOptional<z.ZodString>;
56
+ excerpt: z.ZodOptional<z.ZodString>;
57
+ }, z.core.$strict>>>;
58
+ round: z.ZodLiteral<0>;
59
+ component: z.ZodLiteral<"review-topology">;
60
+ dimension: z.ZodLiteral<"topology">;
61
+ intent_contract: z.ZodObject<{
39
62
  items: z.ZodArray<z.ZodObject<{
40
63
  id: z.ZodString;
41
64
  category: z.ZodEnum<{
@@ -47,8 +70,22 @@ export declare const askSchema: z.ZodObject<{
47
70
  statement: z.ZodString;
48
71
  }, z.core.$strict>>;
49
72
  confirmation_options: z.ZodArray<z.ZodString>;
50
- }, z.core.$strict>>;
51
- intent_review: z.ZodOptional<z.ZodObject<{
73
+ }, z.core.$strict>;
74
+ }, z.core.$strict>, z.ZodObject<{
75
+ round_id: z.ZodOptional<z.ZodString>;
76
+ component: z.ZodString;
77
+ dimension: z.ZodString;
78
+ ambiguity: z.ZodNumber;
79
+ confused_terms: z.ZodOptional<z.ZodArray<z.ZodString>>;
80
+ references: z.ZodOptional<z.ZodArray<z.ZodObject<{
81
+ reference_id: z.ZodString;
82
+ label: z.ZodString;
83
+ origin: z.ZodString;
84
+ url: z.ZodOptional<z.ZodString>;
85
+ excerpt: z.ZodOptional<z.ZodString>;
86
+ }, z.core.$strict>>>;
87
+ round: z.ZodNumber;
88
+ intent_review: z.ZodObject<{
52
89
  observed_items: z.ZodArray<z.ZodObject<{
53
90
  id: z.ZodString;
54
91
  category: z.ZodEnum<{
@@ -65,8 +102,8 @@ export declare const askSchema: z.ZodObject<{
65
102
  rationale: z.ZodString;
66
103
  }, z.core.$strict>>;
67
104
  approval_options: z.ZodArray<z.ZodString>;
68
- }, z.core.$strict>>;
69
- }, z.core.$strict>>;
105
+ }, z.core.$strict>;
106
+ }, z.core.$strict>]>>;
70
107
  workflowGate: z.ZodOptional<z.ZodObject<{
71
108
  stage: z.ZodEnum<{
72
109
  "deep-interview": "deep-interview";
@@ -82,6 +119,7 @@ export declare const askSchema: z.ZodObject<{
82
119
  }, z.core.$strip>>;
83
120
  }, z.core.$strip>;
84
121
  export type AskToolInput = z.infer<typeof askSchema>;
122
+ declare function recoverRoundZeroIntentContract(arguments_: Record<string, unknown>): RawArgumentValidationResult;
85
123
  /** Result for a single question */
86
124
  export interface QuestionResult {
87
125
  id: string;
@@ -149,13 +187,35 @@ export declare class AskTool implements AgentTool<typeof askSchema, AskToolDetai
149
187
  }, z.core.$strip>>;
150
188
  multi: z.ZodOptional<z.ZodBoolean>;
151
189
  recommended: z.ZodOptional<z.ZodNumber>;
152
- deepInterview: z.ZodOptional<z.ZodObject<{
190
+ deepInterview: z.ZodOptional<z.ZodUnion<readonly [z.ZodObject<{
153
191
  round_id: z.ZodOptional<z.ZodString>;
154
192
  round: z.ZodNumber;
155
193
  component: z.ZodString;
156
194
  dimension: z.ZodString;
157
195
  ambiguity: z.ZodNumber;
158
- intent_contract: z.ZodOptional<z.ZodObject<{
196
+ confused_terms: z.ZodOptional<z.ZodArray<z.ZodString>>;
197
+ references: z.ZodOptional<z.ZodArray<z.ZodObject<{
198
+ reference_id: z.ZodString;
199
+ label: z.ZodString;
200
+ origin: z.ZodString;
201
+ url: z.ZodOptional<z.ZodString>;
202
+ excerpt: z.ZodOptional<z.ZodString>;
203
+ }, z.core.$strict>>>;
204
+ }, z.core.$strict>, z.ZodObject<{
205
+ round_id: z.ZodOptional<z.ZodString>;
206
+ ambiguity: z.ZodNumber;
207
+ confused_terms: z.ZodOptional<z.ZodArray<z.ZodString>>;
208
+ references: z.ZodOptional<z.ZodArray<z.ZodObject<{
209
+ reference_id: z.ZodString;
210
+ label: z.ZodString;
211
+ origin: z.ZodString;
212
+ url: z.ZodOptional<z.ZodString>;
213
+ excerpt: z.ZodOptional<z.ZodString>;
214
+ }, z.core.$strict>>>;
215
+ round: z.ZodLiteral<0>;
216
+ component: z.ZodLiteral<"review-topology">;
217
+ dimension: z.ZodLiteral<"topology">;
218
+ intent_contract: z.ZodObject<{
159
219
  items: z.ZodArray<z.ZodObject<{
160
220
  id: z.ZodString;
161
221
  category: z.ZodEnum<{
@@ -167,8 +227,22 @@ export declare class AskTool implements AgentTool<typeof askSchema, AskToolDetai
167
227
  statement: z.ZodString;
168
228
  }, z.core.$strict>>;
169
229
  confirmation_options: z.ZodArray<z.ZodString>;
170
- }, z.core.$strict>>;
171
- intent_review: z.ZodOptional<z.ZodObject<{
230
+ }, z.core.$strict>;
231
+ }, z.core.$strict>, z.ZodObject<{
232
+ round_id: z.ZodOptional<z.ZodString>;
233
+ component: z.ZodString;
234
+ dimension: z.ZodString;
235
+ ambiguity: z.ZodNumber;
236
+ confused_terms: z.ZodOptional<z.ZodArray<z.ZodString>>;
237
+ references: z.ZodOptional<z.ZodArray<z.ZodObject<{
238
+ reference_id: z.ZodString;
239
+ label: z.ZodString;
240
+ origin: z.ZodString;
241
+ url: z.ZodOptional<z.ZodString>;
242
+ excerpt: z.ZodOptional<z.ZodString>;
243
+ }, z.core.$strict>>>;
244
+ round: z.ZodNumber;
245
+ intent_review: z.ZodObject<{
172
246
  observed_items: z.ZodArray<z.ZodObject<{
173
247
  id: z.ZodString;
174
248
  category: z.ZodEnum<{
@@ -185,8 +259,8 @@ export declare class AskTool implements AgentTool<typeof askSchema, AskToolDetai
185
259
  rationale: z.ZodString;
186
260
  }, z.core.$strict>>;
187
261
  approval_options: z.ZodArray<z.ZodString>;
188
- }, z.core.$strict>>;
189
- }, z.core.$strict>>;
262
+ }, z.core.$strict>;
263
+ }, z.core.$strict>]>>;
190
264
  workflowGate: z.ZodOptional<z.ZodObject<{
191
265
  stage: z.ZodEnum<{
192
266
  "deep-interview": "deep-interview";
@@ -201,6 +275,7 @@ export declare class AskTool implements AgentTool<typeof askSchema, AskToolDetai
201
275
  }, z.core.$strip>>;
202
276
  }, z.core.$strip>>;
203
277
  }, z.core.$strip>;
278
+ readonly rawArgumentValidation: typeof recoverRoundZeroIntentContract;
204
279
  readonly strict = true;
205
280
  readonly loadMode = "discoverable";
206
281
  constructor(session: ToolSession);
@@ -24,8 +24,8 @@ export declare function resolveSkillUrlToPath(url: string, skills: readonly Skil
24
24
  */
25
25
  export declare function expandSkillUrls(command: string, skills: readonly Skill[]): string;
26
26
  /**
27
- * Expand supported internal URLs in a bash command string to shell-escaped absolute paths.
28
- * Supported schemes: skill://, agent://, artifact://, memory://, rule://, local://
27
+ * Expand filesystem-safe internal URLs in a bash command string. `agent://` and
28
+ * `artifact://` remain internal-reader-only and are rejected before resolution.
29
29
  */
30
30
  export declare function expandInternalUrls(command: string, options: InternalUrlExpansionOptions): Promise<string>;
31
31
  export {};
@@ -0,0 +1,8 @@
1
+ import { type ResizedImage } from "../../utils/image-resize";
2
+ export declare function formatScreenshot(opts: {
3
+ saveFullRes: boolean;
4
+ savedMimeType: string;
5
+ savedByteLength: number;
6
+ dest: string;
7
+ resized: ResizedImage;
8
+ }): string[];
@@ -70,6 +70,10 @@ export type ToolReply = {
70
70
  error: RunErrorPayload;
71
71
  };
72
72
  export type WorkerInbound = {
73
+ type: "bootstrap";
74
+ version: 1;
75
+ mode: "native-free";
76
+ } | {
73
77
  type: "init";
74
78
  payload: WorkerInitPayload;
75
79
  } | {
@@ -112,6 +116,13 @@ export interface RunErrorPayload {
112
116
  isAbort: boolean;
113
117
  }
114
118
  export type WorkerOutbound = {
119
+ type: "bootstrap-ready";
120
+ version: 1;
121
+ mode: "native-free";
122
+ } | {
123
+ type: "bootstrap-failed";
124
+ error: string;
125
+ } | {
115
126
  type: "ready";
116
127
  info: ReadyInfo;
117
128
  } | {
@@ -5,8 +5,8 @@ interface WorkerHandle {
5
5
  send(msg: WorkerInbound, transferList?: Transferable[]): void;
6
6
  onMessage(handler: (msg: WorkerOutbound) => void): () => void;
7
7
  onError(handler: (error: Error) => void): () => void;
8
+ onClose(handler: () => void): () => void;
8
9
  terminate(): Promise<void>;
9
- readonly mode: "worker" | "inline";
10
10
  }
11
11
  export type DialogPolicy = "accept" | "dismiss";
12
12
  export interface PendingRun {
@@ -0,0 +1,2 @@
1
+ /** Resolve filesystem-only worker inputs without evaluating the broad path utility module. */
2
+ export declare function resolveTabWorkerPath(filePath: string, cwd: string): string;
@@ -0,0 +1,16 @@
1
+ import type { WorkerInbound } from "./tab-protocol";
2
+ interface SmokeWorkerHandle {
3
+ postMessage(message: WorkerInbound): void;
4
+ addEventListener(type: string, listener: EventListener): void;
5
+ removeEventListener(type: string, listener: EventListener): void;
6
+ terminate(): void;
7
+ }
8
+ /**
9
+ * Starts the real tab worker entry without connecting to a browser, then proves
10
+ * its bootstrap and shutdown protocol. The compiled branch deliberately keeps
11
+ * a static literal for Bun's --compile worker discovery.
12
+ */
13
+ export declare function smokeTestTabWorker(timeoutMs?: number): Promise<void>;
14
+ /** Test-only: verify the smoke handshake against a controlled worker transport. */
15
+ export declare function smokeTestTabWorkerWithWorkerForTest(worker: SmokeWorkerHandle, timeoutMs: number): Promise<void>;
16
+ export {};
@@ -139,6 +139,8 @@ export interface ToolSession {
139
139
  cwd: string;
140
140
  /** Whether UI is available */
141
141
  hasUI: boolean;
142
+ /** Whether this session will bind a workflow-gate emitter after tool construction. */
143
+ workflowGateEligible?: boolean;
142
144
  /** Skip Python kernel availability check and warmup */
143
145
  skipPythonPreflight?: boolean;
144
146
  /** Pre-loaded context files (AGENTS.md, etc) */
@@ -185,6 +187,8 @@ export interface ToolSession {
185
187
  requestForegroundBashBackground?: () => boolean;
186
188
  /** Get session ID */
187
189
  getSessionId?: () => string | null;
190
+ /** Whether local:// must use external managed scratch instead of artifacts/local. */
191
+ isManagedSessionDestination?: () => boolean;
188
192
  /** Get Hindsight runtime state for this agent session. */
189
193
  getHindsightSessionState?: () => HindsightSessionState | undefined;
190
194
  /** Agent identity used for IRC routing. Returns the registry id (e.g. "0-Main", "0-AuthLoader"). */
@@ -7,21 +7,16 @@ export declare function splitPathAndSel(rawPath: string): {
7
7
  /**
8
8
  * Variant of {@link splitPathAndSel} for internal URLs (`scheme://...`).
9
9
  *
10
- * The filesystem-path splitter is intentionally conservative: it refuses to
11
- * peel a trailing `:<chunk>` unless that chunk matches the strict selector
12
- * grammar. That rule is right for filesystem paths (a file named `a:1-50` is
13
- * legal) but wrong for internal URLs, where any trailing `:<chunk>` after the
14
- * scheme is unambiguously a read-tool selector — even if malformed (e.g.
15
- * `artifact://3:raw:-100`).
16
- *
17
- * This function iteratively peels selector-shaped chunks (well-formed plus
18
- * common malformed shapes like `:-N`) so the rest of the read tool can pass a
19
- * clean URL to the protocol handler and surface selector errors via parseSel
20
- * instead of as misleading "host invalid" errors from the handler.
21
- *
22
- * Falls back to the input unchanged when nothing matches.
10
+ * Artifact authorities are generated identifiers, so their complete tail is
11
+ * unambiguously a selector and malformed selectors can be rejected before
12
+ * resolving the artifact. Other resources may legitimately use colons in
13
+ * their identities, so they only lose strict, recognized selector suffixes.
14
+ * Skill authorities additionally use the active registry to distinguish a
15
+ * skill name from its selector without making path-utils depend on skills.
23
16
  */
24
- export declare function splitInternalUrlSel(rawPath: string): {
17
+ export declare function splitInternalUrlSel(rawPath: string, options?: {
18
+ activeSkillNames?: readonly string[];
19
+ }): {
25
20
  path: string;
26
21
  sel?: string;
27
22
  };
@@ -8,9 +8,9 @@ import type { ToolCallContext } from "@gajae-code/agent-core";
8
8
  import type { Ellipsis } from "@gajae-code/natives";
9
9
  import type { Component } from "@gajae-code/tui";
10
10
  import type { Theme } from "../modes/theme/theme";
11
- import { type ResizedImage } from "../utils/image-resize";
12
11
  export { Ellipsis } from "@gajae-code/natives";
13
12
  export { replaceTabs, truncateToWidth, wrapTextWithAnsi } from "@gajae-code/tui";
13
+ export { formatScreenshot } from "./browser/screenshot-format";
14
14
  /** Resolve inline image dimension caps from settings and viewport. */
15
15
  export declare function resolveImageOptions(): {
16
16
  maxWidthCells: number;
@@ -107,13 +107,6 @@ export declare function truncateDiffByHunk(diffText: string, maxHunks: number, m
107
107
  };
108
108
  export declare function shortenPath(filePath: string, homeDir?: string): string;
109
109
  export declare function formatToolWorkingDirectory(workdir: string | undefined, projectDir: string): string | undefined;
110
- export declare function formatScreenshot(opts: {
111
- saveFullRes: boolean;
112
- savedMimeType: string;
113
- savedByteLength: number;
114
- dest: string;
115
- resized: ResizedImage;
116
- }): string[];
117
110
  export declare function wrapBrackets(text: string, theme: Theme): string;
118
111
  export declare const PARSE_ERRORS_LIMIT = 20;
119
112
  export declare function dedupeParseErrors(errors: string[] | undefined): string[];
@@ -44,11 +44,25 @@ export interface ResourceGcRegistration {
44
44
  export declare function registerResourceGcSession(reg: ResourceGcRegistration): () => void;
45
45
  export declare function sweepOnce(d?: ResourceGcDeps): Promise<void>;
46
46
  export declare function __setResourceGcDepsForTest(overrides: Partial<ResourceGcDeps>): void;
47
+ export declare function __setResourceGcSchedulerNowForTest(now: () => number): void;
47
48
  export declare function __runResourceGcTickForTest(): Promise<void>;
49
+ export declare function __runResourceGcTimerCallbackForTest(owner: {
50
+ generation: number;
51
+ token: number;
52
+ }, deadline: number): Promise<void>;
48
53
  export declare function __getResourceGcStateForTest(): {
49
54
  timerActive: boolean;
50
55
  sessionCount: number;
51
56
  rssWarningActive: boolean;
52
57
  inProgress: boolean;
58
+ generation: number;
59
+ pendingDeadline: number | null;
60
+ pendingOwner: {
61
+ generation: number;
62
+ token: number;
63
+ } | null;
64
+ deferredDeadline: number | null;
65
+ deferredGeneration: number | null;
66
+ activeGeneration: number | null;
53
67
  };
54
68
  export declare function __resetResourceGcForTest(): void;
@@ -8,6 +8,24 @@ export interface LoadImageInputOptions {
8
8
  maxBytes?: number;
9
9
  resolvedPath?: string;
10
10
  detectedMimeType?: string;
11
+ signal?: AbortSignal;
12
+ }
13
+ export interface LoadImageInputBytesOptions {
14
+ inputBuffer: Buffer;
15
+ resolvedPath: string;
16
+ mimeType: string;
17
+ autoResize: boolean;
18
+ maxBytes?: number;
19
+ maxOutputBytes?: number;
20
+ signal?: AbortSignal;
21
+ }
22
+ export interface TransformedImageInput {
23
+ resolvedPath: string;
24
+ mimeType: string;
25
+ buffer: Uint8Array;
26
+ textNote: string;
27
+ dimensionNote?: string;
28
+ bytes: number;
11
29
  }
12
30
  export interface LoadedImageInput {
13
31
  resolvedPath: string;
@@ -23,4 +41,9 @@ export declare class ImageInputTooLargeError extends Error {
23
41
  constructor(bytes: number, maxBytes: number);
24
42
  }
25
43
  export declare function ensureSupportedImageInput(image: ImageContent): Promise<ImageContent | null>;
44
+ /** Transform trusted source bytes without materializing a base64 payload. */
45
+ export declare function transformImageInputBytes(options: LoadImageInputBytesOptions): Promise<TransformedImageInput>;
46
+ export declare function materializeImageInput(transformed: TransformedImageInput): LoadedImageInput;
47
+ /** Build a model image payload from bytes already read through a trusted descriptor. */
48
+ export declare function loadImageInputBytes(options: LoadImageInputBytesOptions): Promise<LoadedImageInput>;
26
49
  export declare function loadImageInput(options: LoadImageInputOptions): Promise<LoadedImageInput | null>;
@@ -16,6 +16,7 @@ export interface ResizedImage {
16
16
  wasResized: boolean;
17
17
  get data(): string;
18
18
  }
19
+ export declare const DEFAULT_IMAGE_RESIZE_MAX_BYTES: number;
19
20
  /**
20
21
  * Resize and recompress an image to fit within the specified max dimensions and file size.
21
22
  *
@@ -31,6 +32,7 @@ export interface ResizedImage {
31
32
  * Backed by `Bun.Image`: a chainable native pipeline that runs decode/transform/encode
32
33
  * off the JS thread when the terminal (`.bytes()`) is awaited.
33
34
  */
35
+ export declare function resizeImageBuffer(inputBuffer: Buffer, inputMimeType: string, options?: ImageResizeOptions): Promise<ResizedImage>;
34
36
  export declare function resizeImage(img: ImageContent, options?: ImageResizeOptions): Promise<ResizedImage>;
35
37
  /**
36
38
  * Format a dimension note for resized images.
@@ -0,0 +1,39 @@
1
+ import type { ImageContent } from "@gajae-code/ai";
2
+ import { type LoadedImageInput, transformImageInputBytes } from "./image-loading";
3
+ export declare const MAX_PASTED_IMAGE_SOURCE_BYTES: number;
4
+ export declare const MAX_PASTED_IMAGE_OUTPUT_BYTES: number;
5
+ export declare const MAX_PASTED_IMAGE_DIMENSION = 20000;
6
+ export declare const MAX_PASTED_IMAGE_PIXELS = 40000000;
7
+ export declare const MAX_PASTED_IMAGE_DECODED_BYTES: number;
8
+ export type PastedImageBatchErrorCode = "too-many" | "unsafe-path" | "unsupported-image" | "source-aggregate-too-large" | "output-aggregate-too-large" | "dimensions-too-large";
9
+ export declare class PastedImageBatchError extends Error {
10
+ readonly code: PastedImageBatchErrorCode;
11
+ readonly imagePath?: string | undefined;
12
+ constructor(code: PastedImageBatchErrorCode, message: string, imagePath?: string | undefined);
13
+ }
14
+ export interface LoadedPastedImageBatch {
15
+ images: ImageContent[];
16
+ loadedInputs: LoadedImageInput[];
17
+ sourcePaths: string[];
18
+ }
19
+ export interface PastedImageLoadingDependencies {
20
+ /** Synchronization hook used to exercise pathname swaps after descriptor open. */
21
+ afterDescriptorOpen?: (imagePath: string, index: number) => Promise<void> | void;
22
+ beforeDescriptorRead?: (imagePath: string, index: number) => Promise<void> | void;
23
+ transformImageBytes?: typeof transformImageInputBytes;
24
+ }
25
+ export type PastedImageSourcePolicy = "confirmed" | "automatic-temp";
26
+ export interface LoadPastedImageBatchOptions {
27
+ paths: readonly string[];
28
+ autoResize: boolean;
29
+ signal: AbortSignal;
30
+ sourcePolicy?: PastedImageSourcePolicy;
31
+ maxImageBytes?: number;
32
+ maxSourceBytes?: number;
33
+ maxOutputBytes?: number;
34
+ maxDimension?: number;
35
+ maxPixels?: number;
36
+ maxDecodedBytes?: number;
37
+ dependencies?: PastedImageLoadingDependencies;
38
+ }
39
+ export declare function loadPastedImageBatch(options: LoadPastedImageBatchOptions): Promise<LoadedPastedImageBatch>;
@@ -1,9 +1,8 @@
1
+ export declare const MAX_PASTED_IMAGE_COUNT = 16;
2
+ export declare const MAX_PASTED_IMAGE_PASTE_CHARACTERS: number;
3
+ export declare const MAX_PASTED_IMAGE_PATH_CHARACTERS: number;
1
4
  export interface DecodePastedPathOptions {
2
- /**
3
- * Platform whose path semantics apply when decoding (shell unescaping,
4
- * `file://` drive letters / UNC hosts). Defaults to `process.platform`;
5
- * injectable so tests can pin the win32 contract from any host.
6
- */
5
+ /** Platform whose path and shell semantics apply. Defaults to `process.platform`. */
7
6
  platform?: NodeJS.Platform;
8
7
  /** Home directory for `~/` expansion. Defaults to `os.homedir()`. */
9
8
  homedir?: string;
@@ -12,21 +11,24 @@ export interface ResolvePastedImagePathOptions extends DecodePastedPathOptions {
12
11
  /** Base directory for relative paths. Defaults to `process.cwd()`. */
13
12
  cwd?: string;
14
13
  }
15
- /**
16
- * Decode pasted text into a filesystem path candidate. No filesystem access.
17
- *
18
- * Handles terminal drag-drop shell escaping (`\ `, `\(`, ...; skipped on
19
- * win32 where `\` is the path separator), quoted paths, `file://` URIs
20
- * (drive-letter, `file://localhost`, and UNC forms on win32), and `~/`
21
- * expansion. Returns `undefined` when the text is empty, spans multiple
22
- * lines, or is an invalid `file://` URI.
23
- */
14
+ export type PastedImagePathParseResult = {
15
+ kind: "paths";
16
+ paths: string[];
17
+ requiresConfirmation: boolean;
18
+ } | {
19
+ kind: "too-many";
20
+ maxCandidates: number;
21
+ };
22
+ /** Decode one pasted path candidate without filesystem access. */
24
23
  export declare function decodePastedPathCandidate(text: string, options?: DecodePastedPathOptions): string | undefined;
24
+ /** Tokenize a bounded complete path list without filesystem access. */
25
+ export declare function decodePastedPathCandidates(text: string, options?: DecodePastedPathOptions, maxCandidates?: number): string[] | undefined;
26
+ /** Resolve one recognized clipboard-temp image path lexically, before any filesystem access. */
27
+ export declare function resolvePastedImagePath(text: string, options?: ResolvePastedImagePathOptions): string | undefined;
25
28
  /**
26
- * Returns the resolved path when the whole pasted text is a recognized clipboard
27
- * temp path to an existing image file, otherwise `undefined` (the paste is
28
- * inserted as text). Arbitrary saved image paths are not auto-attached here;
29
- * users attach them explicitly with `@path/to/image.png`.
29
+ * Parse a complete image path paste without filesystem access. A single path
30
+ * keeps the clipboard-temp-only policy; multi-path saved-image pastes require
31
+ * explicit confirmation before any path is opened.
30
32
  */
31
- export declare function resolvePastedImagePath(text: string, options?: ResolvePastedImagePathOptions): string | undefined;
33
+ export declare function parsePastedImagePaths(text: string, options?: ResolvePastedImagePathOptions): PastedImagePathParseResult | undefined;
32
34
  export declare function formatPastedImageReference(placeholder: string, imagePath: string): string;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Convert HTML to markdown using Turndown with GFM support.
3
+ * Strips script/style tags before conversion.
4
+ */
5
+ export declare function htmlToBasicMarkdown(html: string): Promise<string>;
@@ -44,11 +44,7 @@ export interface LoadPageResult {
44
44
  * Fetch a page with timeout and size limit
45
45
  */
46
46
  export declare function loadPage(url: string, options?: LoadPageOptions): Promise<LoadPageResult>;
47
- /**
48
- * Convert HTML to markdown using Turndown with GFM support.
49
- * Strips script/style tags before conversion.
50
- */
51
- export declare function htmlToBasicMarkdown(html: string): Promise<string>;
47
+ export { htmlToBasicMarkdown } from "./html-to-markdown";
52
48
  /**
53
49
  * Build a RenderResult from markdown content. Calls finalizeOutput internally.
54
50
  */
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@gajae-code/coding-agent",
4
- "version": "0.11.3",
4
+ "version": "0.11.5",
5
5
  "description": "Gajae Code CLI with read, bash, edit, write tools and session management",
6
6
  "homepage": "https://gajae-code.com",
7
7
  "author": "Yeachan-Heo and Gajae Code Contributors",
@@ -47,19 +47,19 @@
47
47
  "install:defaults": "bun src/cli.ts setup defaults",
48
48
  "verify:insane-vendor": "bun scripts/verify-insane-vendor.ts",
49
49
  "verify:sdk-canonicalization": "bun scripts/verify-gjc-sdk-canonicalization.ts",
50
- "check:sdk-closure": "bun scripts/generate-sdk-operation-inventory.ts --check && bun scripts/generate-sdk-adapter-parity-manifest.ts --check && bun scripts/run-test-manifest.ts test/manifests/sdk-adapter-parity-v1.json && bun scripts/generate-telegram-baseline-manifest.ts --check && bun scripts/run-test-manifest.ts test/manifests/telegram-baseline-v1.json && bun test test/sdk-downgrade-rollback.test.ts test/sdk-downgrade-unknown-version.test.ts && bun scripts/verify-gjc-sdk-canonicalization.ts --self-test && bun scripts/verify-gjc-sdk-canonicalization.ts && bun scripts/verify-gjc-sdk-rename.ts"
50
+ "check:sdk-closure": "bun ../../scripts/telegram-daemon-generation-guard.ts --validate-current-tree && bun test ../../scripts/telegram-daemon-generation-guard.test.ts && bun scripts/generate-sdk-operation-inventory.ts --check && bun scripts/generate-sdk-adapter-parity-manifest.ts --check && bun scripts/run-test-manifest.ts test/manifests/sdk-adapter-parity-v1.json && bun scripts/generate-telegram-baseline-manifest.ts --check && bun scripts/run-test-manifest.ts test/manifests/telegram-baseline-v1.json && bun test test/sdk-downgrade-rollback.test.ts test/sdk-downgrade-unknown-version.test.ts && bun scripts/verify-gjc-sdk-canonicalization.ts --self-test && bun scripts/verify-gjc-sdk-canonicalization.ts && bun scripts/verify-gjc-sdk-rename.ts"
51
51
  },
52
52
  "dependencies": {
53
53
  "@agentclientprotocol/sdk": "1.2.1",
54
54
  "@babel/parser": "^7.29.3",
55
55
  "@mozilla/readability": "^0.6.0",
56
- "@gajae-code/stats": "0.11.3",
57
- "@gajae-code/agent-core": "0.11.3",
58
- "@gajae-code/ai": "0.11.3",
59
- "@gajae-code/bridge-client": "0.11.3",
60
- "@gajae-code/natives": "0.11.3",
61
- "@gajae-code/tui": "0.11.3",
62
- "@gajae-code/utils": "0.11.3",
56
+ "@gajae-code/stats": "0.11.5",
57
+ "@gajae-code/agent-core": "0.11.5",
58
+ "@gajae-code/ai": "0.11.5",
59
+ "@gajae-code/bridge-client": "0.11.5",
60
+ "@gajae-code/natives": "0.11.5",
61
+ "@gajae-code/tui": "0.11.5",
62
+ "@gajae-code/utils": "0.11.5",
63
63
  "@puppeteer/browsers": "^2.13.0",
64
64
  "@types/turndown": "5.0.6",
65
65
  "@xterm/headless": "^6.0.0",
@@ -171,6 +171,14 @@
171
171
  "types": "./dist/types/capability/*.d.ts",
172
172
  "import": "./src/capability/*.ts"
173
173
  },
174
+ "./cli/worktree-cli": {
175
+ "types": "./dist/types/cli/worktree-cli.d.ts",
176
+ "import": "./src/cli/worktree-cli.ts"
177
+ },
178
+ "./cli/worktree-cli.js": {
179
+ "types": "./dist/types/cli/worktree-cli.d.ts",
180
+ "import": "./src/cli/worktree-cli.ts"
181
+ },
174
182
  "./cli/*": {
175
183
  "types": "./dist/types/cli/*.d.ts",
176
184
  "import": "./src/cli/*.ts"
@@ -187,6 +195,14 @@
187
195
  "./commands/ultraqa": null,
188
196
  "./commands/ultrawork": null,
189
197
  "./commands/performance-goal": null,
198
+ "./commands/worktree": {
199
+ "types": "./dist/types/commands/worktree.d.ts",
200
+ "import": "./src/commands/worktree.ts"
201
+ },
202
+ "./commands/worktree.js": {
203
+ "types": "./dist/types/commands/worktree.d.ts",
204
+ "import": "./src/commands/worktree.ts"
205
+ },
190
206
  "./commands/*": {
191
207
  "types": "./dist/types/commands/*.d.ts",
192
208
  "import": "./src/commands/*.ts"
@@ -113,6 +113,8 @@ const LOCKED_EXCLUSIONS: Readonly<Record<string, string>> = {
113
113
  "agent_session:cancelAndSubmit": "interactive queue transaction plumbing, not an independent SDK control seam",
114
114
  "agent_session:applyCompactionPostAppendForTests": "internal accessor/plumbing, not a user-facing control seam",
115
115
  "agent_session:continuePersistedHistory": "internal startup lifecycle plumbing, not a user-facing control seam",
116
+ "agent_session:promoteRecoveryHydrationAfterOwnershipReadyFence":
117
+ "internal owner-recovery authority transition after a durable writer fence, never a user-facing SDK operation",
116
118
  "agent_session:setActiveModelProfile": "internal accessor/plumbing, not a user-facing control seam",
117
119
  "agent_session:getActiveModelProfile": "internal accessor/plumbing, not a user-facing control seam",
118
120
  "agent_session:getSessionDefaultModelSelector": "internal accessor/plumbing, not a user-facing control seam",