@gajae-code/coding-agent 0.5.4 → 0.6.1

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 (155) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/types/cli/web-search-cli.d.ts +12 -0
  3. package/dist/types/commands/rlm.d.ts +10 -0
  4. package/dist/types/commands/web-search.d.ts +54 -0
  5. package/dist/types/config/keybindings.d.ts +10 -0
  6. package/dist/types/config/model-profiles.d.ts +2 -1
  7. package/dist/types/config/model-registry.d.ts +3 -0
  8. package/dist/types/config/models-config-schema.d.ts +3 -0
  9. package/dist/types/config/settings-schema.d.ts +61 -3
  10. package/dist/types/edit/notebook.d.ts +3 -0
  11. package/dist/types/eval/py/executor.d.ts +3 -0
  12. package/dist/types/eval/py/kernel.d.ts +3 -1
  13. package/dist/types/eval/py/runtime.d.ts +9 -1
  14. package/dist/types/exec/bash-executor.d.ts +4 -0
  15. package/dist/types/extensibility/custom-tools/types.d.ts +2 -0
  16. package/dist/types/extensibility/custom-tools/wrapper.d.ts +1 -0
  17. package/dist/types/extensibility/extensions/types.d.ts +2 -0
  18. package/dist/types/extensibility/extensions/wrapper.d.ts +1 -0
  19. package/dist/types/gjc-runtime/launch-tmux.d.ts +6 -0
  20. package/dist/types/gjc-runtime/session-state-sidecar.d.ts +14 -0
  21. package/dist/types/gjc-runtime/tmux-common.d.ts +6 -0
  22. package/dist/types/gjc-runtime/tmux-gc.d.ts +3 -3
  23. package/dist/types/gjc-runtime/tmux-sessions.d.ts +4 -0
  24. package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +18 -0
  25. package/dist/types/goals/state.d.ts +1 -1
  26. package/dist/types/goals/tools/goal-tool.d.ts +2 -0
  27. package/dist/types/main.d.ts +11 -0
  28. package/dist/types/modes/components/custom-editor.d.ts +4 -2
  29. package/dist/types/modes/components/custom-model-preset-wizard.d.ts +12 -0
  30. package/dist/types/modes/components/model-selector.d.ts +5 -2
  31. package/dist/types/modes/components/status-line.d.ts +4 -1
  32. package/dist/types/modes/controllers/input-controller.d.ts +3 -0
  33. package/dist/types/modes/controllers/selector-controller.d.ts +1 -0
  34. package/dist/types/modes/print-mode.d.ts +6 -0
  35. package/dist/types/modes/rpc/rpc-client.d.ts +21 -0
  36. package/dist/types/modes/rpc/rpc-socket-security.d.ts +7 -0
  37. package/dist/types/modes/rpc/rpc-types.d.ts +13 -0
  38. package/dist/types/modes/shared/agent-wire/command-dispatch.d.ts +2 -0
  39. package/dist/types/modes/shared/agent-wire/unattended-session.d.ts +1 -0
  40. package/dist/types/rlm/artifacts.d.ts +9 -0
  41. package/dist/types/rlm/complete-research-tool.d.ts +35 -0
  42. package/dist/types/rlm/data-context.d.ts +6 -0
  43. package/dist/types/rlm/index.d.ts +35 -0
  44. package/dist/types/rlm/notebook.d.ts +12 -0
  45. package/dist/types/rlm/preset.d.ts +23 -0
  46. package/dist/types/rlm/python-tool.d.ts +16 -0
  47. package/dist/types/rlm/report.d.ts +14 -0
  48. package/dist/types/rlm/types.d.ts +37 -0
  49. package/dist/types/sdk.d.ts +7 -0
  50. package/dist/types/session/agent-session.d.ts +21 -0
  51. package/dist/types/tools/bash-allowed-prefixes.d.ts +6 -1
  52. package/dist/types/tools/browser/attach.d.ts +19 -3
  53. package/dist/types/tools/browser/registry.d.ts +15 -0
  54. package/dist/types/tools/browser/render.d.ts +3 -0
  55. package/dist/types/tools/browser.d.ts +18 -1
  56. package/dist/types/tools/computer/render.d.ts +17 -0
  57. package/dist/types/tools/computer.d.ts +465 -0
  58. package/dist/types/tools/index.d.ts +24 -1
  59. package/dist/types/tools/job.d.ts +13 -0
  60. package/dist/types/tools/tool-timeouts.d.ts +5 -0
  61. package/dist/types/web/search/index.d.ts +32 -2
  62. package/dist/types/web/search/providers/base.d.ts +22 -0
  63. package/dist/types/web/search/providers/xai.d.ts +64 -0
  64. package/dist/types/web/search/types.d.ts +11 -3
  65. package/package.json +7 -7
  66. package/src/cli/web-search-cli.ts +123 -8
  67. package/src/cli.ts +2 -0
  68. package/src/commands/rlm.ts +19 -0
  69. package/src/commands/web-search.ts +66 -0
  70. package/src/config/keybindings.ts +11 -0
  71. package/src/config/model-profiles.ts +11 -3
  72. package/src/config/model-registry.ts +55 -1
  73. package/src/config/models-config-schema.ts +1 -0
  74. package/src/config/settings-schema.ts +67 -1
  75. package/src/edit/notebook.ts +6 -2
  76. package/src/eval/py/executor.ts +8 -1
  77. package/src/eval/py/kernel.ts +9 -4
  78. package/src/eval/py/runtime.ts +153 -32
  79. package/src/exec/bash-executor.ts +10 -4
  80. package/src/extensibility/custom-tools/types.ts +2 -0
  81. package/src/extensibility/custom-tools/wrapper.ts +2 -0
  82. package/src/extensibility/extensions/types.ts +2 -0
  83. package/src/extensibility/extensions/wrapper.ts +1 -0
  84. package/src/gjc-runtime/launch-tmux.ts +129 -1
  85. package/src/gjc-runtime/session-state-sidecar.ts +61 -1
  86. package/src/gjc-runtime/tmux-common.ts +26 -2
  87. package/src/gjc-runtime/tmux-gc.ts +40 -27
  88. package/src/gjc-runtime/tmux-sessions.ts +13 -1
  89. package/src/gjc-runtime/ultragoal-runtime.ts +340 -18
  90. package/src/goals/runtime.ts +4 -3
  91. package/src/goals/state.ts +1 -1
  92. package/src/goals/tools/goal-tool.ts +16 -3
  93. package/src/internal-urls/docs-index.generated.ts +13 -9
  94. package/src/main.ts +28 -3
  95. package/src/modes/components/custom-editor.ts +13 -4
  96. package/src/modes/components/custom-model-preset-wizard.ts +293 -0
  97. package/src/modes/components/hook-selector.ts +1 -1
  98. package/src/modes/components/model-selector.ts +72 -29
  99. package/src/modes/components/skill-message.ts +62 -8
  100. package/src/modes/components/status-line.ts +13 -1
  101. package/src/modes/controllers/input-controller.ts +60 -11
  102. package/src/modes/controllers/selector-controller.ts +39 -0
  103. package/src/modes/interactive-mode.ts +1 -1
  104. package/src/modes/print-mode.ts +14 -4
  105. package/src/modes/rpc/rpc-client.ts +250 -80
  106. package/src/modes/rpc/rpc-mode.ts +6 -12
  107. package/src/modes/rpc/rpc-socket-security.ts +103 -0
  108. package/src/modes/rpc/rpc-types.ts +10 -0
  109. package/src/modes/shared/agent-wire/command-dispatch.ts +7 -0
  110. package/src/modes/shared/agent-wire/command-validation.ts +1 -0
  111. package/src/modes/shared/agent-wire/scopes.ts +1 -0
  112. package/src/modes/shared/agent-wire/unattended-session.ts +9 -0
  113. package/src/modes/utils/hotkeys-markdown.ts +4 -2
  114. package/src/modes/utils/ui-helpers.ts +2 -2
  115. package/src/prompts/goals/goal-continuation.md +1 -0
  116. package/src/prompts/goals/goal-mode-active.md +1 -0
  117. package/src/prompts/system/rlm-report-command.md +1 -0
  118. package/src/prompts/system/rlm-research.md +23 -0
  119. package/src/prompts/tools/bash.md +23 -2
  120. package/src/prompts/tools/browser.md +7 -3
  121. package/src/prompts/tools/computer.md +74 -0
  122. package/src/prompts/tools/goal.md +3 -0
  123. package/src/prompts/tools/job.md +9 -1
  124. package/src/prompts/tools/web-search.md +7 -0
  125. package/src/rlm/artifacts.ts +60 -0
  126. package/src/rlm/complete-research-tool.ts +163 -0
  127. package/src/rlm/data-context.ts +26 -0
  128. package/src/rlm/index.ts +339 -0
  129. package/src/rlm/notebook.ts +108 -0
  130. package/src/rlm/preset.ts +76 -0
  131. package/src/rlm/python-tool.ts +68 -0
  132. package/src/rlm/report.ts +70 -0
  133. package/src/rlm/types.ts +40 -0
  134. package/src/sdk.ts +12 -0
  135. package/src/session/agent-session.ts +48 -3
  136. package/src/slash-commands/builtin-registry.ts +17 -0
  137. package/src/tools/bash-allowed-prefixes.ts +84 -1
  138. package/src/tools/bash.ts +80 -13
  139. package/src/tools/browser/attach.ts +103 -3
  140. package/src/tools/browser/registry.ts +176 -2
  141. package/src/tools/browser/render.ts +9 -1
  142. package/src/tools/browser.ts +33 -0
  143. package/src/tools/computer/render.ts +78 -0
  144. package/src/tools/computer.ts +640 -0
  145. package/src/tools/index.ts +41 -1
  146. package/src/tools/job.ts +88 -5
  147. package/src/tools/json-tree.ts +42 -29
  148. package/src/tools/renderers.ts +2 -0
  149. package/src/tools/tool-timeouts.ts +1 -0
  150. package/src/web/search/index.ts +27 -2
  151. package/src/web/search/provider.ts +16 -1
  152. package/src/web/search/providers/base.ts +22 -0
  153. package/src/web/search/providers/xai.ts +511 -0
  154. package/src/web/search/render.ts +7 -0
  155. package/src/web/search/types.ts +11 -1
package/CHANGELOG.md CHANGED
@@ -2,6 +2,28 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.6.1] - 2026-06-18
6
+
7
+ ### Fixed
8
+
9
+ - Fixed the `computer` tool (and any other `z.union`/discriminated-union tool) shipping a bare top-level `anyOf`/`oneOf`/`allOf` `input_schema` root that strict providers (Amazon Bedrock Converse incl. Kiro/CodeWhisperer relays, OpenAI strict mode, Gemini) reject. Tool schema roots are now flattened to a single `type: "object"` across all providers via the shared `flattenToolRootCombinators`. See `@gajae-code/ai` 0.6.1.
10
+
11
+ ## [0.6.0] - 2026-06-18
12
+ ### Added
13
+
14
+ - Exposed the existing goal-pause capability through the `goal` tool as `goal({op:"pause"})`. The runtime `pauseGoal()` method and `paused` status already existed and were reachable via the `/goal pause` slash command and the goal menu, but the agent-facing `goal` tool only enumerated `create | get | complete | resume | drop` — so an agent could not park a goal whose remaining work was blocked on human input. It was forced to either `drop` (clearing the goal) or leave the goal `active`, which re-fired the hidden autonomous-continuation steer every turn with no exit condition. `pause` reuses the existing `paused` status and continuation gate (`buildContinuationPrompt` already returns `undefined` when `enabled=false`), parks the goal without dropping it, persists as `goal_paused`, and is resumable via the existing `resume` op. The active-goal and continuation prompts now instruct the agent to pause when every outstanding deliverable is genuinely human-blocked. `pauseGoal()` now rejects any goal whose status is not `active`, so a completed or dropped goal cannot be driven into a paused-mode lifecycle when paused through the tool.
15
+
16
+ ### Fixed
17
+
18
+ - Restored steer-by-default while the agent is busy: `busyPromptMode` now defaults to `steer`, so Enter on a normal prompt interrupts the active turn. Queueing for the next turn is reserved for the explicit Ctrl+Enter follow-up keystroke (or `busyPromptMode: "queue"`); existing steer/cancel plus explicit queue/dequeue controls remain separate (#829).
19
+ - Fixed `gjc rlm "<question>"` consuming the seeded question as a one-shot autonomous run that exited immediately; a seeded prompt now lands in the interactive composer so the research session stays interactive.
20
+
21
+ ### Added
22
+
23
+ - Added an opt-in `gjc rlm` research mode (v1, interactive): a Jupyter-notebook-style research session over the existing agent loop, backed by the shared persistent Python kernel. It loads a distinct research system prompt, restricts the toolset to a hard-gated allowlist (`python` + `read` + `web_search`, asserted after tool-registry assembly — no `bash`/edit/arbitrary mutation), optionally loads a project-root `DATA.md` (overridable via `--data <path>`), aggregates every executed cell live into `.gjc/rlm/<session>/notebook.ipynb` (single-queue atomic temp-rename writes with post-write validation), and synthesizes `.gjc/rlm/<session>/report.md` on session exit. Autonomous goal-arg runs, `--resume`, managed per-workspace venv provisioning, and the optional `>=N` completion gate are deferred follow-ups.
24
+ - Added an experimental opt-in `computer` desktop-control tool surface for local macOS screenshot/input coordination, backed by native `ComputerController`/`computerScreenshot` bindings and gated through settings/tool registration so it can continue stabilizing on `dev` outside the 0.5.4 patch release.
25
+ - Dropped deprecated GitHub Actions Intel macOS (`macos-13` / `darwin-x64`) release-binary coverage after the runner pool repeatedly blocked v0.6.0 publish; Intel macOS users should install through npm/Bun or build from source.
26
+
5
27
  ## [0.5.4] - 2026-06-17
6
28
 
7
29
  ### Fixed
@@ -10,6 +32,7 @@
10
32
  - `AgentSession` now forwards the live provider session state (`providerSessionState`), session affinity id (`providerSessionId ?? sessionId`), and configured WebSocket transport preference (`preferWebsockets`) into local maintenance one-shot calls — manual/automatic compaction summaries, handoff generation, and tree branch summaries — via a shared `#maintenanceProviderTransport()` helper. Previously these Codex/OpenAI-compatible maintenance calls could fall back to HTTP/SSE and lose `session_id` affinity even when `providers.openaiWebsockets: "on"` routed live turns over WebSocket (#736).
11
33
  - Fixed `ollama-cloud` first-event timeouts driving an unbounded, usage-spiking retry loop. The ollama-chat backend (exclusively `ollama-cloud`; local Ollama uses the `openai-responses` API) can stall before its first token even for tiny prompts, surfacing `Provider stream timed out while waiting for the first event`. That message matched the generic transient classifier, which retries forever (capped only on delay), so every continuation re-issued the full request to a billable backend and silently spiked usage — disabling retries was the only workaround. First-event timeouts on the ollama-chat API are now a distinct fail-closed class bounded by `retry.maxRetries`: they still retry transient cold starts a few times, then surface instead of looping. First-party providers keep their existing unbounded first-event-timeout retry behavior (#713).
12
34
  - Interactive sessions no longer orphan the `browser` tool's headless/spawned Chrome (and the Python eval kernel) to PID 1 when killed by a signal. The interactive entry now registers a bounded, idempotent `postmortem` cleanup (`session-subprocess-teardown`) that runs `AgentSession.disposeChildSubprocesses()` on `SIGINT`/`SIGTERM`/`SIGHUP`, force-releasing the session's browser tabs (`kill:true`) and disposing its Python/JS kernels — the teardown the graceful `/quit` (`dispose()`) path already performs but that an external `kill`/terminal-close used to bypass. Headless `disposeBrowserHandle` now also SIGTERM/SIGKILLs the captured Chrome process tree as a fallback when forced, so a wedged renderer can't survive a bounded CDP `close()`; graceful release behavior is unchanged. The teardown is time-boxed (5s) so a stuck subprocess can't hang process exit (#698).
35
+ - Added first-class xAI search provider support for the `web_search` tool and `gjc q`, including OAuth/API-key auth, web/X/combined search modes, xAI web/X filters, image/video options, citation controls, usage reporting, Settings provider selection, CLI flags, config schema wiring, and edge-case coverage.
13
36
 
14
37
  ## [0.5.3] - 2026-06-16
15
38
 
@@ -3,6 +3,7 @@
3
3
  *
4
4
  * Handles `gjc q`/`gjc web-search` subcommands for testing web search providers.
5
5
  */
6
+ import { type SearchQueryParams } from "../web/search/index";
6
7
  import type { SearchProviderId } from "../web/search/types";
7
8
  export interface SearchCommandArgs {
8
9
  query: string;
@@ -10,6 +11,17 @@ export interface SearchCommandArgs {
10
11
  recency?: "day" | "week" | "month" | "year";
11
12
  limit?: number;
12
13
  expanded: boolean;
14
+ xaiSearchMode?: SearchQueryParams["xai_search_mode"];
15
+ allowedDomains?: string[];
16
+ excludedDomains?: string[];
17
+ allowedXHandles?: string[];
18
+ excludedXHandles?: string[];
19
+ fromDate?: string;
20
+ toDate?: string;
21
+ enableImageUnderstanding?: boolean;
22
+ enableImageSearch?: boolean;
23
+ enableVideoUnderstanding?: boolean;
24
+ noInlineCitations?: boolean;
13
25
  }
14
26
  /**
15
27
  * Parse web search subcommand arguments.
@@ -0,0 +1,10 @@
1
+ /**
2
+ * `gjc rlm` — opt-in Jupyter-style research session with a persistent Python kernel.
3
+ */
4
+ import { Command } from "@gajae-code/utils/cli";
5
+ export default class Rlm extends Command {
6
+ static description: string;
7
+ static strict: boolean;
8
+ static examples: string[];
9
+ run(): Promise<void>;
10
+ }
@@ -25,6 +25,60 @@ export default class Search extends Command {
25
25
  char: string;
26
26
  description: string;
27
27
  };
28
+ "xai-mode": import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
29
+ description: string;
30
+ options: string[];
31
+ };
32
+ "allowed-domain": import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
33
+ description: string;
34
+ multiple: true;
35
+ };
36
+ "allowed-domains": import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
37
+ description: string;
38
+ multiple: true;
39
+ };
40
+ "excluded-domain": import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
41
+ description: string;
42
+ multiple: true;
43
+ };
44
+ "excluded-domains": import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
45
+ description: string;
46
+ multiple: true;
47
+ };
48
+ "allowed-x-handle": import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
49
+ description: string;
50
+ multiple: true;
51
+ };
52
+ "allowed-x-handles": import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
53
+ description: string;
54
+ multiple: true;
55
+ };
56
+ "excluded-x-handle": import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
57
+ description: string;
58
+ multiple: true;
59
+ };
60
+ "excluded-x-handles": import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
61
+ description: string;
62
+ multiple: true;
63
+ };
64
+ "from-date": import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
65
+ description: string;
66
+ };
67
+ "to-date": import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
68
+ description: string;
69
+ };
70
+ "image-understanding": import("@gajae-code/utils/cli").FlagDescriptor<"boolean"> & {
71
+ description: string;
72
+ };
73
+ "image-search": import("@gajae-code/utils/cli").FlagDescriptor<"boolean"> & {
74
+ description: string;
75
+ };
76
+ "video-understanding": import("@gajae-code/utils/cli").FlagDescriptor<"boolean"> & {
77
+ description: string;
78
+ };
79
+ "no-inline-citations": import("@gajae-code/utils/cli").FlagDescriptor<"boolean"> & {
80
+ description: string;
81
+ };
28
82
  compact: import("@gajae-code/utils/cli").FlagDescriptor<"boolean"> & {
29
83
  description: string;
30
84
  };
@@ -15,8 +15,10 @@ interface AppKeybindings {
15
15
  "app.model.select": true;
16
16
  "app.model.selectTemporary": true;
17
17
  "app.tools.expand": true;
18
+ "app.tool.backgroundFold": true;
18
19
  "app.editor.external": true;
19
20
  "app.message.followUp": true;
21
+ "app.message.queue": true;
20
22
  "app.message.dequeue": true;
21
23
  "app.clipboard.pasteImage": true;
22
24
  "app.clipboard.copyLine": true;
@@ -215,6 +217,10 @@ export declare const KEYBINDINGS: {
215
217
  readonly defaultKeys: "ctrl+o";
216
218
  readonly description: "Expand tools";
217
219
  };
220
+ readonly "app.tool.backgroundFold": {
221
+ readonly defaultKeys: "ctrl+b";
222
+ readonly description: "Fold/background supported foreground tool";
223
+ };
218
224
  readonly "app.editor.external": {
219
225
  readonly defaultKeys: "ctrl+g";
220
226
  readonly description: "Open external editor";
@@ -223,6 +229,10 @@ export declare const KEYBINDINGS: {
223
229
  readonly defaultKeys: "ctrl+enter";
224
230
  readonly description: "Send follow-up message";
225
231
  };
232
+ readonly "app.message.queue": {
233
+ readonly defaultKeys: "alt+enter";
234
+ readonly description: "Queue message for next turn";
235
+ };
226
236
  readonly "app.message.dequeue": {
227
237
  readonly defaultKeys: "alt+up";
228
238
  readonly description: "Dequeue message";
@@ -4,6 +4,7 @@ export type ModelProfileRole = GjcModelAssignmentTargetId;
4
4
  export interface ModelProfileDefinition {
5
5
  name: string;
6
6
  requiredProviders: string[];
7
+ displayName?: string;
7
8
  /**
8
9
  * Optional groups of providers that are interchangeable fallbacks.
9
10
  * Each group is an array of provider ids where at least one must be
@@ -28,7 +29,7 @@ export interface ModelProfilePresentation {
28
29
  displayName: string;
29
30
  providerGroup: string;
30
31
  }
31
- export declare function getModelProfilePresentation(name: string): ModelProfilePresentation;
32
+ export declare function getModelProfilePresentation(profile: string | Pick<ModelProfileDefinition, "name" | "displayName">): ModelProfilePresentation;
32
33
  export declare function groupModelProfilesForPresetLanding(profiles: ReadonlyMap<string, ModelProfileDefinition>): Map<string, ModelProfileDefinition[]>;
33
34
  export declare function recommendModelProfileForProvider(providerId: string, profiles: ReadonlyMap<string, ModelProfileDefinition>): ModelProfileDefinition | undefined;
34
35
  export declare function mergeModelProfiles(userProfiles?: ModelsConfig["profiles"]): Map<string, ModelProfileDefinition>;
@@ -6,6 +6,7 @@ import type { ActiveSearchModelContext, WebSearchMode } from "../web/search/type
6
6
  import { type ConfigError, ConfigFile } from "./config-file";
7
7
  import { type CanonicalModelIndex, type CanonicalModelRecord, type CanonicalModelVariant, type ModelEquivalenceConfig } from "./model-equivalence";
8
8
  import { type ModelProfileDefinition } from "./model-profiles";
9
+ import { type ModelProfileConfig } from "./models-config-schema";
9
10
  import { type Settings } from "./settings";
10
11
  export type { CanonicalModelIndex, CanonicalModelRecord, CanonicalModelVariant, ModelEquivalenceConfig };
11
12
  export declare const kNoAuth = "N/A";
@@ -263,6 +264,7 @@ export declare const ModelsConfigFile: ConfigFile<{
263
264
  } | undefined;
264
265
  profiles?: Record<string, {
265
266
  required_providers: string[];
267
+ display_name?: string | undefined;
266
268
  model_mapping: Partial<Record<"architect" | "critic" | "default" | "executor" | "planner", string>>;
267
269
  }> | undefined;
268
270
  }>;
@@ -331,6 +333,7 @@ export declare class ModelRegistry {
331
333
  getModelProfiles(): Map<string, ModelProfileDefinition>;
332
334
  getModelProfile(name: string): ModelProfileDefinition | undefined;
333
335
  getAvailableModelProfileNames(): string[];
336
+ saveCustomModelProfile(name: string, definition: ModelProfileConfig): Promise<ModelProfileDefinition>;
334
337
  applyConfiguredModelBindings(targetSettings: Settings): void;
335
338
  /**
336
339
  * Get all models (built-in + custom).
@@ -78,6 +78,7 @@ export declare const ProfileModelMappingSchema: z.ZodRecord<z.ZodEnum<{
78
78
  }> & z.core.$partial, z.ZodString>;
79
79
  export declare const ProfileDefinitionSchema: z.ZodObject<{
80
80
  required_providers: z.ZodArray<z.ZodString>;
81
+ display_name: z.ZodOptional<z.ZodString>;
81
82
  model_mapping: z.ZodRecord<z.ZodEnum<{
82
83
  architect: "architect";
83
84
  critic: "critic";
@@ -88,6 +89,7 @@ export declare const ProfileDefinitionSchema: z.ZodObject<{
88
89
  }, z.core.$strict>;
89
90
  export declare const ProfilesSchema: z.ZodRecord<z.ZodString, z.ZodObject<{
90
91
  required_providers: z.ZodArray<z.ZodString>;
92
+ display_name: z.ZodOptional<z.ZodString>;
91
93
  model_mapping: z.ZodRecord<z.ZodEnum<{
92
94
  architect: "architect";
93
95
  critic: "critic";
@@ -673,6 +675,7 @@ export declare const ModelsConfigSchema: z.ZodObject<{
673
675
  }, z.core.$strip>>;
674
676
  profiles: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
675
677
  required_providers: z.ZodArray<z.ZodString>;
678
+ display_name: z.ZodOptional<z.ZodString>;
676
679
  model_mapping: z.ZodRecord<z.ZodEnum<{
677
680
  architect: "architect";
678
681
  critic: "critic";
@@ -1126,7 +1126,7 @@ export declare const SETTINGS_SCHEMA: {
1126
1126
  readonly ui: {
1127
1127
  readonly tab: "interaction";
1128
1128
  readonly label: "Busy Prompt Mode";
1129
- readonly description: "What a submitted prompt does while the agent is busy: steer (interrupt the active turn) or queue (run after the active turn completes)";
1129
+ readonly description: "What a submitted prompt does while the agent is busy: queue normal chat for the next turn, or steer to interrupt the active turn";
1130
1130
  };
1131
1131
  };
1132
1132
  readonly doubleEscapeAction: {
@@ -2465,7 +2465,7 @@ export declare const SETTINGS_SCHEMA: {
2465
2465
  readonly type: "array";
2466
2466
  readonly default: string[];
2467
2467
  readonly items: {
2468
- readonly enum: readonly ["duckduckgo", "exa", "brave", "jina", "kimi", "zai", "anthropic", "perplexity", "gemini", "codex", "tavily", "parallel", "kagi", "synthetic", "searxng"];
2468
+ readonly enum: readonly ["duckduckgo", "exa", "brave", "jina", "kimi", "zai", "anthropic", "perplexity", "gemini", "codex", "xai", "tavily", "parallel", "kagi", "synthetic", "searxng"];
2469
2469
  };
2470
2470
  readonly ui: {
2471
2471
  readonly tab: "tools";
@@ -2500,6 +2500,60 @@ export declare const SETTINGS_SCHEMA: {
2500
2500
  readonly description: "Directory to save screenshots. If unset, screenshots go to a temp file. Supports ~. Examples: ~/Downloads, ~/Desktop, /sdcard/Download (Android)";
2501
2501
  };
2502
2502
  };
2503
+ readonly "computer.enabled": {
2504
+ readonly type: "boolean";
2505
+ readonly default: false;
2506
+ readonly ui: {
2507
+ readonly tab: "tools";
2508
+ readonly label: "Computer";
2509
+ readonly description: "Enable the macOS computer tool for this session. Off by default.";
2510
+ };
2511
+ };
2512
+ readonly "computer.alwaysOn": {
2513
+ readonly type: "boolean";
2514
+ readonly default: false;
2515
+ readonly ui: {
2516
+ readonly tab: "tools";
2517
+ readonly label: "Computer Always On";
2518
+ readonly description: "Keep the macOS computer tool callable without per-session enablement.";
2519
+ };
2520
+ };
2521
+ readonly "computer.autoScreenshot": {
2522
+ readonly type: "boolean";
2523
+ readonly default: false;
2524
+ readonly ui: {
2525
+ readonly tab: "tools";
2526
+ readonly label: "Computer Auto Screenshot";
2527
+ readonly description: "Automatically request bounded screenshots after computer actions when supported.";
2528
+ };
2529
+ };
2530
+ readonly "computer.screenshotMaxBytes": {
2531
+ readonly type: "number";
2532
+ readonly default: 5000000;
2533
+ readonly ui: {
2534
+ readonly tab: "tools";
2535
+ readonly label: "Computer Screenshot Max Bytes";
2536
+ readonly description: "Maximum screenshot payload size for computer action results.";
2537
+ };
2538
+ };
2539
+ readonly "computer.killSwitchHotkey": {
2540
+ readonly type: "string";
2541
+ readonly default: "Control+Option+Command+Escape";
2542
+ readonly ui: {
2543
+ readonly tab: "tools";
2544
+ readonly label: "Computer Kill Switch Hotkey";
2545
+ readonly description: "Native stop/suspend hotkey shown to users for computer-use sessions.";
2546
+ };
2547
+ };
2548
+ readonly "computer.auditLog.enabled": {
2549
+ readonly type: "boolean";
2550
+ readonly default: true;
2551
+ readonly ui: {
2552
+ readonly tab: "tools";
2553
+ readonly label: "Computer Audit Log";
2554
+ readonly description: "Persist audit records for enabled computer-use actions.";
2555
+ };
2556
+ };
2503
2557
  readonly "tools.intentTracing": {
2504
2558
  readonly type: "boolean";
2505
2559
  readonly default: true;
@@ -3014,7 +3068,7 @@ export declare const SETTINGS_SCHEMA: {
3014
3068
  };
3015
3069
  readonly "providers.webSearch": {
3016
3070
  readonly type: "enum";
3017
- readonly values: readonly ["auto", "duckduckgo", "exa", "brave", "jina", "kimi", "zai", "perplexity", "anthropic", "gemini", "codex", "tavily", "kagi", "synthetic", "parallel", "searxng"];
3071
+ readonly values: readonly ["auto", "duckduckgo", "exa", "brave", "jina", "kimi", "zai", "perplexity", "anthropic", "gemini", "codex", "xai", "tavily", "kagi", "synthetic", "parallel", "searxng"];
3018
3072
  readonly default: "auto";
3019
3073
  readonly ui: {
3020
3074
  readonly tab: "providers";
@@ -3056,6 +3110,10 @@ export declare const SETTINGS_SCHEMA: {
3056
3110
  readonly value: "codex";
3057
3111
  readonly label: "OpenAI";
3058
3112
  readonly description: "OpenAI's native web_search (uses ChatGPT OAuth via /login openai-codex)";
3113
+ }, {
3114
+ readonly value: "xai";
3115
+ readonly label: "xAI";
3116
+ readonly description: "xAI Responses web_search/x_search (uses xAI OAuth via /login xai or XAI_API_KEY)";
3059
3117
  }, {
3060
3118
  readonly value: "gemini";
3061
3119
  readonly label: "Gemini";
@@ -16,6 +16,9 @@ export interface NotebookDocument {
16
16
  }
17
17
  export declare function isNotebookPath(filePath: string): boolean;
18
18
  export declare function splitNotebookSource(content: string): string[];
19
+ export declare function createNotebookCell(cellType: NotebookCellType, source: string): NotebookCell;
20
+ export declare function createEmptyNotebook(): NotebookDocument;
21
+ export declare function serializeNotebookDocument(notebook: NotebookDocument): string;
19
22
  export declare function readNotebookDocument(absolutePath: string, displayPath: string): Promise<NotebookDocument>;
20
23
  export declare function notebookToEditableText(notebook: NotebookDocument): string;
21
24
  export declare function applyNotebookEditableText(notebook: NotebookDocument, text: string, displayPath: string): NotebookDocument;
@@ -2,6 +2,7 @@ import type { ToolSession } from "../../tools";
2
2
  import type { JsStatusEvent } from "../js/shared/types";
3
3
  import type { KernelDisplayOutput } from "./display";
4
4
  import { type KernelExecuteOptions, type KernelExecuteResult } from "./kernel";
5
+ import type { PythonRuntimeOptions } from "./runtime";
5
6
  export type PythonKernelMode = "session" | "per-call";
6
7
  export interface PythonExecutorOptions {
7
8
  /** Working directory for command execution */
@@ -31,6 +32,8 @@ export interface PythonExecutorOptions {
31
32
  * preferred over `PI_SESSION_FILE`-derived paths.
32
33
  */
33
34
  artifactsDir?: string;
35
+ /** Runtime resolution/provisioning options (RLM managed workspace venv, package seeding). */
36
+ runtimeOptions?: PythonRuntimeOptions;
34
37
  /** Artifact path/id for full output storage */
35
38
  artifactPath?: string;
36
39
  artifactId?: string;
@@ -1,4 +1,5 @@
1
1
  import { type KernelDisplayOutput } from "./display";
2
+ import { type PythonRuntimeOptions } from "./runtime";
2
3
  export type { KernelDisplayOutput, PythonStatusEvent } from "./display";
3
4
  export { renderKernelDisplay } from "./display";
4
5
  export interface KernelExecuteOptions {
@@ -38,6 +39,7 @@ interface KernelLifecycleOptions {
38
39
  interface KernelStartOptions extends KernelLifecycleOptions {
39
40
  cwd: string;
40
41
  env?: Record<string, string | undefined>;
42
+ runtimeOptions?: PythonRuntimeOptions;
41
43
  }
42
44
  interface KernelShutdownOptions {
43
45
  signal?: AbortSignal;
@@ -48,7 +50,7 @@ export interface PythonKernelAvailability {
48
50
  pythonPath?: string;
49
51
  reason?: string;
50
52
  }
51
- export declare function checkPythonKernelAvailability(cwd: string): Promise<PythonKernelAvailability>;
53
+ export declare function checkPythonKernelAvailability(cwd: string, runtimeOptions?: PythonRuntimeOptions): Promise<PythonKernelAvailability>;
52
54
  export declare class PythonKernel {
53
55
  #private;
54
56
  readonly id: string;
@@ -1,3 +1,10 @@
1
+ export declare const RLM_MANAGED_PYTHON_PACKAGES: readonly string[];
2
+ export interface PythonRuntimeOptions {
3
+ /** Create/use <cwd>/.gjc/python-env when no BYO venv/conda env is present. */
4
+ managedWorkspaceVenv?: boolean;
5
+ /** Packages to seed into the managed workspace venv when provisioning it. */
6
+ seedPackages?: readonly string[];
7
+ }
1
8
  export interface PythonRuntime {
2
9
  /** Path to python executable */
3
10
  pythonPath: string;
@@ -18,4 +25,5 @@ export declare function resolveVenvPath(cwd: string): string | undefined;
18
25
  /**
19
26
  * Resolve Python runtime including executable path, environment, and venv detection.
20
27
  */
21
- export declare function resolvePythonRuntime(cwd: string, baseEnv: Record<string, string | undefined>): PythonRuntime;
28
+ export declare function resolvePythonRuntime(cwd: string, baseEnv: Record<string, string | undefined>, options?: PythonRuntimeOptions): PythonRuntime;
29
+ export declare function ensurePythonRuntime(cwd: string, baseEnv: Record<string, string | undefined>, options?: PythonRuntimeOptions): Promise<PythonRuntime>;
@@ -21,6 +21,10 @@ export interface BashExecutorOptions {
21
21
  artifactId?: string;
22
22
  /** Execute without retaining a native Shell in the persistent session registry. */
23
23
  oneShot?: boolean;
24
+ /** Ignore user-configured shell command prefixes. Used by constrained read-only shells. */
25
+ ignoreShellPrefix?: boolean;
26
+ /** Skip sourced shell snapshots. Used by constrained read-only shells. */
27
+ disableShellSnapshot?: boolean;
24
28
  /**
25
29
  * Invoked when the native minimizer rewrote the command's output, giving
26
30
  * the caller a chance to persist the lossless original capture (typically
@@ -163,6 +163,8 @@ export interface CustomTool<TParams extends TSchema = TSchema, TDetails = any> {
163
163
  label: string;
164
164
  /** If true, tool is strictly typed and validated against the parameters schema before execution */
165
165
  strict?: boolean;
166
+ /** Tool scheduling mode; exclusive tools do not run in parallel with other tools in a model turn. */
167
+ concurrency?: "shared" | "exclusive";
166
168
  /** Description for LLM */
167
169
  description: string;
168
170
  /** Parameter schema (Zod or TypeBox; TypeBox is auto-lifted to Zod at registration). */
@@ -13,6 +13,7 @@ export declare class CustomToolAdapter<TParams extends TSchema = TSchema, TDetai
13
13
  description: string;
14
14
  parameters: TParams;
15
15
  readonly strict: boolean | undefined;
16
+ readonly concurrency: "shared" | "exclusive" | undefined;
16
17
  constructor(tool: CustomTool<TParams, TDetails>, getContext: () => CustomToolContext);
17
18
  execute(toolCallId: string, params: Static<TParams>, signal?: AbortSignal, onUpdate?: AgentToolUpdateCallback<TDetails, TParams>, context?: CustomToolContext): Promise<import("@gajae-code/agent-core").AgentToolResult<TDetails, TParams>>;
18
19
  /**
@@ -270,6 +270,8 @@ export interface ToolDefinition<TParams extends TSchema = TSchema, TDetails = un
270
270
  description: string;
271
271
  /** Parameter schema (Zod, or TypeBox for legacy/extension compat). */
272
272
  parameters: TParams;
273
+ /** Tool scheduling mode; exclusive tools do not run in parallel with other tools in a model turn. */
274
+ concurrency?: "shared" | "exclusive";
273
275
  /** If true, tool is excluded unless explicitly listed in --tools or agent's tools field */
274
276
  hidden?: boolean;
275
277
  /** If true, tool is registered but not auto-included in the initial active set.
@@ -16,6 +16,7 @@ export declare class RegisteredToolAdapter implements AgentTool<any, any, any> {
16
16
  parameters: any;
17
17
  label: string;
18
18
  strict: boolean;
19
+ concurrency: "shared" | "exclusive" | undefined;
19
20
  renderCall?: (args: any, options: any, theme: any) => any;
20
21
  renderResult?: (result: any, options: any, theme: any, args?: any) => any;
21
22
  constructor(registeredTool: RegisteredTool, runner: ExtensionRunner);
@@ -3,6 +3,7 @@ import { buildGjcTmuxProfileCommands, GJC_DEFAULT_TMUX_SESSION, GJC_TMUX_COMMAND
3
3
  export { buildGjcTmuxProfileCommands, GJC_DEFAULT_TMUX_SESSION, GJC_TMUX_COMMAND_ENV, GJC_TMUX_MOUSE_ENV, GJC_TMUX_PROFILE_ENV, GJC_TMUX_SESSION_PREFIX, };
4
4
  export declare const GJC_TMUX_LAUNCHED_ENV = "GJC_TMUX_LAUNCHED";
5
5
  export declare const GJC_LAUNCH_POLICY_ENV = "GJC_LAUNCH_POLICY";
6
+ export declare const GJC_TMUX_WINDOW_LABEL_MAX_WIDTH = 48;
6
7
  interface TtyState {
7
8
  stdin: boolean;
8
9
  stdout: boolean;
@@ -46,6 +47,8 @@ export interface TmuxLaunchPlan {
46
47
  branch?: string | null;
47
48
  attachSessionName?: string;
48
49
  project?: string | null;
50
+ sessionId?: string | null;
51
+ sessionStateFile?: string | null;
49
52
  }
50
53
  export interface GjcTmuxProfileResult {
51
54
  skipped: boolean;
@@ -64,7 +67,10 @@ export interface GjcTmuxProfileContext {
64
67
  branch?: string | null;
65
68
  branchSlug?: string | null;
66
69
  project?: string | null;
70
+ sessionId?: string | null;
71
+ sessionStateFile?: string | null;
67
72
  }
68
73
  export declare function applyGjcTmuxProfile(context: GjcTmuxProfileContext): GjcTmuxProfileResult;
74
+ export declare function buildGjcTmuxWindowTitle(cwd: string, branch: string | null | undefined): string;
69
75
  export declare function buildDefaultTmuxLaunchPlan(context: TmuxLaunchContext): TmuxLaunchPlan | undefined;
70
76
  export declare function launchDefaultTmuxIfNeeded(context: TmuxLaunchContext): boolean;
@@ -1,5 +1,6 @@
1
1
  export declare const GJC_COORDINATOR_SESSION_STATE_FILE_ENV = "GJC_COORDINATOR_SESSION_STATE_FILE";
2
2
  export declare const GJC_COORDINATOR_SESSION_ID_ENV = "GJC_COORDINATOR_SESSION_ID";
3
+ export type RuntimeState = "ready_for_input" | "running" | "needs_user_input" | "completed" | "errored";
3
4
  interface RuntimeStateEvent {
4
5
  type: string;
5
6
  messages?: unknown[];
@@ -9,5 +10,18 @@ interface RuntimeStateContext {
9
10
  cwd: string;
10
11
  sessionFile?: string | null;
11
12
  }
13
+ export type TerminalRuntimeStateStatus = {
14
+ terminal: true;
15
+ state: "completed" | "errored";
16
+ } | {
17
+ terminal: false;
18
+ reason: "missing_state_file" | "invalid_json" | "session_id_mismatch" | "cwd_mismatch" | "session_file_mismatch" | "non_terminal_state";
19
+ };
20
+ export declare function readTerminalRuntimeStateMarker(input: {
21
+ stateFile?: string | null;
22
+ sessionId?: string | null;
23
+ cwd?: string | null;
24
+ sessionFile?: string | null;
25
+ }): Promise<TerminalRuntimeStateStatus>;
12
26
  export declare function persistCoordinatorRuntimeStateFromEvent(event: RuntimeStateEvent, context: RuntimeStateContext): Promise<void>;
13
27
  export {};
@@ -8,6 +8,8 @@ export declare const GJC_TMUX_PROFILE_VALUE = "1";
8
8
  export declare const GJC_TMUX_BRANCH_OPTION = "@gjc-branch";
9
9
  export declare const GJC_TMUX_BRANCH_SLUG_OPTION = "@gjc-branch-slug";
10
10
  export declare const GJC_TMUX_PROJECT_OPTION = "@gjc-project";
11
+ export declare const GJC_TMUX_SESSION_ID_OPTION = "@gjc-session-id";
12
+ export declare const GJC_TMUX_SESSION_STATE_FILE_OPTION = "@gjc-session-state-file";
11
13
  export interface GjcTmuxProfileCommand {
12
14
  description: string;
13
15
  args: string[];
@@ -46,10 +48,14 @@ export declare function buildGjcTmuxRequiredProfileCommands(target: string, meta
46
48
  branch?: string | null;
47
49
  branchSlug?: string | null;
48
50
  project?: string | null;
51
+ sessionId?: string | null;
52
+ sessionStateFile?: string | null;
49
53
  }): GjcTmuxProfileCommand[];
50
54
  export declare function buildGjcTmuxProfileCommands(target: string, env?: NodeJS.ProcessEnv, metadata?: {
51
55
  branch?: string | null;
52
56
  branchSlug?: string | null;
53
57
  project?: string | null;
58
+ sessionId?: string | null;
59
+ sessionStateFile?: string | null;
54
60
  }): GjcTmuxProfileCommand[];
55
61
  export declare function normalizeTmuxCreatedAt(raw: string): string;
@@ -1,7 +1,7 @@
1
1
  /**
2
- * GC adapter for gjc-tagged tmux sessions. Stale iff `@gjc-project` path is gone
3
- * OR `@gjc-branch` has no live git worktree. Removal is a spec-authorized
4
- * destructive `kill-session`, gated by exact-target re-read + revalidation.
2
+ * GC adapter for gjc-tagged tmux sessions. Destructive cleanup is authorized
3
+ * only for detached pane-less sessions whose exact runtime marker revalidates a
4
+ * terminal state. Project/branch/orphan heuristics are discovery signals only.
5
5
  */
6
6
  import type { GcStoreAdapter } from "./gc-runtime";
7
7
  export declare const tmuxSessionsGcAdapter: GcStoreAdapter;
@@ -8,6 +8,8 @@ export interface GjcTmuxSessionStatus {
8
8
  branch?: string;
9
9
  branchSlug?: string;
10
10
  project?: string;
11
+ sessionId?: string;
12
+ sessionStateFile?: string;
11
13
  panePids: number[];
12
14
  profile?: string;
13
15
  }
@@ -16,6 +18,8 @@ export interface GjcTmuxSessionTagsForGc {
16
18
  project?: string;
17
19
  branch?: string;
18
20
  branchSlug?: string;
21
+ sessionId?: string;
22
+ sessionStateFile?: string;
19
23
  createdAt?: string;
20
24
  attached?: boolean;
21
25
  panePids?: number[];
@@ -121,6 +121,23 @@ export declare function startNextUltragoalGoal(input: {
121
121
  allComplete: boolean;
122
122
  }>;
123
123
  type SurfaceFamily = "web" | "cli" | "native" | "api-package" | "algorithm-math" | "unknown";
124
+ type UltragoalChangeStatus = "added" | "modified" | "deleted" | "renamed" | "copied" | "unknown";
125
+ type UltragoalChangeCategory = "code" | "generated-binding" | "tool" | "settings-registry" | "prompt-doc-behavior" | "docs-static" | "other";
126
+ interface UltragoalChangeSetPath extends JsonObject {
127
+ path: string;
128
+ status: UltragoalChangeStatus;
129
+ oldPath?: string;
130
+ category?: UltragoalChangeCategory;
131
+ }
132
+ interface UltragoalChangeSet extends JsonObject {
133
+ source: "checkpoint-git" | "review-pr" | "review-branch" | "review-worktree" | "review-spec";
134
+ baseRef?: string;
135
+ headRef?: string;
136
+ mergeBase?: string;
137
+ paths: UltragoalChangeSetPath[];
138
+ rawDiffStat?: string;
139
+ trusted: true;
140
+ }
124
141
  export declare function normalizeSurfaceToken(value: string): string;
125
142
  export declare function surfaceFamily(value: string): SurfaceFamily;
126
143
  export interface ReplayProcessHandle {
@@ -130,6 +147,7 @@ export interface ReplayProcessHandle {
130
147
  export declare function waitForReplayProcessWithTimeout(process: ReplayProcessHandle, timeoutMs: number, graceMs?: number): Promise<number>;
131
148
  export declare function validateExecutorQaRedTeamEvidenceForReview(cwd: string, executorQa: Record<string, unknown>, options?: {
132
149
  mode?: "review";
150
+ changeSet?: UltragoalChangeSet;
133
151
  }): Promise<void>;
134
152
  export declare function checkpointUltragoalGoal(input: {
135
153
  cwd: string;
@@ -16,7 +16,7 @@ export interface GoalModeState {
16
16
  goal: Goal;
17
17
  }
18
18
  export interface GoalToolDetails {
19
- op: "create" | "get" | "complete" | "resume" | "drop";
19
+ op: "create" | "get" | "complete" | "resume" | "drop" | "pause";
20
20
  goal?: Goal | null;
21
21
  }
22
22
  export type GoalRuntimeEvent = {
@@ -11,6 +11,7 @@ declare const goalSchema: z.ZodObject<{
11
11
  create: "create";
12
12
  drop: "drop";
13
13
  get: "get";
14
+ pause: "pause";
14
15
  resume: "resume";
15
16
  }>;
16
17
  objective: z.ZodOptional<z.ZodString>;
@@ -32,6 +33,7 @@ export declare class GoalTool implements AgentTool<typeof goalSchema, GoalToolDe
32
33
  create: "create";
33
34
  drop: "drop";
34
35
  get: "get";
36
+ pause: "pause";
35
37
  resume: "resume";
36
38
  }>;
37
39
  objective: z.ZodOptional<z.ZodString>;