@gajae-code/coding-agent 0.5.0 → 0.5.2
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 +36 -0
- package/README.md +1 -1
- package/dist/types/async/job-manager.d.ts +26 -0
- package/dist/types/cli/args.d.ts +1 -0
- package/dist/types/cli/list-models.d.ts +6 -0
- package/dist/types/cli/setup-cli.d.ts +8 -1
- package/dist/types/commands/gc.d.ts +26 -0
- package/dist/types/commands/setup.d.ts +7 -0
- package/dist/types/config/file-lock-gc.d.ts +5 -0
- package/dist/types/config/file-lock.d.ts +29 -0
- package/dist/types/config/model-registry.d.ts +4 -0
- package/dist/types/config/models-config-schema.d.ts +5 -0
- package/dist/types/config/settings-schema.d.ts +62 -0
- package/dist/types/coordinator/contract.d.ts +1 -1
- package/dist/types/defaults/gjc/extensions/grok-build/index.d.ts +1 -0
- package/dist/types/defaults/gjc/extensions/grok-cli-vendor/src/index.d.ts +1 -0
- package/dist/types/defaults/gjc/extensions/grok-cli-vendor/src/models/catalog.d.ts +25 -0
- package/dist/types/defaults/gjc/extensions/grok-cli-vendor/src/payload/sanitize.d.ts +27 -0
- package/dist/types/defaults/gjc/extensions/grok-cli-vendor/src/provider/billing.d.ts +8 -0
- package/dist/types/defaults/gjc/extensions/grok-cli-vendor/src/provider/register.d.ts +5 -0
- package/dist/types/defaults/gjc/extensions/grok-cli-vendor/src/provider/stream.d.ts +10 -0
- package/dist/types/defaults/gjc/extensions/grok-cli-vendor/src/provider/usage.d.ts +2 -0
- package/dist/types/defaults/gjc/extensions/grok-cli-vendor/src/shared/base-url.d.ts +2 -0
- package/dist/types/defaults/gjc/extensions/grok-cli-vendor/src/shared/errors.d.ts +38 -0
- package/dist/types/defaults/gjc-grok-cli.d.ts +5 -0
- package/dist/types/extensibility/extensions/index.d.ts +1 -0
- package/dist/types/extensibility/extensions/prefix-command-bridge.d.ts +35 -0
- package/dist/types/gjc-runtime/deep-interview-recorder.d.ts +103 -0
- package/dist/types/gjc-runtime/deep-interview-runtime.d.ts +2 -0
- package/dist/types/gjc-runtime/deep-interview-state.d.ts +112 -0
- package/dist/types/gjc-runtime/gc-render.d.ts +6 -0
- package/dist/types/gjc-runtime/gc-runtime.d.ts +134 -0
- package/dist/types/gjc-runtime/ledger-event-renderer.d.ts +68 -0
- package/dist/types/gjc-runtime/state-writer.d.ts +64 -2
- package/dist/types/gjc-runtime/team-gc.d.ts +7 -0
- package/dist/types/gjc-runtime/team-runtime.d.ts +5 -0
- package/dist/types/gjc-runtime/tmux-common.d.ts +11 -0
- package/dist/types/gjc-runtime/tmux-gc.d.ts +7 -0
- package/dist/types/gjc-runtime/tmux-sessions.d.ts +13 -0
- package/dist/types/gjc-runtime/ultragoal-guard.d.ts +10 -0
- package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +29 -0
- package/dist/types/harness-control-plane/gc-adapter.d.ts +3 -0
- package/dist/types/harness-control-plane/owner.d.ts +7 -0
- package/dist/types/harness-control-plane/storage.d.ts +20 -0
- package/dist/types/modes/components/hook-selector.d.ts +7 -1
- package/dist/types/modes/components/provider-onboarding-selector.d.ts +1 -1
- package/dist/types/modes/controllers/command-controller.d.ts +1 -0
- package/dist/types/modes/interactive-mode.d.ts +1 -1
- package/dist/types/modes/rpc/rpc-mode.d.ts +72 -2
- package/dist/types/modes/shared/agent-wire/deep-interview-gate.d.ts +13 -0
- package/dist/types/modes/shared/agent-wire/session-registry.d.ts +25 -0
- package/dist/types/modes/shared/agent-wire/unattended-action-policy.d.ts +2 -0
- package/dist/types/modes/shared/agent-wire/unattended-session.d.ts +10 -0
- package/dist/types/modes/theme/defaults/index.d.ts +302 -0
- package/dist/types/modes/theme/theme.d.ts +1 -0
- package/dist/types/modes/types.d.ts +1 -1
- package/dist/types/session/agent-session.d.ts +1 -1
- package/dist/types/session/blob-store.d.ts +39 -3
- package/dist/types/session/history-storage.d.ts +2 -2
- package/dist/types/session/session-manager.d.ts +10 -1
- package/dist/types/setup/credential-import.d.ts +79 -0
- package/dist/types/skill-state/workflow-hud.d.ts +14 -0
- package/dist/types/task/executor.d.ts +1 -0
- package/dist/types/task/render.d.ts +1 -1
- package/dist/types/tools/ask.d.ts +15 -1
- package/dist/types/tools/subagent-render.d.ts +7 -1
- package/dist/types/tools/subagent.d.ts +27 -0
- package/dist/types/tools/ultragoal-ask-guard.d.ts +5 -0
- package/dist/types/web/search/index.d.ts +4 -4
- package/dist/types/web/search/provider.d.ts +16 -20
- package/dist/types/web/search/providers/base.d.ts +2 -1
- package/dist/types/web/search/providers/openai-compatible.d.ts +9 -0
- package/dist/types/web/search/types.d.ts +14 -2
- package/package.json +7 -7
- package/scripts/build-binary.ts +7 -0
- package/src/async/job-manager.ts +52 -0
- package/src/cli/args.ts +5 -0
- package/src/cli/auth-broker-cli.ts +1 -0
- package/src/cli/fast-help.ts +2 -0
- package/src/cli/list-models.ts +13 -1
- package/src/cli/setup-cli.ts +138 -3
- package/src/cli.ts +1 -0
- package/src/commands/gc.ts +22 -0
- package/src/commands/harness.ts +7 -3
- package/src/commands/setup.ts +5 -1
- package/src/commands/ultragoal.ts +3 -1
- package/src/config/file-lock-gc.ts +193 -0
- package/src/config/file-lock.ts +66 -10
- package/src/config/model-profile-activation.ts +15 -3
- package/src/config/model-profiles.ts +39 -30
- package/src/config/model-registry.ts +21 -1
- package/src/config/models-config-schema.ts +1 -0
- package/src/config/settings-schema.ts +62 -0
- package/src/coordinator/contract.ts +1 -0
- package/src/coordinator-mcp/server.ts +459 -3
- package/src/defaults/gjc/agent.models.grok-cli.yml +36 -0
- package/src/defaults/gjc/extensions/grok-build/index.ts +1 -0
- package/src/defaults/gjc/extensions/grok-build/package.json +7 -0
- package/src/defaults/gjc/extensions/grok-cli-vendor/biome.json +39 -0
- package/src/defaults/gjc/extensions/grok-cli-vendor/package.json +8 -0
- package/src/defaults/gjc/extensions/grok-cli-vendor/src/index.ts +1 -0
- package/src/defaults/gjc/extensions/grok-cli-vendor/src/models/catalog.ts +155 -0
- package/src/defaults/gjc/extensions/grok-cli-vendor/src/payload/sanitize.ts +361 -0
- package/src/defaults/gjc/extensions/grok-cli-vendor/src/provider/billing.ts +57 -0
- package/src/defaults/gjc/extensions/grok-cli-vendor/src/provider/register.ts +99 -0
- package/src/defaults/gjc/extensions/grok-cli-vendor/src/provider/stream.ts +50 -0
- package/src/defaults/gjc/extensions/grok-cli-vendor/src/provider/usage.ts +56 -0
- package/src/defaults/gjc/extensions/grok-cli-vendor/src/shared/base-url.ts +36 -0
- package/src/defaults/gjc/extensions/grok-cli-vendor/src/shared/errors.ts +44 -0
- package/src/defaults/gjc/skills/deep-interview/SKILL.md +131 -113
- package/src/defaults/gjc/skills/deep-interview/lateral-review-panel.md +49 -0
- package/src/defaults/gjc/skills/ultragoal/SKILL.md +30 -8
- package/src/defaults/gjc-defaults.ts +7 -0
- package/src/defaults/gjc-grok-cli.ts +22 -0
- package/src/extensibility/extensions/index.ts +1 -0
- package/src/extensibility/extensions/prefix-command-bridge.ts +128 -0
- package/src/gjc-runtime/deep-interview-recorder.ts +457 -0
- package/src/gjc-runtime/deep-interview-runtime.ts +18 -26
- package/src/gjc-runtime/deep-interview-state.ts +324 -0
- package/src/gjc-runtime/gc-render.ts +70 -0
- package/src/gjc-runtime/gc-runtime.ts +403 -0
- package/src/gjc-runtime/launch-tmux.ts +3 -4
- package/src/gjc-runtime/ledger-event-renderer.ts +164 -0
- package/src/gjc-runtime/ralplan-runtime.ts +232 -19
- package/src/gjc-runtime/state-renderer.ts +12 -3
- package/src/gjc-runtime/state-runtime.ts +48 -30
- package/src/gjc-runtime/state-writer.ts +254 -7
- package/src/gjc-runtime/team-gc.ts +49 -0
- package/src/gjc-runtime/team-runtime.ts +179 -2
- package/src/gjc-runtime/tmux-common.ts +14 -0
- package/src/gjc-runtime/tmux-gc.ts +177 -0
- package/src/gjc-runtime/tmux-sessions.ts +49 -1
- package/src/gjc-runtime/ultragoal-guard.ts +155 -0
- package/src/gjc-runtime/ultragoal-runtime.ts +1239 -31
- package/src/gjc-runtime/workflow-manifest.generated.json +44 -0
- package/src/gjc-runtime/workflow-manifest.ts +12 -0
- package/src/harness-control-plane/gc-adapter.ts +184 -0
- package/src/harness-control-plane/owner.ts +14 -2
- package/src/harness-control-plane/rpc-adapter.ts +1 -1
- package/src/harness-control-plane/storage.ts +70 -0
- package/src/hooks/skill-state.ts +121 -2
- package/src/internal-urls/docs-index.generated.ts +22 -12
- package/src/lsp/defaults.json +1 -0
- package/src/main.ts +18 -3
- package/src/modes/acp/acp-agent.ts +4 -2
- package/src/modes/bridge/bridge-mode.ts +2 -1
- package/src/modes/components/history-search.ts +5 -2
- package/src/modes/components/hook-selector.ts +19 -0
- package/src/modes/components/model-selector.ts +51 -8
- package/src/modes/components/provider-onboarding-selector.ts +6 -1
- package/src/modes/components/status-line/segments.ts +1 -1
- package/src/modes/controllers/command-controller.ts +25 -6
- package/src/modes/controllers/extension-ui-controller.ts +3 -0
- package/src/modes/controllers/selector-controller.ts +81 -1
- package/src/modes/interactive-mode.ts +11 -1
- package/src/modes/rpc/rpc-mode.ts +266 -34
- package/src/modes/shared/agent-wire/command-dispatch.ts +281 -261
- package/src/modes/shared/agent-wire/deep-interview-gate.ts +30 -1
- package/src/modes/shared/agent-wire/host-tool-bridge.ts +3 -0
- package/src/modes/shared/agent-wire/session-registry.ts +109 -0
- package/src/modes/shared/agent-wire/unattended-action-policy.ts +24 -0
- package/src/modes/shared/agent-wire/unattended-run-controller.ts +23 -3
- package/src/modes/shared/agent-wire/unattended-session.ts +32 -2
- package/src/modes/theme/defaults/claude-code.json +100 -0
- package/src/modes/theme/defaults/codex.json +100 -0
- package/src/modes/theme/defaults/index.ts +6 -0
- package/src/modes/theme/defaults/opencode.json +102 -0
- package/src/modes/theme/theme.ts +2 -2
- package/src/modes/types.ts +1 -1
- package/src/prompts/agents/executor.md +5 -2
- package/src/sdk.ts +29 -4
- package/src/session/agent-session.ts +99 -19
- package/src/session/blob-store.ts +59 -3
- package/src/session/history-storage.ts +32 -11
- package/src/session/session-manager.ts +72 -20
- package/src/setup/credential-import.ts +429 -0
- package/src/setup/hermes/templates/operator-instructions.v1.md +7 -1
- package/src/skill-state/deep-interview-mutation-guard.ts +2 -1
- package/src/skill-state/workflow-hud.ts +106 -10
- package/src/slash-commands/builtin-registry.ts +3 -2
- package/src/task/executor.ts +16 -1
- package/src/task/render.ts +18 -7
- package/src/tools/ask.ts +59 -2
- package/src/tools/cron.ts +1 -1
- package/src/tools/job.ts +3 -2
- package/src/tools/monitor.ts +36 -1
- package/src/tools/subagent-render.ts +128 -29
- package/src/tools/subagent.ts +173 -9
- package/src/tools/ultragoal-ask-guard.ts +39 -0
- package/src/web/search/index.ts +25 -25
- package/src/web/search/provider.ts +178 -87
- package/src/web/search/providers/base.ts +2 -1
- package/src/web/search/providers/openai-compatible.ts +151 -0
- package/src/web/search/types.ts +47 -22
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
Api,
|
|
3
|
+
AssistantMessageEventStream,
|
|
4
|
+
Context,
|
|
5
|
+
Model,
|
|
6
|
+
SimpleStreamOptions,
|
|
7
|
+
} from '@gajae-code/ai';
|
|
8
|
+
import { streamOpenAIResponses } from '@gajae-code/ai/providers/openai-responses';
|
|
9
|
+
|
|
10
|
+
const GROK_CLI_VERSION = '0.2.33';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Stream function that adds Grok CLI-specific headers to requests.
|
|
14
|
+
*
|
|
15
|
+
* GJC Grok Build extension sends cli-chat-proxy headers (see agent.models.grok-cli.yml):
|
|
16
|
+
* - x-grok-conv-id: <session/conversation ID>
|
|
17
|
+
* - x-grok-model-override: <model ID>
|
|
18
|
+
* - x-xai-token-auth: xai-grok-cli
|
|
19
|
+
*/
|
|
20
|
+
export function streamGrokCli(
|
|
21
|
+
model: Model<Api>,
|
|
22
|
+
context: Context,
|
|
23
|
+
options?: SimpleStreamOptions,
|
|
24
|
+
): AssistantMessageEventStream {
|
|
25
|
+
const sessionId = options?.sessionId;
|
|
26
|
+
const headers: Record<string, string> = {
|
|
27
|
+
...options?.headers,
|
|
28
|
+
'x-grok-client-identifier': 'gjc-grok-cli',
|
|
29
|
+
'x-grok-client-version': GROK_CLI_VERSION,
|
|
30
|
+
'x-xai-token-auth': 'xai-grok-cli',
|
|
31
|
+
'x-grok-model-override': model.id,
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
if (sessionId) {
|
|
35
|
+
headers['x-grok-conv-id'] = sessionId;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const responsesModel = {
|
|
39
|
+
...model,
|
|
40
|
+
api: 'openai-responses',
|
|
41
|
+
} as Model<'openai-responses'>;
|
|
42
|
+
|
|
43
|
+
return streamOpenAIResponses(responsesModel, context, {
|
|
44
|
+
...options,
|
|
45
|
+
headers,
|
|
46
|
+
onResponse(response) {
|
|
47
|
+
options?.onResponse?.(response, model);
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { Api, Model } from '@gajae-code/ai';
|
|
2
|
+
import type { ExtensionAPI } from '@gajae-code/coding-agent';
|
|
3
|
+
import { XaiOAuthError } from '../shared/errors.js';
|
|
4
|
+
import { fetchBillingUsage, formatQuota } from './billing.js';
|
|
5
|
+
|
|
6
|
+
export function registerUsageCommand(api: Pick<ExtensionAPI, 'registerCommand'>) {
|
|
7
|
+
api.registerCommand('grok-build-usage', {
|
|
8
|
+
description: 'Show Grok Build provider status, quota, and token health',
|
|
9
|
+
handler: async (_args, ctx) => {
|
|
10
|
+
const token = process.env.GROK_CLI_OAUTH_TOKEN;
|
|
11
|
+
if (token) {
|
|
12
|
+
ctx.ui.notify(
|
|
13
|
+
'⚠️ Grok Build: using GROK_CLI_OAUTH_TOKEN env bypass — no auto-refresh available',
|
|
14
|
+
'warning',
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
try {
|
|
19
|
+
const registry = ctx.modelRegistry;
|
|
20
|
+
const grokModels = registry.getAll().filter((m: Model<Api>) => m.provider === 'grok-build');
|
|
21
|
+
if (grokModels.length === 0) {
|
|
22
|
+
ctx.ui.notify(
|
|
23
|
+
'Grok Build: no models registered. Run /login grok-build first.',
|
|
24
|
+
'warning',
|
|
25
|
+
);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const apiKey = token ?? (await registry.getApiKeyForProvider?.('grok-build'));
|
|
30
|
+
if (!apiKey) {
|
|
31
|
+
ctx.ui.notify(formatQuota(undefined).join('\n'), 'info');
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
try {
|
|
36
|
+
ctx.ui.notify('Fetching grok build usage…', 'info');
|
|
37
|
+
ctx.ui.notify(formatQuota(await fetchBillingUsage(apiKey)).join('\n'), 'info');
|
|
38
|
+
} catch (err) {
|
|
39
|
+
ctx.ui.notify(
|
|
40
|
+
`Grok Build billing refresh failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
41
|
+
'warning',
|
|
42
|
+
);
|
|
43
|
+
ctx.ui.notify(formatQuota(undefined).join('\n'), 'info');
|
|
44
|
+
}
|
|
45
|
+
} catch (err) {
|
|
46
|
+
const msg =
|
|
47
|
+
err instanceof XaiOAuthError
|
|
48
|
+
? `${err.message} (code: ${err.code})`
|
|
49
|
+
: err instanceof Error
|
|
50
|
+
? err.message
|
|
51
|
+
: String(err);
|
|
52
|
+
ctx.ui.notify(`Grok Build: ${msg}`, 'warning');
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
const DEFAULT_GROK_BUILD_BASE_URL = 'https://cli-chat-proxy.grok.com/v1';
|
|
2
|
+
const ALLOWED_GROK_BUILD_HOSTS = new Set(['cli-chat-proxy.grok.com']);
|
|
3
|
+
|
|
4
|
+
function normalizeBaseUrl(baseUrl: string): string {
|
|
5
|
+
return baseUrl.trim().replace(/\/+$/, '');
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
function isAllowedCredentialHost(baseUrl: string): boolean {
|
|
9
|
+
try {
|
|
10
|
+
const url = new URL(baseUrl);
|
|
11
|
+
return url.protocol === 'https:' && ALLOWED_GROK_BUILD_HOSTS.has(url.hostname.toLowerCase());
|
|
12
|
+
} catch {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function getBaseUrl(): string {
|
|
18
|
+
const configured = process.env.GJC_GROK_CLI_BASE_URL || process.env.GROK_CLI_BASE_URL;
|
|
19
|
+
if (!configured) return DEFAULT_GROK_BUILD_BASE_URL;
|
|
20
|
+
|
|
21
|
+
const normalized = normalizeBaseUrl(configured);
|
|
22
|
+
if (isAllowedCredentialHost(normalized)) return normalized;
|
|
23
|
+
|
|
24
|
+
if (process.env.GJC_GROK_CLI_ALLOW_UNSAFE_BASE_URL === '1') return normalized;
|
|
25
|
+
|
|
26
|
+
return DEFAULT_GROK_BUILD_BASE_URL;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function isGrokBuildBaseUrlOverrideIgnored(): boolean {
|
|
30
|
+
const configured = process.env.GJC_GROK_CLI_BASE_URL || process.env.GROK_CLI_BASE_URL;
|
|
31
|
+
if (!configured) return false;
|
|
32
|
+
const normalized = normalizeBaseUrl(configured);
|
|
33
|
+
return (
|
|
34
|
+
!isAllowedCredentialHost(normalized) && process.env.GJC_GROK_CLI_ALLOW_UNSAFE_BASE_URL !== '1'
|
|
35
|
+
);
|
|
36
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed error for xAI OAuth failures.
|
|
3
|
+
*
|
|
4
|
+
* Codes allow the login flow and stream handlers to distinguish
|
|
5
|
+
* retryable failures (network) from fatal ones (revoked refresh token).
|
|
6
|
+
*/
|
|
7
|
+
export class XaiOAuthError extends Error {
|
|
8
|
+
constructor(
|
|
9
|
+
message: string,
|
|
10
|
+
public readonly code: string,
|
|
11
|
+
public readonly reloginRequired = false,
|
|
12
|
+
) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.name = 'XaiOAuthError';
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** Well-known error codes. */
|
|
19
|
+
export const XaiErrorCode = {
|
|
20
|
+
/** OIDC discovery failed (network, invalid response). */
|
|
21
|
+
DISCOVERY_FAILED: 'discovery_failed',
|
|
22
|
+
/** Discovery endpoint returned a non-xAI origin. */
|
|
23
|
+
DISCOVERY_INVALID_ORIGIN: 'discovery_invalid_origin',
|
|
24
|
+
/** Authorization was denied or errored in the browser. */
|
|
25
|
+
AUTHORIZATION_FAILED: 'authorization_failed',
|
|
26
|
+
/** CSRF state mismatch between request and callback. */
|
|
27
|
+
STATE_MISMATCH: 'state_mismatch',
|
|
28
|
+
/** Callback did not include an authorization code. */
|
|
29
|
+
CODE_MISSING: 'code_missing',
|
|
30
|
+
/** Token exchange failed (network, invalid response). */
|
|
31
|
+
TOKEN_EXCHANGE_FAILED: 'token_exchange_failed',
|
|
32
|
+
/** Token exchange returned an invalid payload. */
|
|
33
|
+
TOKEN_EXCHANGE_INVALID: 'token_exchange_invalid',
|
|
34
|
+
/** Refresh token is missing or empty. */
|
|
35
|
+
REFRESH_MISSING: 'refresh_missing',
|
|
36
|
+
/** Token refresh failed (expired, revoked). */
|
|
37
|
+
REFRESH_FAILED: 'refresh_failed',
|
|
38
|
+
/** No credentials stored. */
|
|
39
|
+
AUTH_MISSING: 'auth_missing',
|
|
40
|
+
/** Loopback callback server could not bind. */
|
|
41
|
+
CALLBACK_BIND_FAILED: 'callback_bind_failed',
|
|
42
|
+
/** Loopback callback timed out. */
|
|
43
|
+
CALLBACK_TIMEOUT: 'callback_timeout',
|
|
44
|
+
} as const;
|