@gajae-code/coding-agent 0.15.5 → 0.15.6
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 +26 -1
- package/dist/types/async/job-manager.d.ts +83 -0
- package/dist/types/cli/auth-gateway-cli.d.ts +17 -0
- package/dist/types/cli/model-presets-cli.d.ts +9 -0
- package/dist/types/cli/update-cli.d.ts +2 -0
- package/dist/types/commands/auth-gateway.d.ts +3 -0
- package/dist/types/commands/gc.d.ts +13 -0
- package/dist/types/commands/model-presets.d.ts +21 -0
- package/dist/types/config/autorouting-tier-map.d.ts +96 -0
- package/dist/types/config/file-lock.d.ts +49 -2
- package/dist/types/config/internal/model-preset-registry-test-state.d.ts +4 -0
- package/dist/types/config/internal/model-preset-registry-test-support.d.ts +3 -0
- package/dist/types/config/keybindings.d.ts +3 -2
- package/dist/types/config/model-preset-registry.d.ts +368 -0
- package/dist/types/config/model-profile-activation.d.ts +39 -0
- package/dist/types/config/model-profiles.d.ts +5 -3
- package/dist/types/config/model-registry.d.ts +11 -5
- package/dist/types/config/settings-schema.d.ts +9 -0
- package/dist/types/coordinator-mcp/model-preset.d.ts +7 -5
- package/dist/types/coordinator-mcp/projection-scan.d.ts +46 -0
- package/dist/types/extensibility/extensions/types.d.ts +2 -5
- package/dist/types/gjc-runtime/empty-delete-gc.d.ts +58 -0
- package/dist/types/gjc-runtime/gc-runtime.d.ts +2 -0
- package/dist/types/gjc-runtime/session-state-lock.d.ts +35 -6
- package/dist/types/gjc-runtime/session-state-sidecar.d.ts +6 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/main.d.ts +3 -1
- package/dist/types/modes/components/jobs-overlay-model.d.ts +4 -2
- package/dist/types/modes/jobs-observer.d.ts +36 -0
- package/dist/types/sdk/broker/broker.d.ts +3 -0
- package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +3 -0
- package/dist/types/sdk/bus/prompt-reconciliation.d.ts +4 -0
- package/dist/types/sdk/client/discovery.d.ts +1 -0
- package/dist/types/sdk/host/model-pin.d.ts +7 -2
- package/dist/types/sdk/host/sdk-run-capability.d.ts +1 -0
- package/dist/types/sdk/host/session-runtime.d.ts +15 -1
- package/dist/types/sdk/prompt-deadline-manager.d.ts +11 -1
- package/dist/types/sdk/protocol/adapter-validation.d.ts +2 -0
- package/dist/types/sdk/router/session-router.d.ts +9 -0
- package/dist/types/session/account-inventory.d.ts +1 -0
- package/dist/types/session/agent-session.d.ts +19 -7
- package/dist/types/session/fold-coordinator.d.ts +201 -0
- package/dist/types/session/sdk-run-capability-internal.d.ts +7 -0
- package/dist/types/session/sdk-run-capability.d.ts +2 -0
- package/dist/types/telemetry/control.d.ts +11 -0
- package/dist/types/telemetry/events.d.ts +20 -0
- package/dist/types/telemetry/index.d.ts +3 -0
- package/dist/types/telemetry/transport.d.ts +22 -0
- package/dist/types/tools/bash-interactive.d.ts +23 -0
- package/dist/types/tools/index.d.ts +6 -5
- package/dist/types/web/search/providers/base.d.ts +9 -4
- package/dist/types/web/search/providers/xai.d.ts +2 -1
- package/dist/types/web/search/types.d.ts +14 -0
- package/package.json +10 -7
- package/scripts/generate-hotkeys-docs.ts +4 -0
- package/scripts/generate-sdk-operation-inventory.ts +3 -3
- package/src/async/job-manager.ts +671 -39
- package/src/cli/auth-broker-cli.ts +40 -12
- package/src/cli/auth-gateway-cli.ts +273 -97
- package/src/cli/config-cli.ts +2 -2
- package/src/cli/fast-help.ts +3 -0
- package/src/cli/model-presets-cli.ts +100 -0
- package/src/cli/update-cli.ts +40 -5
- package/src/cli.ts +6 -2
- package/src/commands/auth-gateway.ts +12 -8
- package/src/commands/gc.ts +19 -0
- package/src/commands/model-presets.ts +24 -0
- package/src/config/autorouting-tier-map.ts +32 -0
- package/src/config/file-lock-gc.ts +9 -4
- package/src/config/file-lock.ts +775 -59
- package/src/config/internal/model-preset-registry-test-state.ts +28 -0
- package/src/config/internal/model-preset-registry-test-support.ts +11 -0
- package/src/config/keybindings.ts +6 -2
- package/src/config/model-preset-registry.ts +2799 -0
- package/src/config/model-profile-activation.ts +115 -28
- package/src/config/model-profile-contract.ts +4 -1
- package/src/config/model-profiles.ts +51 -9
- package/src/config/model-registry.ts +1021 -122
- package/src/config/settings-schema.ts +11 -0
- package/src/config/settings.ts +6 -1
- package/src/coordinator-mcp/model-preset.ts +32 -17
- package/src/coordinator-mcp/projection-scan.ts +571 -0
- package/src/coordinator-mcp/server.ts +19 -24
- package/src/coordinator-mcp/session-reaper.ts +9 -3
- package/src/extensibility/extensions/loader.ts +0 -1
- package/src/extensibility/extensions/types.ts +2 -3
- package/src/extensibility/gjc-plugins/runtime-adapters.ts +1 -0
- package/src/gjc-runtime/empty-delete-gc.ts +301 -0
- package/src/gjc-runtime/gc-render.ts +29 -0
- package/src/gjc-runtime/gc-runtime.ts +174 -11
- package/src/gjc-runtime/session-state-lock.ts +1242 -141
- package/src/gjc-runtime/session-state-sidecar.ts +76 -3
- package/src/index.ts +1 -0
- package/src/internal-urls/docs-index.generated.ts +9 -8
- package/src/lsp/config.ts +4 -3
- package/src/lsp/path-trust.ts +12 -6
- package/src/main.ts +9 -2
- package/src/modes/acp/acp-agent.ts +11 -5
- package/src/modes/components/jobs-overlay-model.ts +99 -16
- package/src/modes/components/model-selector.ts +158 -18
- package/src/modes/components/status-line/segments.ts +6 -1
- package/src/modes/controllers/extension-ui-controller.ts +1 -1
- package/src/modes/controllers/input-controller.ts +23 -6
- package/src/modes/interactive-mode.ts +14 -1
- package/src/modes/jobs-observer.ts +149 -16
- package/src/modes/runtime-init.ts +1 -1
- package/src/modes/utils/injected-user-submission.ts +15 -1
- package/src/prompts/tools/bash.md +2 -2
- package/src/prompts/tools/fold-receipt.md +3 -0
- package/src/prompts/tools/job.md +1 -1
- package/src/sdk/acp/adapter.ts +17 -2
- package/src/sdk/broker/broker.ts +48 -21
- package/src/sdk/broker/lifecycle.ts +32 -6
- package/src/sdk/bus/chat-daemon-control.ts +2 -2
- package/src/sdk/bus/chat-daemon-runtime.ts +11 -1
- package/src/sdk/bus/kind-aware-reconciliation.ts +36 -6
- package/src/sdk/bus/prompt-reconciliation.ts +28 -4
- package/src/sdk/bus/slack-conversation.ts +5 -1
- package/src/sdk/cli/session-cli.ts +12 -1
- package/src/sdk/client/discovery.ts +3 -1
- package/src/sdk/host/control/dispatch.ts +3 -0
- package/src/sdk/host/model-pin.ts +185 -25
- package/src/sdk/host/sdk-run-capability.ts +1 -0
- package/src/sdk/host/session-runtime.test.ts +371 -37
- package/src/sdk/host/session-runtime.ts +364 -52
- package/src/sdk/prompt-deadline-manager.ts +16 -1
- package/src/sdk/protocol/adapter-validation.ts +27 -0
- package/src/sdk/protocol/operation-inventory.generated.json +2 -2
- package/src/sdk/protocol/operation-registry.ts +4 -1
- package/src/sdk/router/session-router.ts +228 -96
- package/src/sdk/session.ts +83 -12
- package/src/session/account-inventory.ts +27 -11
- package/src/session/agent-session.ts +678 -103
- package/src/session/fold-coordinator.ts +433 -0
- package/src/session/sdk-run-capability-internal.ts +15 -0
- package/src/session/sdk-run-capability.ts +2 -0
- package/src/session/session-manager.ts +5 -4
- package/src/setup/provider-presets.json +1 -1
- package/src/slash-commands/helpers/credential-switch.ts +6 -1
- package/src/task/executor.ts +19 -3
- package/src/telemetry/control.ts +26 -0
- package/src/telemetry/events.ts +142 -0
- package/src/telemetry/index.ts +3 -0
- package/src/telemetry/transport.ts +87 -0
- package/src/tools/bash-interactive.ts +182 -85
- package/src/tools/bash.ts +772 -67
- package/src/tools/index.ts +7 -5
- package/src/tools/tool-catalog.generated.ts +1 -1
- package/src/web/search/provider.ts +120 -11
- package/src/web/search/providers/anthropic.ts +89 -17
- package/src/web/search/providers/base.ts +9 -4
- package/src/web/search/providers/gemini.ts +87 -15
- package/src/web/search/providers/openai-compatible.ts +23 -8
- package/src/web/search/providers/xai.ts +98 -12
- package/src/web/search/types.ts +16 -0
|
@@ -6,7 +6,14 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import type { AuthStorage } from "@gajae-code/ai/core";
|
|
8
8
|
import { $credentialEnv, $env } from "@gajae-code/utils";
|
|
9
|
-
import type {
|
|
9
|
+
import type {
|
|
10
|
+
ActiveSearchModelContext,
|
|
11
|
+
ActiveSearchModelCredentials,
|
|
12
|
+
SearchCitation,
|
|
13
|
+
SearchResponse,
|
|
14
|
+
SearchSource,
|
|
15
|
+
SearchUsage,
|
|
16
|
+
} from "../../../web/search/types";
|
|
10
17
|
import { SearchProviderError } from "../../../web/search/types";
|
|
11
18
|
import type { SearchParams } from "./base";
|
|
12
19
|
import { SearchProvider } from "./base";
|
|
@@ -49,11 +56,13 @@ export interface XaiSearchParams {
|
|
|
49
56
|
signal?: AbortSignal;
|
|
50
57
|
authStorage: AuthStorage;
|
|
51
58
|
sessionId?: string;
|
|
59
|
+
activeModelContext?: ActiveSearchModelContext;
|
|
52
60
|
}
|
|
53
61
|
|
|
54
62
|
interface XaiAuth {
|
|
55
63
|
bearer: string;
|
|
56
64
|
mode: "api_key" | "oauth";
|
|
65
|
+
headers?: Record<string, string>;
|
|
57
66
|
}
|
|
58
67
|
|
|
59
68
|
interface PreparedXaiTools {
|
|
@@ -67,7 +76,53 @@ function asTrimmed(value: string | undefined): string | undefined {
|
|
|
67
76
|
return trimmed.length > 0 ? trimmed : undefined;
|
|
68
77
|
}
|
|
69
78
|
|
|
70
|
-
function
|
|
79
|
+
function isOpenAICompatWire(api: string): boolean {
|
|
80
|
+
return api === "openai-responses" || api === "openai-completions";
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function looksXaiModelId(modelId: string | undefined): boolean {
|
|
84
|
+
if (!modelId) return false;
|
|
85
|
+
const id = modelId.toLowerCase();
|
|
86
|
+
return id.startsWith("grok-") || id.startsWith("x-ai/grok-") || id.startsWith("xai/grok-");
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function isOfficialXaiBaseUrl(baseUrl: string | undefined): boolean {
|
|
90
|
+
if (!baseUrl?.trim()) return true;
|
|
91
|
+
try {
|
|
92
|
+
return new URL(baseUrl).hostname.toLowerCase().replace(/\.$/, "") === "api.x.ai";
|
|
93
|
+
} catch {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function isCustomXaiContext(ctx: ActiveSearchModelContext | undefined): ctx is ActiveSearchModelContext {
|
|
99
|
+
if (!ctx || !isOpenAICompatWire(ctx.api)) return false;
|
|
100
|
+
if (ctx.ownerAuthOverride) return true;
|
|
101
|
+
const provider = ctx.provider.toLowerCase();
|
|
102
|
+
if (provider === "xai" && !isOfficialXaiBaseUrl(ctx.baseUrl)) return true;
|
|
103
|
+
if (!looksXaiModelId(ctx.wireModelId) && !looksXaiModelId(ctx.modelId)) return false;
|
|
104
|
+
if (!isOfficialXaiBaseUrl(ctx.baseUrl)) return true;
|
|
105
|
+
return provider !== "xai";
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function hasHeader(headers: Record<string, string>, name: string): boolean {
|
|
109
|
+
const normalized = name.toLowerCase();
|
|
110
|
+
return Object.keys(headers).some(key => key.toLowerCase() === normalized);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function explicitCredentialHeader(headers: Record<string, string> | undefined): string | undefined {
|
|
114
|
+
for (const [key, value] of Object.entries(headers ?? {})) {
|
|
115
|
+
const normalized = key.toLowerCase();
|
|
116
|
+
if (normalized === "authorization" || normalized === "x-api-key") return value;
|
|
117
|
+
}
|
|
118
|
+
return undefined;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function getModel(activeModelContext?: ActiveSearchModelContext): string {
|
|
122
|
+
const ctx = activeModelContext;
|
|
123
|
+
if (isCustomXaiContext(ctx)) {
|
|
124
|
+
return ctx.wireModelId ?? ctx.modelId;
|
|
125
|
+
}
|
|
71
126
|
return asTrimmed($env.PI_XAI_WEB_SEARCH_MODEL) ?? asTrimmed($env.XAI_WEB_SEARCH_MODEL) ?? DEFAULT_MODEL;
|
|
72
127
|
}
|
|
73
128
|
|
|
@@ -76,12 +131,14 @@ export function resolveXaiSearchBaseUrlForTest(): string {
|
|
|
76
131
|
return getBaseUrl();
|
|
77
132
|
}
|
|
78
133
|
|
|
79
|
-
function getBaseUrl(): string {
|
|
134
|
+
function getBaseUrl(activeModelContext?: ActiveSearchModelContext): string {
|
|
135
|
+
const ctx = activeModelContext;
|
|
136
|
+
if (isCustomXaiContext(ctx) && ctx.baseUrl) return ctx.baseUrl;
|
|
80
137
|
return asTrimmed($credentialEnv("XAI_SEARCH_BASE_URL")) ?? DEFAULT_BASE_URL;
|
|
81
138
|
}
|
|
82
139
|
|
|
83
|
-
function responsesEndpoint(): string {
|
|
84
|
-
return `${getBaseUrl().replace(/\/+$/, "")}/responses`;
|
|
140
|
+
function responsesEndpoint(activeModelContext?: ActiveSearchModelContext): string {
|
|
141
|
+
return `${getBaseUrl(activeModelContext).replace(/\/+$/, "")}/responses`;
|
|
85
142
|
}
|
|
86
143
|
|
|
87
144
|
async function resolveXaiAuth(
|
|
@@ -89,7 +146,26 @@ async function resolveXaiAuth(
|
|
|
89
146
|
sessionId: string | undefined,
|
|
90
147
|
model: string,
|
|
91
148
|
signal: AbortSignal | undefined,
|
|
149
|
+
activeModelContext?: ActiveSearchModelContext,
|
|
92
150
|
): Promise<XaiAuth | null> {
|
|
151
|
+
const ctx = activeModelContext;
|
|
152
|
+
if (isCustomXaiContext(ctx)) {
|
|
153
|
+
const activeCredentials: ActiveSearchModelCredentials = ctx.resolveCredentials
|
|
154
|
+
? await ctx.resolveCredentials({ sessionId, signal })
|
|
155
|
+
: {
|
|
156
|
+
apiKey: await authStorage.getApiKey(ctx.provider, sessionId, {
|
|
157
|
+
baseUrl: ctx.baseUrl,
|
|
158
|
+
modelId: ctx.modelId,
|
|
159
|
+
signal,
|
|
160
|
+
}),
|
|
161
|
+
headers: ctx.headers,
|
|
162
|
+
};
|
|
163
|
+
const headers = { ...(activeCredentials.headers ?? ctx.headers ?? {}) };
|
|
164
|
+
const bearer = activeCredentials.apiKey ?? explicitCredentialHeader(headers);
|
|
165
|
+
if (!bearer) return null;
|
|
166
|
+
return { bearer, mode: "api_key", headers };
|
|
167
|
+
}
|
|
168
|
+
|
|
93
169
|
const credentialSessionId = sessionId ?? `xai-search:${crypto.randomUUID()}`;
|
|
94
170
|
const bearer = await authStorage.getApiKey("xai", credentialSessionId, {
|
|
95
171
|
baseUrl: getBaseUrl(),
|
|
@@ -409,8 +485,14 @@ function parseUsage(json: any): SearchUsage | undefined {
|
|
|
409
485
|
|
|
410
486
|
/** Execute xAI web/X search through the Responses API search tools. */
|
|
411
487
|
export async function searchXai(params: XaiSearchParams): Promise<SearchResponse> {
|
|
412
|
-
const model = getModel();
|
|
413
|
-
const auth = await resolveXaiAuth(
|
|
488
|
+
const model = getModel(params.activeModelContext);
|
|
489
|
+
const auth = await resolveXaiAuth(
|
|
490
|
+
params.authStorage,
|
|
491
|
+
params.sessionId,
|
|
492
|
+
model,
|
|
493
|
+
params.signal,
|
|
494
|
+
params.activeModelContext,
|
|
495
|
+
);
|
|
414
496
|
if (!auth) {
|
|
415
497
|
throw new SearchProviderError(
|
|
416
498
|
"xai",
|
|
@@ -419,12 +501,15 @@ export async function searchXai(params: XaiSearchParams): Promise<SearchResponse
|
|
|
419
501
|
);
|
|
420
502
|
}
|
|
421
503
|
|
|
422
|
-
const
|
|
504
|
+
const headers = { ...(auth.headers ?? {}) };
|
|
505
|
+
if (!hasHeader(headers, "authorization") && !hasHeader(headers, "x-api-key")) {
|
|
506
|
+
headers.Authorization = `Bearer ${auth.bearer}`;
|
|
507
|
+
}
|
|
508
|
+
if (!hasHeader(headers, "content-type")) headers["Content-Type"] = "application/json";
|
|
509
|
+
|
|
510
|
+
const response = await fetch(responsesEndpoint(params.activeModelContext), {
|
|
423
511
|
method: "POST",
|
|
424
|
-
headers
|
|
425
|
-
Authorization: `Bearer ${auth.bearer}`,
|
|
426
|
-
"Content-Type": "application/json",
|
|
427
|
-
},
|
|
512
|
+
headers,
|
|
428
513
|
body: JSON.stringify(
|
|
429
514
|
buildXaiRequestBody({
|
|
430
515
|
query: params.query,
|
|
@@ -511,6 +596,7 @@ export class XaiProvider extends SearchProvider {
|
|
|
511
596
|
signal: params.signal,
|
|
512
597
|
authStorage: params.authStorage,
|
|
513
598
|
sessionId: params.sessionId,
|
|
599
|
+
activeModelContext: params.activeModelContext,
|
|
514
600
|
});
|
|
515
601
|
}
|
|
516
602
|
}
|
package/src/web/search/types.ts
CHANGED
|
@@ -27,6 +27,18 @@ export type SearchProviderId =
|
|
|
27
27
|
|
|
28
28
|
export type WebSearchMode = "on" | "off" | "auto";
|
|
29
29
|
|
|
30
|
+
/** Credentials and request headers resolved for the active model. */
|
|
31
|
+
export interface ActiveSearchModelCredentials {
|
|
32
|
+
apiKey?: string;
|
|
33
|
+
headers?: Record<string, string>;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** Refresh-aware resolver supplied by the model registry for native search. */
|
|
37
|
+
export type ActiveSearchModelCredentialResolver = (options: {
|
|
38
|
+
sessionId?: string;
|
|
39
|
+
signal?: AbortSignal;
|
|
40
|
+
}) => Promise<ActiveSearchModelCredentials>;
|
|
41
|
+
|
|
30
42
|
export interface ActiveSearchModelContext {
|
|
31
43
|
provider: string;
|
|
32
44
|
modelId: string;
|
|
@@ -34,6 +46,10 @@ export interface ActiveSearchModelContext {
|
|
|
34
46
|
api: string;
|
|
35
47
|
baseUrl?: string;
|
|
36
48
|
headers?: Record<string, string>;
|
|
49
|
+
/** Resolve the active model key and current headers before each native search. */
|
|
50
|
+
resolveCredentials?: ActiveSearchModelCredentialResolver;
|
|
51
|
+
/** True when registry-owned auth or transport overrides this active model. */
|
|
52
|
+
ownerAuthOverride?: boolean;
|
|
37
53
|
webSearch?: WebSearchMode;
|
|
38
54
|
}
|
|
39
55
|
|