@gajae-code/coding-agent 0.12.12 → 0.12.13
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.
- package/CHANGELOG.md +30 -0
- package/dist/types/cli/marketplace-hint.d.ts +28 -0
- package/dist/types/cli.d.ts +10 -0
- package/dist/types/config/file-lock-gc.d.ts +13 -1
- package/dist/types/config/model-registry.d.ts +6 -0
- package/dist/types/config/models-config-schema.d.ts +99 -0
- package/dist/types/gjc-runtime/deep-interview-state.d.ts +14 -0
- package/dist/types/gjc-runtime/gc-runtime.d.ts +11 -0
- package/dist/types/modes/acp/acp-agent.d.ts +24 -1
- package/dist/types/sdk/bus/html-format.d.ts +10 -0
- package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +6 -2
- package/dist/types/sdk/bus/telegram-daemon.d.ts +15 -1
- package/dist/types/sdk/bus/telegram-reference.d.ts +10 -0
- package/dist/types/session/agent-session.d.ts +0 -2
- package/dist/types/session/session-manager.d.ts +17 -1
- package/dist/types/tools/index.d.ts +7 -0
- package/package.json +8 -8
- package/src/cli/fast-help.ts +1 -0
- package/src/cli/marketplace-hint.ts +39 -0
- package/src/cli/plugin-cli.ts +10 -0
- package/src/cli.ts +23 -0
- package/src/config/file-lock-gc.ts +47 -26
- package/src/config/model-profiles.ts +18 -18
- package/src/config/model-registry.ts +17 -5
- package/src/config/models-config-schema.ts +9 -4
- package/src/defaults/gjc/skills/deep-interview/SKILL.md +1 -1
- package/src/gjc-runtime/deep-interview-recorder.ts +9 -5
- package/src/gjc-runtime/deep-interview-state.ts +27 -3
- package/src/gjc-runtime/gc-render.ts +8 -1
- package/src/gjc-runtime/gc-runtime.ts +15 -1
- package/src/internal-urls/docs-index.generated.ts +4 -4
- package/src/main.ts +11 -3
- package/src/modes/acp/acp-agent.ts +123 -7
- package/src/modes/components/model-selector.ts +52 -5
- package/src/modes/print-mode.ts +10 -0
- package/src/prompts/system/project-prompt.md +19 -0
- package/src/sdk/bus/html-format.ts +19 -3
- package/src/sdk/bus/index.ts +21 -12
- package/src/sdk/bus/telegram-daemon-contract.ts +6 -2
- package/src/sdk/bus/telegram-daemon.ts +50 -16
- package/src/sdk/bus/telegram-reference.ts +72 -9
- package/src/sdk/session.ts +5 -1
- package/src/session/agent-session.ts +0 -4
- package/src/session/internal/managed-session-storage.ts +24 -2
- package/src/session/session-manager.ts +77 -22
- package/src/setup/provider-presets.json +3 -3
- package/src/thinking-metadata.ts +2 -1
- package/src/tools/ask.ts +10 -0
- package/src/tools/index.ts +7 -0
- package/src/tools/todo-write.ts +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,31 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [0.12.13] - 2026-08-06
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
- ACP session configuration now emits the spec-defined `category` field on the Mode, Model, and Thinking select options (`mode`, `model`, `thought_level`), so standards-compliant ACP clients such as Paseo discover models, modes, and thinking levels instead of an empty model picker (#3922).
|
|
9
|
+
- The ACP session model catalog is now filtered to active providers via `providers.list/active`, falling back to the full catalog on older session hosts, so ACP clients no longer list models for providers without usable credentials (#3922).
|
|
10
|
+
|
|
11
|
+
- `todo_write` now rejects malformed raw arguments with bounded, authority-controlled correction codes instead of a generic rejection: unknown root keys, unknown operation-entry keys, done/drop entries without a task or phase target, and unknown init list-entry keys each surface a fixed message naming the accepted shape without echoing the offending input, while recoverable payloads keep the passthrough/coercion path and the existing ask-tool codes are untouched (#3916).
|
|
12
|
+
- The Alibaba Token Plan onboarding preset and `alibaba-token-plan-qwen-deepseek` profile now reference the provider-supported `qwen3.8-max` model id instead of `qwen-3.8-max`, preventing the built-in profile from selecting an HTTP 400 unsupported model (#3909).
|
|
13
|
+
- `/model` reasoning menu header now shows the highlighted reasoning level (not the model id), seeds the cursor from the role badge when re-editing the same model, and uses a provider-neutral label for `max` instead of "Opus maximum reasoning" (#3847).
|
|
14
|
+
- Resume listing now reverse-scans for buried but canonically valid `header_patch` titles, so a persisted manual title remains visible in the picker after later transcript growth instead of falling back to an empty/line-1 projection (#3633).
|
|
15
|
+
- Custom OpenAI-compatible models whose wire id is namespaced (for example `cline-pass/deepseek-v4-flash`) now inherit capability metadata from the bundled leaf model when `contextWindow` / `maxTokens` are omitted, instead of silently falling back to the generic 128K / 16K defaults. True unknown leaf ids still default; explicit limits remain authoritative (#3856).
|
|
16
|
+
- `gjc gc` file-lock discovery now budgets the walk **per lock root** and reports a hit entry cap as a **warning**, not a hard error. Truncating one root no longer skips the remaining roots, and a healthy run with only cap warnings exits `0` so scripts/cron/`&&` chains stay usable (#3852).
|
|
17
|
+
|
|
18
|
+
- `gjc models` is no longer treated as a free-form agent prompt. The mistaken subcommand spelling now routes to the existing `--list-models` listing path so a nested bash-tool invocation cannot recursively spawn unbounded GJC agents (#3857).
|
|
19
|
+
- Always-apply and rulebook rules are injected on the default system prompt path again. Discovery still loaded `.gjc/rules/`, `~/.gjc/agent/rules/`, and sticky `RULES.md`, but only `custom-system-prompt.md` rendered them, so normal sessions silently dropped the content while AGENTS.md in the same directory continued to work (#3859).
|
|
20
|
+
- Made Telegram reference-client capability diagnostics safe for TUI embedding.
|
|
21
|
+
- Custom `anthropic-messages` providers can now configure `compat.promptCacheMode` (`none`, `explicit`, or `automatic`) and `compat.supportsLongCacheRetention` at provider, model, and model-override levels. This makes the automatic Claude-family caching default safely overridable for compatible endpoints that require block-level cache markers or do not support 1-hour retention.
|
|
22
|
+
- A Telegram notification daemon whose reconciliation pass fails no longer exits. The pass persists through the shared topic authority, and a momentarily unavailable authority (lock contention or a rejected compare-and-set) rejected out of both the scan timer and the run loop into the process-level fatal handler, killing the owner. Every session topic was then left behind as an unarchived shell that answers nothing — including for sessions that were still live and lost their notifications. The pass now reports the failure and the next scan interval retries it; the queue-flush timer is guarded the same way.
|
|
23
|
+
- MiniMax M3 preset and profile ids canonicalized to `MiniMax-M3` (issue #3896): the `minimax` / `minimax-cn` onboarding presets and the `minimax-eco` / `minimax-medium` / `minimax-pro` builtin model profiles no longer reference the removed lowercase `minimax-m3` / `minimax-v3` first-class catalog ids.
|
|
24
|
+
- Deep-interview round identity and input caps are now Unicode-canonical. Question text, selected options, and custom input are canonicalized to NFC before hashing and persisting, so the same Korean answer arriving in decomposed form (macOS-sourced pastes and some IME/clipboard paths emit NFD) no longer produces a second `answer_hash` — the documented append-or-merge no-op holds, and intent-review approval evidence still matches the user's recorded answer. Free-text caps are measured on the NFC form, so decomposed Hangul is charged the same character budget as the identical composed text instead of 2–3 code points per syllable (#3871).
|
|
25
|
+
- Telegram notifications no longer disappear in a paired private chat whose bot has no Threaded Mode. Telegram answers `createForumTopic` there with `Bad Request: the chat is not a forum`, which was not recognized as a capability refusal, and the refusal verdict lived in caller-local flags — so every frame that joined the shared in-flight topic creation rethrew and its message (identity headers after `/resume`, asks, context updates) was dropped instead of being delivered flat. The rejection is now carried by typed errors that every awaiter of the same creation classifies identically, `the chat is not a forum` counts as a capability refusal, and a confirmed refusal is latched so later frames stop re-issuing a rejected `createForumTopic` per message.
|
|
26
|
+
- Slash commands now expand in non-interactive runs. `gjc -p "/init"` previously reached the model as the literal text `/init`, so no command body was injected, no file was written, and the model still answered as if the command had run. Print mode now loads the same bundled and file-based command list interactive mode uses before it prompts.
|
|
27
|
+
- `gjc plugin install <name>` now names the marketplaces that offer `<name>` when the npm resolution it falls back to fails, so a plugin name copied out of `gjc plugin discover` no longer dead-ends on a bare `install_failed`.
|
|
28
|
+
- A remote multi-select ask now shows what is already selected. The ask tool re-issues one remote request per toggle, but the request carried no selection state, so Telegram kept posting an identical prompt with no sign that option 1 had been picked — the checkbox rendering existed only for durable workflow gates. `AskAnswerRequest` now carries `multi` and the selected option labels, the notification bus publishes them as `selectedOptionIndices` with the `(N selected)` question prefix while keeping the ask tool's own Next/Done control, and pre-numbered options (deep interview) are renumbered once instead of rendering as `1. ☑ 1. …`.
|
|
29
|
+
|
|
5
30
|
## [0.12.12] - 2026-08-05
|
|
6
31
|
|
|
7
32
|
### Added
|
|
@@ -15,7 +40,10 @@
|
|
|
15
40
|
|
|
16
41
|
### Fixed
|
|
17
42
|
|
|
43
|
+
- Fixed deep-interview prompts exposing the literal argument placeholder.
|
|
44
|
+
|
|
18
45
|
- Automatic session retry now refuses to re-issue a request once the failed attempt carries observable assistant text, thinking, or tool-call content — including under explicit legacy `retry.*` settings. Content-free clean failures keep their existing bounded/unbounded policy; managed provisional discard, credential rotation, first-event timeout scope checks, and manual `/retry` are unchanged (#3791).
|
|
46
|
+
- Resuming a session whose transcript file is at or above the ~64 MiB managed-storage per-file bound no longer OOMs, stalls the process, or fails with a bare unhandled rejection. Resume/open now fail closed with a structured `oversized` reason (`SessionTranscriptOversizedError`) and recovery guidance before the full read/decode/parse path, instead of loading the entire file into memory. The bound matches the existing managed-artifact per-file limit and is not raised; sub-limit sessions resume unchanged (#3851).
|
|
19
47
|
|
|
20
48
|
- Parent sessions and their subagent trees now share one identity-authorized artifact manager across persistent and ephemeral operation. Non-persistent roots are retired on committed session transitions and terminal close, failed transitions retain predecessor ownership, and atomic numeric-ID claims prevent same-root managers from creating ambiguous artifact references (#3813).
|
|
21
49
|
|
|
@@ -82,6 +110,8 @@
|
|
|
82
110
|
- Windows automatic tmux resolution now selects `psmux` then `pmux` by canonical command order without rejecting distinct lower-priority aliases; it probes `tmux` only when neither named provider is available (#3725).
|
|
83
111
|
- CI failure extraction now aggregates Bun failure and suite-error summaries across every test invocation in a job log instead of silently using only the first summary.
|
|
84
112
|
- The GitHub status-line lookup now binds terminal links to positive PR numbers and canonical matching HTTP(S) pull-request URLs, rejecting ambiguous or control-bearing targets.
|
|
113
|
+
- Fork-context subagents no longer inherit the parent's provider continuity identity. Each child session now presents its own `session_id`/`prompt_cache_key`, so concurrent subagent fleets stop colliding on session-owning upstream transports (`owner_busy` websocket-to-HTTP fallbacks) and keep per-worker cache affinity. Explicit `providerSessionId` overrides and serial same-session continuity are unchanged.
|
|
114
|
+
- Fork-context subagents no longer inherit the parent's provider continuity identity. Each child session now presents its own `session_id`/`prompt_cache_key`, so concurrent subagent fleets stop colliding on session-owning upstream transports (`owner_busy` websocket-to-HTTP fallbacks) and keep per-worker cache affinity. Because `providerSessionId` scopes sticky credential selection as well as prompt-cache affinity, each child also selects its provider credential independently instead of following the parent's sticky choice. Explicit `providerSessionId` overrides and serial same-session continuity are unchanged.
|
|
85
115
|
- Ordinary `ask` selectors now bound long question premises and page through every premise row without skipping rows hidden by overflow indicators (#3675).
|
|
86
116
|
- First-event timeout retries now require a typed, content-free failure from the current clean attempt scope, preventing prior or stale extension activity from suppressing or admitting a later request (#3553).
|
|
87
117
|
- The issue-1979 Korean prose wrap test now cleans up inherited multiplexer env vars (`TMUX`, `TMUX_PANE`, etc.) so it deterministically exercises the plain-terminal render path regardless of the CI runner's terminal session (#1979).
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Install-failure hints for marketplace-shaped plugin names.
|
|
3
|
+
*
|
|
4
|
+
* A bare spec (no `@marketplace`) is always classified as npm, so a user who
|
|
5
|
+
* copies a plugin name out of `plugin discover` gets an npm resolution failure
|
|
6
|
+
* with no hint that the same name is offered by a registered marketplace.
|
|
7
|
+
*
|
|
8
|
+
* Kept dependency-free — the marketplace barrel loads native addons — so this
|
|
9
|
+
* takes the narrow catalog surface it actually reads instead of the manager.
|
|
10
|
+
*/
|
|
11
|
+
/** The catalog lookups this module needs; `MarketplaceManager` satisfies it. */
|
|
12
|
+
export interface MarketplaceCatalogLookup {
|
|
13
|
+
listMarketplaces(): Promise<ReadonlyArray<{
|
|
14
|
+
name: string;
|
|
15
|
+
}>>;
|
|
16
|
+
getPluginInfo(name: string, marketplace: string): Promise<unknown | null>;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* A bare name carries no `@scope`, version specifier, or path separator, so it
|
|
20
|
+
* is the only install spec shape that is safe to echo back in an error.
|
|
21
|
+
*/
|
|
22
|
+
export declare function isBareInstallName(spec: string): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Names of registered marketplaces whose catalog offers a plugin under exactly
|
|
25
|
+
* `name`. Only marketplace names are returned: they are user-chosen registry
|
|
26
|
+
* labels, never the plugin source, so they carry no credentials or home paths.
|
|
27
|
+
*/
|
|
28
|
+
export declare function findMarketplacesOffering(catalogs: MarketplaceCatalogLookup, name: string): Promise<string[]>;
|
package/dist/types/cli.d.ts
CHANGED
|
@@ -144,6 +144,16 @@ export declare class RootHelpCommand extends Command {
|
|
|
144
144
|
}
|
|
145
145
|
/** Normalize the sole `gjc resume` alias into the value-less launch intent. */
|
|
146
146
|
export declare function normalizeResumeAlias(argv: readonly string[]): string[];
|
|
147
|
+
/**
|
|
148
|
+
* Map the common mistaken `models` subcommand spelling to non-agent listing.
|
|
149
|
+
*
|
|
150
|
+
* Agents frequently run `gjc models` from the bash tool expecting a catalog.
|
|
151
|
+
* Without this route, `models` was a positional launch prompt and nested agents
|
|
152
|
+
* re-invoked `gjc models`, spawning an unbounded process chain (#3857).
|
|
153
|
+
* Always rewrite to `launch --list-models` so the invocation exits after a
|
|
154
|
+
* bounded listing and never starts an interactive agent session.
|
|
155
|
+
*/
|
|
156
|
+
export declare function routeModelsAlias(argv: readonly string[]): string[] | undefined;
|
|
147
157
|
/** Apply the same default-launch routing used by runCli after root fast paths. */
|
|
148
158
|
export declare function routeRootArgv(argv: readonly string[]): string[];
|
|
149
159
|
/** Run the CLI with the given argv (no `process.argv` prefix). */
|
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* GC adapter for config file-locks (`<file>.lock` dirs holding `{pid, timestamp}`).
|
|
3
3
|
*/
|
|
4
|
-
import type { GcStoreAdapter } from "../gjc-runtime/gc-runtime";
|
|
4
|
+
import type { GcCollectResult, GcContext, GcStoreAdapter } from "../gjc-runtime/gc-runtime";
|
|
5
|
+
/** Default per-root walk budget. Truncation is a warning, not a hard error. */
|
|
6
|
+
export declare const FILE_LOCK_GC_MAX_WALK_ENTRIES = 20000;
|
|
7
|
+
export interface FileLocksGcCollectOptions {
|
|
8
|
+
/** Override per-root entry budget (tests). Defaults to {@link FILE_LOCK_GC_MAX_WALK_ENTRIES}. */
|
|
9
|
+
maxWalkEntries?: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Discover + classify file-lock records. Each known lock root gets its own walk
|
|
13
|
+
* budget so truncating one root never skips the others. Caps surface as
|
|
14
|
+
* warnings (partial results), not hard discovery errors.
|
|
15
|
+
*/
|
|
16
|
+
export declare function collectFileLocksForGc(ctx: GcContext, options?: FileLocksGcCollectOptions): Promise<GcCollectResult>;
|
|
5
17
|
export declare const fileLocksGcAdapter: GcStoreAdapter;
|
|
@@ -94,6 +94,8 @@ export declare const ModelsConfigFile: ConfigFile<{
|
|
|
94
94
|
extraBody?: Record<string, unknown> | undefined;
|
|
95
95
|
supportsStrictMode?: boolean | undefined;
|
|
96
96
|
toolStrictMode?: "all_strict" | "none" | undefined;
|
|
97
|
+
supportsLongCacheRetention?: boolean | undefined;
|
|
98
|
+
promptCacheMode?: "automatic" | "explicit" | "none" | undefined;
|
|
97
99
|
} | undefined;
|
|
98
100
|
webSearch?: "auto" | "off" | "on" | undefined;
|
|
99
101
|
authHeader?: boolean | undefined;
|
|
@@ -173,6 +175,8 @@ export declare const ModelsConfigFile: ConfigFile<{
|
|
|
173
175
|
extraBody?: Record<string, unknown> | undefined;
|
|
174
176
|
supportsStrictMode?: boolean | undefined;
|
|
175
177
|
toolStrictMode?: "all_strict" | "none" | undefined;
|
|
178
|
+
supportsLongCacheRetention?: boolean | undefined;
|
|
179
|
+
promptCacheMode?: "automatic" | "explicit" | "none" | undefined;
|
|
176
180
|
} | undefined;
|
|
177
181
|
contextPromotionTarget?: string | undefined;
|
|
178
182
|
wireModelId?: string | undefined;
|
|
@@ -247,6 +251,8 @@ export declare const ModelsConfigFile: ConfigFile<{
|
|
|
247
251
|
extraBody?: Record<string, unknown> | undefined;
|
|
248
252
|
supportsStrictMode?: boolean | undefined;
|
|
249
253
|
toolStrictMode?: "all_strict" | "none" | undefined;
|
|
254
|
+
supportsLongCacheRetention?: boolean | undefined;
|
|
255
|
+
promptCacheMode?: "automatic" | "explicit" | "none" | undefined;
|
|
250
256
|
} | undefined;
|
|
251
257
|
contextPromotionTarget?: string | undefined;
|
|
252
258
|
wireModelId?: string | undefined;
|
|
@@ -1,4 +1,73 @@
|
|
|
1
1
|
import * as z from "zod/v4";
|
|
2
|
+
export declare const ModelCompatSchema: z.ZodObject<{
|
|
3
|
+
supportsStore: z.ZodOptional<z.ZodBoolean>;
|
|
4
|
+
supportsDeveloperRole: z.ZodOptional<z.ZodBoolean>;
|
|
5
|
+
sendSessionHeaders: z.ZodOptional<z.ZodBoolean>;
|
|
6
|
+
supportsMultipleSystemMessages: z.ZodOptional<z.ZodBoolean>;
|
|
7
|
+
supportsReasoningEffort: z.ZodOptional<z.ZodBoolean>;
|
|
8
|
+
reasoningEffortMap: z.ZodOptional<z.ZodObject<{
|
|
9
|
+
minimal: z.ZodOptional<z.ZodString>;
|
|
10
|
+
low: z.ZodOptional<z.ZodString>;
|
|
11
|
+
medium: z.ZodOptional<z.ZodString>;
|
|
12
|
+
high: z.ZodOptional<z.ZodString>;
|
|
13
|
+
xhigh: z.ZodOptional<z.ZodString>;
|
|
14
|
+
max: z.ZodOptional<z.ZodString>;
|
|
15
|
+
}, z.core.$strip>>;
|
|
16
|
+
maxTokensField: z.ZodOptional<z.ZodEnum<{
|
|
17
|
+
max_completion_tokens: "max_completion_tokens";
|
|
18
|
+
max_tokens: "max_tokens";
|
|
19
|
+
}>>;
|
|
20
|
+
supportsUsageInStreaming: z.ZodOptional<z.ZodBoolean>;
|
|
21
|
+
requiresToolResultName: z.ZodOptional<z.ZodBoolean>;
|
|
22
|
+
requiresMistralToolIds: z.ZodOptional<z.ZodBoolean>;
|
|
23
|
+
requiresAssistantAfterToolResult: z.ZodOptional<z.ZodBoolean>;
|
|
24
|
+
requiresThinkingAsText: z.ZodOptional<z.ZodBoolean>;
|
|
25
|
+
reasoningContentField: z.ZodOptional<z.ZodEnum<{
|
|
26
|
+
reasoning: "reasoning";
|
|
27
|
+
reasoning_content: "reasoning_content";
|
|
28
|
+
reasoning_text: "reasoning_text";
|
|
29
|
+
}>>;
|
|
30
|
+
requiresReasoningContentForToolCalls: z.ZodOptional<z.ZodBoolean>;
|
|
31
|
+
allowsSyntheticReasoningContentForToolCalls: z.ZodOptional<z.ZodBoolean>;
|
|
32
|
+
requiresAssistantContentForToolCalls: z.ZodOptional<z.ZodBoolean>;
|
|
33
|
+
supportsToolChoice: z.ZodOptional<z.ZodBoolean>;
|
|
34
|
+
supportsForcedToolChoice: z.ZodOptional<z.ZodBoolean>;
|
|
35
|
+
toolChoiceSupport: z.ZodOptional<z.ZodEnum<{
|
|
36
|
+
auto: "auto";
|
|
37
|
+
named: "named";
|
|
38
|
+
none: "none";
|
|
39
|
+
required: "required";
|
|
40
|
+
}>>;
|
|
41
|
+
disableReasoningOnForcedToolChoice: z.ZodOptional<z.ZodBoolean>;
|
|
42
|
+
disableReasoningOnToolChoice: z.ZodOptional<z.ZodBoolean>;
|
|
43
|
+
thinkingFormat: z.ZodOptional<z.ZodEnum<{
|
|
44
|
+
openai: "openai";
|
|
45
|
+
openrouter: "openrouter";
|
|
46
|
+
qwen: "qwen";
|
|
47
|
+
"qwen-chat-template": "qwen-chat-template";
|
|
48
|
+
zai: "zai";
|
|
49
|
+
}>>;
|
|
50
|
+
openRouterRouting: z.ZodOptional<z.ZodObject<{
|
|
51
|
+
only: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
52
|
+
order: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
53
|
+
}, z.core.$strip>>;
|
|
54
|
+
vercelGatewayRouting: z.ZodOptional<z.ZodObject<{
|
|
55
|
+
only: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
56
|
+
order: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
57
|
+
}, z.core.$strip>>;
|
|
58
|
+
extraBody: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
59
|
+
supportsStrictMode: z.ZodOptional<z.ZodBoolean>;
|
|
60
|
+
toolStrictMode: z.ZodOptional<z.ZodEnum<{
|
|
61
|
+
all_strict: "all_strict";
|
|
62
|
+
none: "none";
|
|
63
|
+
}>>;
|
|
64
|
+
supportsLongCacheRetention: z.ZodOptional<z.ZodBoolean>;
|
|
65
|
+
promptCacheMode: z.ZodOptional<z.ZodEnum<{
|
|
66
|
+
automatic: "automatic";
|
|
67
|
+
explicit: "explicit";
|
|
68
|
+
none: "none";
|
|
69
|
+
}>>;
|
|
70
|
+
}, z.core.$strip>;
|
|
2
71
|
export declare const OpenAICompatSchema: z.ZodObject<{
|
|
3
72
|
supportsStore: z.ZodOptional<z.ZodBoolean>;
|
|
4
73
|
supportsDeveloperRole: z.ZodOptional<z.ZodBoolean>;
|
|
@@ -61,6 +130,12 @@ export declare const OpenAICompatSchema: z.ZodObject<{
|
|
|
61
130
|
all_strict: "all_strict";
|
|
62
131
|
none: "none";
|
|
63
132
|
}>>;
|
|
133
|
+
supportsLongCacheRetention: z.ZodOptional<z.ZodBoolean>;
|
|
134
|
+
promptCacheMode: z.ZodOptional<z.ZodEnum<{
|
|
135
|
+
automatic: "automatic";
|
|
136
|
+
explicit: "explicit";
|
|
137
|
+
none: "none";
|
|
138
|
+
}>>;
|
|
64
139
|
}, z.core.$strip>;
|
|
65
140
|
export declare const GJC_MODEL_EFFORT_IDS: readonly ["minimal", "low", "medium", "high", "xhigh", "max"];
|
|
66
141
|
export declare const GJC_MODEL_ASSIGNMENT_TARGET_IDS: readonly ["default", "executor", "architect", "planner", "critic"];
|
|
@@ -238,6 +313,12 @@ export declare const ModelOverrideSchema: z.ZodObject<{
|
|
|
238
313
|
all_strict: "all_strict";
|
|
239
314
|
none: "none";
|
|
240
315
|
}>>;
|
|
316
|
+
supportsLongCacheRetention: z.ZodOptional<z.ZodBoolean>;
|
|
317
|
+
promptCacheMode: z.ZodOptional<z.ZodEnum<{
|
|
318
|
+
automatic: "automatic";
|
|
319
|
+
explicit: "explicit";
|
|
320
|
+
none: "none";
|
|
321
|
+
}>>;
|
|
241
322
|
}, z.core.$strip>>;
|
|
242
323
|
contextPromotionTarget: z.ZodOptional<z.ZodString>;
|
|
243
324
|
wireModelId: z.ZodOptional<z.ZodString>;
|
|
@@ -352,6 +433,12 @@ export declare const ModelsConfigSchema: z.ZodObject<{
|
|
|
352
433
|
all_strict: "all_strict";
|
|
353
434
|
none: "none";
|
|
354
435
|
}>>;
|
|
436
|
+
supportsLongCacheRetention: z.ZodOptional<z.ZodBoolean>;
|
|
437
|
+
promptCacheMode: z.ZodOptional<z.ZodEnum<{
|
|
438
|
+
automatic: "automatic";
|
|
439
|
+
explicit: "explicit";
|
|
440
|
+
none: "none";
|
|
441
|
+
}>>;
|
|
355
442
|
}, z.core.$strip>>;
|
|
356
443
|
webSearch: z.ZodOptional<z.ZodEnum<{
|
|
357
444
|
auto: "auto";
|
|
@@ -519,6 +606,12 @@ export declare const ModelsConfigSchema: z.ZodObject<{
|
|
|
519
606
|
all_strict: "all_strict";
|
|
520
607
|
none: "none";
|
|
521
608
|
}>>;
|
|
609
|
+
supportsLongCacheRetention: z.ZodOptional<z.ZodBoolean>;
|
|
610
|
+
promptCacheMode: z.ZodOptional<z.ZodEnum<{
|
|
611
|
+
automatic: "automatic";
|
|
612
|
+
explicit: "explicit";
|
|
613
|
+
none: "none";
|
|
614
|
+
}>>;
|
|
522
615
|
}, z.core.$strip>>;
|
|
523
616
|
contextPromotionTarget: z.ZodOptional<z.ZodString>;
|
|
524
617
|
wireModelId: z.ZodOptional<z.ZodString>;
|
|
@@ -660,6 +753,12 @@ export declare const ModelsConfigSchema: z.ZodObject<{
|
|
|
660
753
|
all_strict: "all_strict";
|
|
661
754
|
none: "none";
|
|
662
755
|
}>>;
|
|
756
|
+
supportsLongCacheRetention: z.ZodOptional<z.ZodBoolean>;
|
|
757
|
+
promptCacheMode: z.ZodOptional<z.ZodEnum<{
|
|
758
|
+
automatic: "automatic";
|
|
759
|
+
explicit: "explicit";
|
|
760
|
+
none: "none";
|
|
761
|
+
}>>;
|
|
663
762
|
}, z.core.$strip>>;
|
|
664
763
|
contextPromotionTarget: z.ZodOptional<z.ZodString>;
|
|
665
764
|
wireModelId: z.ZodOptional<z.ZodString>;
|
|
@@ -76,6 +76,18 @@ export interface DeepInterviewStateEnvelope {
|
|
|
76
76
|
[key: string]: unknown;
|
|
77
77
|
}
|
|
78
78
|
export declare function hashContent(value: string): string;
|
|
79
|
+
/**
|
|
80
|
+
* Canonicalize interview prose to NFC.
|
|
81
|
+
*
|
|
82
|
+
* Hangul, unlike most Latin prose, routinely reaches the interview in both
|
|
83
|
+
* composed and decomposed form (macOS-sourced pastes and some IME/clipboard
|
|
84
|
+
* paths emit NFD), and the two forms are the same text for the user while
|
|
85
|
+
* being different JavaScript strings. Canonicalizing at the identity and
|
|
86
|
+
* length boundaries keeps one round per answer and keeps the character caps
|
|
87
|
+
* script-fair: decomposed Hangul otherwise costs two to three code points per
|
|
88
|
+
* syllable against the same budget.
|
|
89
|
+
*/
|
|
90
|
+
export declare function canonicalizeDeepInterviewText(value: string): string;
|
|
79
91
|
export declare function questionHash(questionText: string): string;
|
|
80
92
|
export declare function answerHash(selectedOptions: string[] | undefined, customInput: string | undefined): string;
|
|
81
93
|
/**
|
|
@@ -151,6 +163,8 @@ export declare function assertDeepInterviewStructuredResponseWithinLimit(value:
|
|
|
151
163
|
/**
|
|
152
164
|
* Assert a free-text input is within its size cap. Never inspects content for shell
|
|
153
165
|
* metacharacters — free-text fields accept prose verbatim; this only bounds length.
|
|
166
|
+
* The cap is measured on the NFC form so decomposed Hangul is charged the same
|
|
167
|
+
* budget as the identical composed text.
|
|
154
168
|
*/
|
|
155
169
|
export declare function assertDeepInterviewInputWithinLimit(value: string, max: number, fieldName?: string): void;
|
|
156
170
|
/** Validate user-supplied deep-interview prose before an envelope is persisted. */
|
|
@@ -49,9 +49,17 @@ export interface GcError {
|
|
|
49
49
|
scope: string;
|
|
50
50
|
message: string;
|
|
51
51
|
}
|
|
52
|
+
/** Non-fatal discovery partials (e.g. traversal caps). Does not affect exit code. */
|
|
53
|
+
export interface GcWarning {
|
|
54
|
+
store: GcStore;
|
|
55
|
+
scope: string;
|
|
56
|
+
message: string;
|
|
57
|
+
}
|
|
52
58
|
export interface GcCollectResult {
|
|
53
59
|
records: GcRecord[];
|
|
54
60
|
errors: GcError[];
|
|
61
|
+
/** Optional partial-result notices; omitted by adapters that have none. */
|
|
62
|
+
warnings?: GcWarning[];
|
|
55
63
|
}
|
|
56
64
|
export interface GcPruneOutcome {
|
|
57
65
|
removed: boolean;
|
|
@@ -108,6 +116,8 @@ export interface GcReport {
|
|
|
108
116
|
stores: Record<GcStore, GcRecord[]>;
|
|
109
117
|
counts: GcCounts;
|
|
110
118
|
errors: GcError[];
|
|
119
|
+
/** Partial-result notices that do not fail the run (e.g. walk caps). */
|
|
120
|
+
warnings: GcWarning[];
|
|
111
121
|
session_index?: GcSessionIndexHealth;
|
|
112
122
|
}
|
|
113
123
|
export interface GcRunResult {
|
|
@@ -134,6 +144,7 @@ export declare function collectGcReport(adapters: GcStoreAdapter[], ctx: GcConte
|
|
|
134
144
|
* - usage/parse error => 2
|
|
135
145
|
* - hard discovery errors => 1 (both modes)
|
|
136
146
|
* - prune mode with a failed intended removal => 1
|
|
147
|
+
* - warnings alone never fail the run
|
|
137
148
|
* - otherwise => 0
|
|
138
149
|
*/
|
|
139
150
|
export declare function computeExitCode(report: GcReport): number;
|
|
@@ -32,11 +32,32 @@ export interface TranscriptReplayContent {
|
|
|
32
32
|
};
|
|
33
33
|
}
|
|
34
34
|
export declare function transcriptReplayContent(entry: unknown): TranscriptReplayContent;
|
|
35
|
+
/**
|
|
36
|
+
* Collect every page of `providers.list/active` (Q29, GJC >= 0.12.8) and
|
|
37
|
+
* return the providers with usable stored credentials or credentialless
|
|
38
|
+
* connection kinds, mirroring the TUI model picker's
|
|
39
|
+
* `modelRegistry.getAvailable()`. The openwebui-gjc-adapter applies the same
|
|
40
|
+
* filter to `/v1/models`. Q29 pages are byte-bounded and can span multiple
|
|
41
|
+
* pages when custom provider ids inflate the payload, so all pages are
|
|
42
|
+
* consumed before the provider set is built. Returns undefined only when the
|
|
43
|
+
* session host rejects the query with `operation_not_session_owned`; any
|
|
44
|
+
* other query failure or malformed page is thrown.
|
|
45
|
+
*/
|
|
46
|
+
export declare function collectActiveProviderIds(adapter: Pick<AcpSdkAdapter, "query">): Promise<ReadonlySet<string> | undefined>;
|
|
47
|
+
/**
|
|
48
|
+
* Collect every page of `models.list/current` (Q10) into one catalog so the
|
|
49
|
+
* active-provider filter never drops models that only appear on later pages.
|
|
50
|
+
* The SDK pages Q10 at a fixed byte target (256 KiB), which a fully
|
|
51
|
+
* configured catalog can exceed. Returns the same
|
|
52
|
+
* `{ result: { page: { items } } }` envelope `pageItems` consumes.
|
|
53
|
+
*/
|
|
54
|
+
export declare function collectModelCatalog(adapter: Pick<AcpSdkAdapter, "query">): Promise<unknown>;
|
|
35
55
|
/** Maps live canonical SDK config and the selected model catalog into the ACP 1.2.1 session state surface. */
|
|
36
|
-
export declare function acpSessionStateFromConfig(query: unknown, modelCatalogQuery?: unknown, modelPreset?: string): {
|
|
56
|
+
export declare function acpSessionStateFromConfig(query: unknown, modelCatalogQuery?: unknown, modelPreset?: string, activeProviders?: ReadonlySet<string>): {
|
|
37
57
|
configOptions: ({
|
|
38
58
|
id: string;
|
|
39
59
|
name: string;
|
|
60
|
+
category: "mode";
|
|
40
61
|
type: "select";
|
|
41
62
|
currentValue: string;
|
|
42
63
|
options: {
|
|
@@ -46,6 +67,7 @@ export declare function acpSessionStateFromConfig(query: unknown, modelCatalogQu
|
|
|
46
67
|
} | {
|
|
47
68
|
id: "model";
|
|
48
69
|
name: string;
|
|
70
|
+
category: "model";
|
|
49
71
|
type: "select";
|
|
50
72
|
currentValue: string;
|
|
51
73
|
options: {
|
|
@@ -73,6 +95,7 @@ export declare function acpSessionStateFromConfig(query: unknown, modelCatalogQu
|
|
|
73
95
|
} | {
|
|
74
96
|
id: "thinking";
|
|
75
97
|
name: string;
|
|
98
|
+
category: "thought_level";
|
|
76
99
|
type: "select";
|
|
77
100
|
currentValue: string;
|
|
78
101
|
options: {
|
|
@@ -43,6 +43,16 @@ export declare function truncateTelegramHtml(message: string, max?: number, mark
|
|
|
43
43
|
export declare function splitTelegramHtml(message: string, max?: number): string[];
|
|
44
44
|
/** Finalize an optional message: undefined passthrough, else safe-truncate. */
|
|
45
45
|
export declare function finalizeTelegramHtml(message?: string): string | undefined;
|
|
46
|
+
/** Multi-select state marker a transport may prepend to an option label. */
|
|
47
|
+
export declare const SELECTION_MARK_CHECKED = "\u2611";
|
|
48
|
+
export declare const SELECTION_MARK_UNCHECKED = "\u2610";
|
|
49
|
+
/**
|
|
50
|
+
* Drop a leading `N.`/`N)` index already embedded in an option label (e.g.
|
|
51
|
+
* deep-interview options pre-numbered by the ask tool) so the canonical
|
|
52
|
+
* one-based index can be applied instead. A selection marker stays in front of
|
|
53
|
+
* the text: the label is renumbered, not un-marked.
|
|
54
|
+
*/
|
|
55
|
+
export declare function renumberableOptionText(label: string): string;
|
|
46
56
|
/**
|
|
47
57
|
* One-based, plain-text button label (Telegram does not parse HTML in labels).
|
|
48
58
|
*
|
|
@@ -73,9 +73,13 @@ export declare const NOTIFICATION_PROTOCOL_VERSION = 3;
|
|
|
73
73
|
* final-component file symlinks fail-closed under AT_SYMLINK_NOFOLLOW (bounded
|
|
74
74
|
* #3761 multi-account activation repair). Generation 51 adds shared durable
|
|
75
75
|
* topic authority, archive recovery, and requires Telegram's documented error
|
|
76
|
-
* code for idempotent archive settlement.
|
|
76
|
+
* code for idempotent archive settlement. Generation 52 is claimed by the
|
|
77
|
+
* pre-readiness daemon-child exit diagnostics slice (#3761). Generation 53
|
|
78
|
+
* renders multi-select state for ask-tool asks, not only durable workflow
|
|
79
|
+
* gates, and renumbers pre-numbered options exactly once around the selection
|
|
80
|
+
* marker.
|
|
77
81
|
*/
|
|
78
|
-
export declare const DAEMON_GENERATION =
|
|
82
|
+
export declare const DAEMON_GENERATION = 53;
|
|
79
83
|
/**
|
|
80
84
|
* Serving-compatibility boundary for daemon lifecycle requests. Epoch 5
|
|
81
85
|
* requires the complete generation-36 topic authority contract, so older
|
|
@@ -990,6 +990,8 @@ export declare class TelegramNotificationDaemon {
|
|
|
990
990
|
private readonly flatIdentitySent;
|
|
991
991
|
/** Cached delivery boundary for the private owner chat or validation forum. */
|
|
992
992
|
private pairedChatPrivacy;
|
|
993
|
+
/** Latched once Telegram confirms this chat cannot host forum topics. */
|
|
994
|
+
private topicCapabilityRefused;
|
|
993
995
|
/** Bot username from getMe, cached once at owner startup for group/forum command targeting. */
|
|
994
996
|
private botUsername;
|
|
995
997
|
/** Sessions whose agent loop is currently busy (drives the typing indicator). */
|
|
@@ -1229,7 +1231,19 @@ export declare class TelegramNotificationDaemon {
|
|
|
1229
1231
|
*/
|
|
1230
1232
|
private startOwnershipHeartbeatTimer;
|
|
1231
1233
|
private stopOwnershipHeartbeatTimer;
|
|
1232
|
-
/**
|
|
1234
|
+
/**
|
|
1235
|
+
* Run a root scan, guarding against overlapping scans from the timer + loop.
|
|
1236
|
+
*
|
|
1237
|
+
* A reconciliation pass is retried every scan interval, so a failed one must
|
|
1238
|
+
* never tear the owner down. Both callers are fatal boundaries: the timer
|
|
1239
|
+
* fires and forgets, and the run loop awaits without a handler. A rejection
|
|
1240
|
+
* escaping either one (a shared topic authority whose lock or compare-and-set
|
|
1241
|
+
* is momentarily unavailable is the observed case) reaches the process-level
|
|
1242
|
+
* handler, which exits the daemon: every session topic is then left as an
|
|
1243
|
+
* unarchived shell that answers nothing, and the sessions that were still
|
|
1244
|
+
* live lose notifications too. Report the failure and let the next scan
|
|
1245
|
+
* retry instead.
|
|
1246
|
+
*/
|
|
1233
1247
|
private runScan;
|
|
1234
1248
|
private startScanTimer;
|
|
1235
1249
|
private stopScanTimer;
|
|
@@ -139,6 +139,11 @@ export declare function readEndpoint(path: string): {
|
|
|
139
139
|
pid?: number;
|
|
140
140
|
stale?: boolean;
|
|
141
141
|
};
|
|
142
|
+
/** A bounded, diagnostic-only notification mirrored to reference-client embedders. */
|
|
143
|
+
export type TelegramReferenceDiagnostic = Readonly<{
|
|
144
|
+
code: "action_unavailable";
|
|
145
|
+
requiredCapabilities: readonly string[];
|
|
146
|
+
}>;
|
|
142
147
|
/** Options for {@link runTelegramReferenceClient}. */
|
|
143
148
|
export interface TelegramReferenceOptions {
|
|
144
149
|
botToken: string;
|
|
@@ -147,6 +152,11 @@ export interface TelegramReferenceOptions {
|
|
|
147
152
|
apiBase?: string;
|
|
148
153
|
fetchImpl?: typeof fetch;
|
|
149
154
|
sound?: TelegramNotificationSound;
|
|
155
|
+
/**
|
|
156
|
+
* Additive mirror of bounded logger diagnostics. It never receives tokens,
|
|
157
|
+
* identifiers, raw frames, Telegram content, or WebSocket replies.
|
|
158
|
+
*/
|
|
159
|
+
onDiagnostic?: (diagnostic: TelegramReferenceDiagnostic) => void;
|
|
150
160
|
}
|
|
151
161
|
/**
|
|
152
162
|
* Run the reference bridge until the WebSocket closes. Sends `action_needed` to
|
|
@@ -58,14 +58,12 @@ export interface ForkContextSeed {
|
|
|
58
58
|
messages: Message[];
|
|
59
59
|
agentMessages: AgentMessage[];
|
|
60
60
|
metadata: ForkContextSeedMetadata;
|
|
61
|
-
cacheIdentity?: string;
|
|
62
61
|
appendOnlyPrefixSnapshot?: StablePrefixSnapshot;
|
|
63
62
|
}
|
|
64
63
|
export interface ForkContextSeedOptions {
|
|
65
64
|
maxMessages: number;
|
|
66
65
|
maxTokens: number;
|
|
67
66
|
preserveLatestUser?: boolean;
|
|
68
|
-
cacheIdentity?: string;
|
|
69
67
|
signal?: AbortSignal;
|
|
70
68
|
}
|
|
71
69
|
import { type AsyncJob, type AsyncJobDeliveryState, AsyncJobManager } from "../async";
|
|
@@ -346,10 +346,20 @@ export interface ResumeTailTerminal {
|
|
|
346
346
|
}
|
|
347
347
|
export interface ResumeTailError {
|
|
348
348
|
kind: "error";
|
|
349
|
-
reason: "missing" | "malformed" | "unstable" | "read-failed" | "legacy_migration_disabled";
|
|
349
|
+
reason: "missing" | "malformed" | "unstable" | "read-failed" | "legacy_migration_disabled" | "oversized";
|
|
350
|
+
size?: number;
|
|
350
351
|
}
|
|
351
352
|
export type SessionDirectoryMigrationPolicy = ManagedMigrationPolicy;
|
|
352
353
|
export type SessionAppendPersistenceFailurePhase = "current_append" | "prior_failure";
|
|
354
|
+
/**
|
|
355
|
+
* Safety bound for resuming a single transcript file. Matches the managed-storage
|
|
356
|
+
* per-file artifact limit (`MANAGED_ARTIFACT_MAX_FILE_BYTES`): transcripts at or above
|
|
357
|
+
* this size are not loaded into memory wholesale because the decode + per-line JSON
|
|
358
|
+
* parse + identity hash would OOM or stall the process (#3851). The bound is a
|
|
359
|
+
* load-time guard only; it does not raise the on-disk managed-storage limit.
|
|
360
|
+
*/
|
|
361
|
+
export declare const RESUME_TRANSCRIPT_MAX_BYTES: number;
|
|
362
|
+
export declare const SESSION_OVERSIZED_RECOVERY_MESSAGE = "The selected session transcript is too large to resume safely. Use `gjc export <session-file>` to export its content into a new session, or remove/archive it after confirming its content is no longer needed.";
|
|
353
363
|
export declare class SessionAppendPersistenceError extends Error {
|
|
354
364
|
readonly phase: SessionAppendPersistenceFailurePhase;
|
|
355
365
|
readonly entryId: string;
|
|
@@ -368,6 +378,11 @@ export declare class SessionArtifactCapacityError extends Error {
|
|
|
368
378
|
readonly code = "artifact_capacity_exceeded";
|
|
369
379
|
constructor(message: string);
|
|
370
380
|
}
|
|
381
|
+
export declare class SessionTranscriptOversizedError extends Error {
|
|
382
|
+
readonly code = "oversized";
|
|
383
|
+
readonly size: number;
|
|
384
|
+
constructor(size: number);
|
|
385
|
+
}
|
|
371
386
|
export type ResumeTailInspection = ResumeTailResumable | ResumeTailTerminal | ResumeTailError;
|
|
372
387
|
export interface StrictSessionOpenSuccess {
|
|
373
388
|
kind: "opened";
|
|
@@ -377,6 +392,7 @@ export interface StrictSessionOpenFailure {
|
|
|
377
392
|
kind: "error";
|
|
378
393
|
reason: ResumeTailError["reason"] | "identity-mismatch" | "migration-required" | "artifact_capacity_exceeded" | "migration_busy";
|
|
379
394
|
message?: string;
|
|
395
|
+
size?: number;
|
|
380
396
|
}
|
|
381
397
|
/** Exact transcript bytes and authority captured from one descriptor-bound read. */
|
|
382
398
|
export interface CapturedSessionTranscriptSnapshot {
|
|
@@ -84,6 +84,13 @@ export interface AskAnswerRequest {
|
|
|
84
84
|
controls: readonly AskRemoteControl[];
|
|
85
85
|
/** Optional zero-based recommendation into the authoritative raw options. */
|
|
86
86
|
recommendedIndex?: number;
|
|
87
|
+
/** True while the question accepts several options before the navigation control commits. */
|
|
88
|
+
multi?: boolean;
|
|
89
|
+
/**
|
|
90
|
+
* Options currently selected in the multi-select loop, as authoritative option
|
|
91
|
+
* labels. Remote transports render the selection state so a toggle is visible.
|
|
92
|
+
*/
|
|
93
|
+
selectedOptions?: readonly string[];
|
|
87
94
|
}
|
|
88
95
|
export type AskRemoteInteraction = {
|
|
89
96
|
kind: "value";
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "module",
|
|
3
3
|
"name": "@gajae-code/coding-agent",
|
|
4
|
-
"version": "0.12.
|
|
4
|
+
"version": "0.12.13",
|
|
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",
|
|
@@ -53,13 +53,13 @@
|
|
|
53
53
|
"@agentclientprotocol/sdk": "1.3.0",
|
|
54
54
|
"@babel/parser": "^7.29.3",
|
|
55
55
|
"@mozilla/readability": "^0.6.0",
|
|
56
|
-
"@gajae-code/stats": "0.12.
|
|
57
|
-
"@gajae-code/agent-core": "0.12.
|
|
58
|
-
"@gajae-code/ai": "0.12.
|
|
59
|
-
"@gajae-code/bridge-client": "0.12.
|
|
60
|
-
"@gajae-code/natives": "0.12.
|
|
61
|
-
"@gajae-code/tui": "0.12.
|
|
62
|
-
"@gajae-code/utils": "0.12.
|
|
56
|
+
"@gajae-code/stats": "0.12.13",
|
|
57
|
+
"@gajae-code/agent-core": "0.12.13",
|
|
58
|
+
"@gajae-code/ai": "0.12.13",
|
|
59
|
+
"@gajae-code/bridge-client": "0.12.13",
|
|
60
|
+
"@gajae-code/natives": "0.12.13",
|
|
61
|
+
"@gajae-code/tui": "0.12.13",
|
|
62
|
+
"@gajae-code/utils": "0.12.13",
|
|
63
63
|
"@puppeteer/browsers": "^2.13.0",
|
|
64
64
|
"@types/turndown": "5.0.6",
|
|
65
65
|
"@xterm/headless": "^6.0.0",
|
package/src/cli/fast-help.ts
CHANGED