@gajae-code/coding-agent 0.2.4 → 0.3.0
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 +27 -0
- package/README.md +1 -1
- package/dist/types/async/job-manager.d.ts +145 -2
- package/dist/types/commands/harness.d.ts +37 -0
- package/dist/types/config/settings-schema.d.ts +13 -3
- package/dist/types/config/settings.d.ts +3 -1
- package/dist/types/deep-interview/render-middleware.d.ts +5 -0
- package/dist/types/discovery/helpers.d.ts +1 -0
- package/dist/types/exec/bash-executor.d.ts +8 -1
- package/dist/types/extensibility/custom-tools/types.d.ts +1 -0
- package/dist/types/extensibility/extensions/types.d.ts +6 -0
- package/dist/types/extensibility/shared-events.d.ts +1 -0
- package/dist/types/gjc-runtime/restricted-role-agent-bash.d.ts +2 -0
- package/dist/types/gjc-runtime/state-graph.d.ts +4 -0
- package/dist/types/gjc-runtime/state-migrations.d.ts +24 -0
- package/dist/types/gjc-runtime/state-renderer.d.ts +65 -0
- package/dist/types/gjc-runtime/state-runtime.d.ts +2 -0
- package/dist/types/gjc-runtime/state-validation.d.ts +6 -0
- package/dist/types/gjc-runtime/state-writer.d.ts +137 -0
- package/dist/types/gjc-runtime/team-runtime.d.ts +81 -7
- package/dist/types/gjc-runtime/workflow-manifest.d.ts +54 -0
- package/dist/types/harness-control-plane/classifier.d.ts +13 -0
- package/dist/types/harness-control-plane/control-endpoint.d.ts +30 -0
- package/dist/types/harness-control-plane/finalize.d.ts +47 -0
- package/dist/types/harness-control-plane/frame-mapper.d.ts +29 -0
- package/dist/types/harness-control-plane/operate.d.ts +35 -0
- package/dist/types/harness-control-plane/owner.d.ts +46 -0
- package/dist/types/harness-control-plane/preserve.d.ts +19 -0
- package/dist/types/harness-control-plane/receipts.d.ts +88 -0
- package/dist/types/harness-control-plane/rpc-adapter.d.ts +66 -0
- package/dist/types/harness-control-plane/seams.d.ts +21 -0
- package/dist/types/harness-control-plane/session-lease.d.ts +65 -0
- package/dist/types/harness-control-plane/state-machine.d.ts +19 -0
- package/dist/types/harness-control-plane/storage.d.ts +53 -0
- package/dist/types/harness-control-plane/types.d.ts +162 -0
- package/dist/types/hooks/skill-keywords.d.ts +2 -1
- package/dist/types/hooks/skill-state.d.ts +2 -29
- package/dist/types/modes/acp/acp-client-bridge.d.ts +1 -1
- package/dist/types/modes/components/hook-selector.d.ts +1 -0
- package/dist/types/modes/components/skill-hud/render.d.ts +1 -1
- package/dist/types/modes/interactive-mode.d.ts +2 -0
- package/dist/types/modes/theme/defaults/index.d.ts +45 -9477
- package/dist/types/modes/theme/theme.d.ts +1 -5
- package/dist/types/modes/types.d.ts +2 -0
- package/dist/types/sdk.d.ts +4 -0
- package/dist/types/session/agent-session.d.ts +8 -0
- package/dist/types/session/streaming-output.d.ts +11 -0
- package/dist/types/skill-state/active-state.d.ts +3 -0
- package/dist/types/skill-state/deep-interview-mutation-guard.d.ts +1 -1
- package/dist/types/skill-state/workflow-state-contract.d.ts +24 -0
- package/dist/types/task/executor.d.ts +3 -0
- package/dist/types/task/types.d.ts +56 -3
- package/dist/types/tools/bash-allowed-prefixes.d.ts +5 -0
- package/dist/types/tools/bash.d.ts +24 -0
- package/dist/types/tools/cron.d.ts +110 -0
- package/dist/types/tools/index.d.ts +4 -0
- package/dist/types/tools/monitor.d.ts +54 -0
- package/dist/types/tools/subagent.d.ts +11 -1
- package/dist/types/web/search/index.d.ts +1 -0
- package/dist/types/web/search/provider.d.ts +11 -4
- package/dist/types/web/search/providers/duckduckgo.d.ts +57 -0
- package/dist/types/web/search/types.d.ts +1 -1
- package/package.json +7 -7
- package/src/async/job-manager.ts +522 -6
- package/src/cli/agents-cli.ts +3 -0
- package/src/cli/auth-broker-cli.ts +1 -0
- package/src/cli/config-cli.ts +10 -2
- package/src/cli.ts +2 -0
- package/src/commands/harness.ts +592 -0
- package/src/commands/team.ts +36 -39
- package/src/config/settings-schema.ts +15 -2
- package/src/config/settings.ts +49 -7
- package/src/deep-interview/render-middleware.ts +366 -0
- package/src/defaults/gjc/skills/deep-interview/SKILL.md +9 -2
- package/src/defaults/gjc/skills/ralplan/SKILL.md +8 -4
- package/src/defaults/gjc/skills/team/SKILL.md +47 -21
- package/src/defaults/gjc/skills/ultragoal/SKILL.md +78 -11
- package/src/discovery/helpers.ts +5 -0
- package/src/eval/js/shared/rewrite-imports.ts +1 -2
- package/src/exec/bash-executor.ts +20 -9
- package/src/extensibility/custom-tools/types.ts +1 -0
- package/src/extensibility/extensions/types.ts +6 -0
- package/src/extensibility/shared-events.ts +1 -0
- package/src/gjc-runtime/deep-interview-runtime.ts +40 -21
- package/src/gjc-runtime/goal-mode-request.ts +11 -3
- package/src/gjc-runtime/ralplan-runtime.ts +27 -10
- package/src/gjc-runtime/restricted-role-agent-bash.ts +5 -0
- package/src/gjc-runtime/state-graph.ts +86 -0
- package/src/gjc-runtime/state-migrations.ts +132 -0
- package/src/gjc-runtime/state-renderer.ts +345 -0
- package/src/gjc-runtime/state-runtime.ts +733 -21
- package/src/gjc-runtime/state-validation.ts +49 -0
- package/src/gjc-runtime/state-writer.ts +718 -0
- package/src/gjc-runtime/team-runtime.ts +1083 -89
- package/src/gjc-runtime/ultragoal-runtime.ts +348 -19
- package/src/gjc-runtime/workflow-manifest.generated.json +1497 -0
- package/src/gjc-runtime/workflow-manifest.ts +425 -0
- package/src/harness-control-plane/classifier.ts +128 -0
- package/src/harness-control-plane/control-endpoint.ts +137 -0
- package/src/harness-control-plane/finalize.ts +222 -0
- package/src/harness-control-plane/frame-mapper.ts +286 -0
- package/src/harness-control-plane/operate.ts +225 -0
- package/src/harness-control-plane/owner.ts +553 -0
- package/src/harness-control-plane/preserve.ts +102 -0
- package/src/harness-control-plane/receipts.ts +216 -0
- package/src/harness-control-plane/rpc-adapter.ts +276 -0
- package/src/harness-control-plane/seams.ts +39 -0
- package/src/harness-control-plane/session-lease.ts +388 -0
- package/src/harness-control-plane/state-machine.ts +97 -0
- package/src/harness-control-plane/storage.ts +257 -0
- package/src/harness-control-plane/types.ts +214 -0
- package/src/hooks/skill-keywords.ts +4 -2
- package/src/hooks/skill-state.ts +25 -42
- package/src/internal-urls/docs-index.generated.ts +6 -4
- package/src/lsp/render.ts +1 -1
- package/src/modes/acp/acp-agent.ts +1 -1
- package/src/modes/acp/acp-client-bridge.ts +1 -1
- package/src/modes/components/agent-dashboard.ts +1 -1
- package/src/modes/components/assistant-message.ts +5 -1
- package/src/modes/components/diff.ts +2 -2
- package/src/modes/components/hook-selector.ts +72 -2
- package/src/modes/components/skill-hud/render.ts +7 -2
- package/src/modes/controllers/event-controller.ts +71 -6
- package/src/modes/controllers/extension-ui-controller.ts +6 -0
- package/src/modes/controllers/input-controller.ts +19 -3
- package/src/modes/controllers/selector-controller.ts +3 -2
- package/src/modes/interactive-mode.ts +21 -2
- package/src/modes/theme/defaults/index.ts +0 -196
- package/src/modes/theme/theme.ts +35 -35
- package/src/modes/types.ts +2 -0
- package/src/prompts/agents/architect.md +5 -1
- package/src/prompts/agents/critic.md +5 -1
- package/src/prompts/agents/executor.md +13 -0
- package/src/prompts/agents/frontmatter.md +1 -0
- package/src/prompts/agents/planner.md +5 -1
- package/src/prompts/tools/bash.md +9 -0
- package/src/prompts/tools/cron.md +25 -0
- package/src/prompts/tools/monitor.md +30 -0
- package/src/prompts/tools/subagent.md +33 -3
- package/src/runtime-mcp/oauth-flow.ts +4 -2
- package/src/sdk.ts +7 -0
- package/src/session/agent-session.ts +247 -38
- package/src/session/session-manager.ts +13 -1
- package/src/session/streaming-output.ts +21 -0
- package/src/skill-state/active-state.ts +222 -78
- package/src/skill-state/deep-interview-mutation-guard.ts +91 -13
- package/src/skill-state/initial-phase.ts +2 -0
- package/src/skill-state/workflow-state-contract.ts +26 -0
- package/src/task/agents.ts +1 -0
- package/src/task/executor.ts +51 -8
- package/src/task/index.ts +120 -8
- package/src/task/render.ts +6 -3
- package/src/task/types.ts +57 -3
- package/src/tools/ask.ts +28 -7
- package/src/tools/bash-allowed-prefixes.ts +169 -0
- package/src/tools/bash.ts +190 -29
- package/src/tools/browser/tab-worker.ts +1 -1
- package/src/tools/cron.ts +665 -0
- package/src/tools/index.ts +20 -2
- package/src/tools/monitor.ts +136 -0
- package/src/tools/subagent.ts +255 -64
- package/src/vim/engine.ts +3 -3
- package/src/web/search/index.ts +31 -18
- package/src/web/search/provider.ts +57 -12
- package/src/web/search/providers/duckduckgo.ts +279 -0
- package/src/web/search/types.ts +2 -0
- package/src/modes/theme/dark.json +0 -95
- package/src/modes/theme/defaults/alabaster.json +0 -93
- package/src/modes/theme/defaults/amethyst.json +0 -96
- package/src/modes/theme/defaults/anthracite.json +0 -93
- package/src/modes/theme/defaults/basalt.json +0 -91
- package/src/modes/theme/defaults/birch.json +0 -95
- package/src/modes/theme/defaults/dark-abyss.json +0 -91
- package/src/modes/theme/defaults/dark-arctic.json +0 -104
- package/src/modes/theme/defaults/dark-aurora.json +0 -95
- package/src/modes/theme/defaults/dark-catppuccin.json +0 -107
- package/src/modes/theme/defaults/dark-cavern.json +0 -91
- package/src/modes/theme/defaults/dark-copper.json +0 -95
- package/src/modes/theme/defaults/dark-cosmos.json +0 -90
- package/src/modes/theme/defaults/dark-cyberpunk.json +0 -102
- package/src/modes/theme/defaults/dark-dracula.json +0 -98
- package/src/modes/theme/defaults/dark-eclipse.json +0 -91
- package/src/modes/theme/defaults/dark-ember.json +0 -95
- package/src/modes/theme/defaults/dark-equinox.json +0 -90
- package/src/modes/theme/defaults/dark-forest.json +0 -96
- package/src/modes/theme/defaults/dark-github.json +0 -105
- package/src/modes/theme/defaults/dark-gruvbox.json +0 -112
- package/src/modes/theme/defaults/dark-lavender.json +0 -95
- package/src/modes/theme/defaults/dark-lunar.json +0 -89
- package/src/modes/theme/defaults/dark-midnight.json +0 -95
- package/src/modes/theme/defaults/dark-monochrome.json +0 -94
- package/src/modes/theme/defaults/dark-monokai.json +0 -98
- package/src/modes/theme/defaults/dark-nebula.json +0 -90
- package/src/modes/theme/defaults/dark-nord.json +0 -97
- package/src/modes/theme/defaults/dark-ocean.json +0 -101
- package/src/modes/theme/defaults/dark-one.json +0 -100
- package/src/modes/theme/defaults/dark-poimandres.json +0 -141
- package/src/modes/theme/defaults/dark-rainforest.json +0 -91
- package/src/modes/theme/defaults/dark-reef.json +0 -91
- package/src/modes/theme/defaults/dark-retro.json +0 -92
- package/src/modes/theme/defaults/dark-rose-pine.json +0 -96
- package/src/modes/theme/defaults/dark-sakura.json +0 -95
- package/src/modes/theme/defaults/dark-slate.json +0 -95
- package/src/modes/theme/defaults/dark-solarized.json +0 -97
- package/src/modes/theme/defaults/dark-solstice.json +0 -90
- package/src/modes/theme/defaults/dark-starfall.json +0 -91
- package/src/modes/theme/defaults/dark-sunset.json +0 -99
- package/src/modes/theme/defaults/dark-swamp.json +0 -90
- package/src/modes/theme/defaults/dark-synthwave.json +0 -103
- package/src/modes/theme/defaults/dark-taiga.json +0 -91
- package/src/modes/theme/defaults/dark-terminal.json +0 -95
- package/src/modes/theme/defaults/dark-tokyo-night.json +0 -101
- package/src/modes/theme/defaults/dark-tundra.json +0 -91
- package/src/modes/theme/defaults/dark-twilight.json +0 -91
- package/src/modes/theme/defaults/dark-volcanic.json +0 -91
- package/src/modes/theme/defaults/graphite.json +0 -92
- package/src/modes/theme/defaults/light-arctic.json +0 -107
- package/src/modes/theme/defaults/light-aurora-day.json +0 -91
- package/src/modes/theme/defaults/light-canyon.json +0 -91
- package/src/modes/theme/defaults/light-catppuccin.json +0 -106
- package/src/modes/theme/defaults/light-cirrus.json +0 -90
- package/src/modes/theme/defaults/light-coral.json +0 -95
- package/src/modes/theme/defaults/light-cyberpunk.json +0 -96
- package/src/modes/theme/defaults/light-dawn.json +0 -90
- package/src/modes/theme/defaults/light-dunes.json +0 -91
- package/src/modes/theme/defaults/light-eucalyptus.json +0 -95
- package/src/modes/theme/defaults/light-forest.json +0 -100
- package/src/modes/theme/defaults/light-frost.json +0 -95
- package/src/modes/theme/defaults/light-github.json +0 -115
- package/src/modes/theme/defaults/light-glacier.json +0 -91
- package/src/modes/theme/defaults/light-gruvbox.json +0 -108
- package/src/modes/theme/defaults/light-haze.json +0 -90
- package/src/modes/theme/defaults/light-honeycomb.json +0 -95
- package/src/modes/theme/defaults/light-lagoon.json +0 -91
- package/src/modes/theme/defaults/light-lavender.json +0 -95
- package/src/modes/theme/defaults/light-meadow.json +0 -91
- package/src/modes/theme/defaults/light-mint.json +0 -95
- package/src/modes/theme/defaults/light-monochrome.json +0 -101
- package/src/modes/theme/defaults/light-ocean.json +0 -99
- package/src/modes/theme/defaults/light-one.json +0 -99
- package/src/modes/theme/defaults/light-opal.json +0 -91
- package/src/modes/theme/defaults/light-orchard.json +0 -91
- package/src/modes/theme/defaults/light-paper.json +0 -95
- package/src/modes/theme/defaults/light-poimandres.json +0 -141
- package/src/modes/theme/defaults/light-prism.json +0 -90
- package/src/modes/theme/defaults/light-retro.json +0 -98
- package/src/modes/theme/defaults/light-sand.json +0 -95
- package/src/modes/theme/defaults/light-savanna.json +0 -91
- package/src/modes/theme/defaults/light-solarized.json +0 -102
- package/src/modes/theme/defaults/light-soleil.json +0 -90
- package/src/modes/theme/defaults/light-sunset.json +0 -99
- package/src/modes/theme/defaults/light-synthwave.json +0 -98
- package/src/modes/theme/defaults/light-tokyo-night.json +0 -111
- package/src/modes/theme/defaults/light-wetland.json +0 -91
- package/src/modes/theme/defaults/light-zenith.json +0 -89
- package/src/modes/theme/defaults/limestone.json +0 -94
- package/src/modes/theme/defaults/mahogany.json +0 -97
- package/src/modes/theme/defaults/marble.json +0 -93
- package/src/modes/theme/defaults/obsidian.json +0 -91
- package/src/modes/theme/defaults/onyx.json +0 -91
- package/src/modes/theme/defaults/pearl.json +0 -93
- package/src/modes/theme/defaults/porcelain.json +0 -91
- package/src/modes/theme/defaults/quartz.json +0 -96
- package/src/modes/theme/defaults/sandstone.json +0 -95
- package/src/modes/theme/defaults/titanium.json +0 -90
- package/src/modes/theme/light.json +0 -93
|
@@ -251,11 +251,7 @@ export declare function stopThemeWatcher(): void;
|
|
|
251
251
|
* Used by HTML export to generate CSS custom properties.
|
|
252
252
|
*/
|
|
253
253
|
export declare function getResolvedThemeColors(themeName?: string): Promise<Record<string, string>>;
|
|
254
|
-
|
|
255
|
-
* Check if a theme is a "light" theme by analyzing its background color luminance.
|
|
256
|
-
* Loads theme JSON synchronously (built-in or custom file) and resolves userMessageBg.
|
|
257
|
-
*/
|
|
258
|
-
export declare function isLightTheme(themeName?: string): boolean;
|
|
254
|
+
export declare function isLightTheme(themeName?: string, agentDir?: string): boolean;
|
|
259
255
|
/**
|
|
260
256
|
* Get explicit export colors from theme JSON, if specified.
|
|
261
257
|
* Returns undefined for each color that isn't explicitly set.
|
|
@@ -70,6 +70,7 @@ export interface InteractiveModeContext {
|
|
|
70
70
|
isInitialized: boolean;
|
|
71
71
|
isBackgrounded: boolean;
|
|
72
72
|
isBashMode: boolean;
|
|
73
|
+
isBashNoContext: boolean;
|
|
73
74
|
toolOutputExpanded: boolean;
|
|
74
75
|
todoExpanded: boolean;
|
|
75
76
|
planModeEnabled: boolean;
|
|
@@ -92,6 +93,7 @@ export interface InteractiveModeContext {
|
|
|
92
93
|
retryLoader: Loader | undefined;
|
|
93
94
|
autoCompactionEscapeHandler?: () => void;
|
|
94
95
|
retryEscapeHandler?: () => void;
|
|
96
|
+
retryCountdownTimer?: ReturnType<typeof setInterval>;
|
|
95
97
|
unsubscribe?: () => void;
|
|
96
98
|
onInputCallback?: (input: SubmittedUserInput) => void;
|
|
97
99
|
optimisticUserMessageSignature: string | undefined;
|
package/dist/types/sdk.d.ts
CHANGED
|
@@ -99,6 +99,8 @@ export interface CreateAgentSessionOptions {
|
|
|
99
99
|
agentId?: string;
|
|
100
100
|
/** Display name for the agent in IRC. Default: "main" or "sub". */
|
|
101
101
|
agentDisplayName?: string;
|
|
102
|
+
/** Optional restricted bash command prefixes for read-only role agents. */
|
|
103
|
+
bashAllowedPrefixes?: string[];
|
|
102
104
|
/** Optional shared agent registry for IRC routing. Default: AgentRegistry.global(). */
|
|
103
105
|
agentRegistry?: AgentRegistry;
|
|
104
106
|
/** Parent task ID prefix for nested artifact naming (e.g., "6-Extensions") */
|
|
@@ -125,6 +127,8 @@ export interface CreateAgentSessionOptions {
|
|
|
125
127
|
forkContextSeed?: ForkContextSeed;
|
|
126
128
|
/** Optional provider state override. Fork-context children should omit this by default. */
|
|
127
129
|
providerSessionState?: Map<string, ProviderSessionState>;
|
|
130
|
+
/** Cooperative pause checkpoint passed through to Agent. */
|
|
131
|
+
shouldPause?: () => boolean;
|
|
128
132
|
}
|
|
129
133
|
/** Result from createAgentSession */
|
|
130
134
|
export interface CreateAgentSessionResult {
|
|
@@ -90,6 +90,7 @@ export type AgentSessionEvent = AgentEvent | {
|
|
|
90
90
|
maxAttempts: number;
|
|
91
91
|
delayMs: number;
|
|
92
92
|
errorMessage: string;
|
|
93
|
+
unbounded?: boolean;
|
|
93
94
|
} | {
|
|
94
95
|
type: "auto_retry_end";
|
|
95
96
|
success: boolean;
|
|
@@ -604,6 +605,7 @@ export declare class AgentSession {
|
|
|
604
605
|
abort(options?: {
|
|
605
606
|
goalReason?: "interrupted" | "internal";
|
|
606
607
|
timeoutMs?: number;
|
|
608
|
+
cause?: "user_interrupt" | "new_session" | "session_switch" | "compaction" | "handoff" | "tool_abort" | "internal";
|
|
607
609
|
}): Promise<void>;
|
|
608
610
|
/**
|
|
609
611
|
* Start a new session, optionally with initial messages and parent tracking.
|
|
@@ -752,6 +754,12 @@ export declare class AgentSession {
|
|
|
752
754
|
* Cancel in-progress retry.
|
|
753
755
|
*/
|
|
754
756
|
abortRetry(): void;
|
|
757
|
+
/**
|
|
758
|
+
* Skip the current retry backoff and re-attempt immediately. Distinct from
|
|
759
|
+
* abortRetry(), which cancels the retry and returns to idle. No-op when no
|
|
760
|
+
* retry backoff is active.
|
|
761
|
+
*/
|
|
762
|
+
retryNow(): void;
|
|
755
763
|
/** Whether auto-retry is currently in progress */
|
|
756
764
|
get isRetrying(): boolean;
|
|
757
765
|
/** Whether auto-retry is enabled */
|
|
@@ -41,6 +41,17 @@ export interface OutputSinkOptions {
|
|
|
41
41
|
onChunk?: (chunk: string) => void;
|
|
42
42
|
/** Minimum ms between onChunk calls. 0 = every chunk (default). */
|
|
43
43
|
chunkThrottleMs?: number;
|
|
44
|
+
/**
|
|
45
|
+
* Unthrottled per-chunk callback fired *after* sanitization but *before*
|
|
46
|
+
* any throttle gating, column capping, or head/tail bookkeeping. Used by
|
|
47
|
+
* background-job substrate to record the complete process stream for the
|
|
48
|
+
* Monitor tool while keeping `onChunk` cheap for UI/progress.
|
|
49
|
+
*
|
|
50
|
+
* Receives the sanitized chunk verbatim; never receives the column-capped
|
|
51
|
+
* or minimized text. Implementations must be fast and side-effect-free
|
|
52
|
+
* relative to the sink (the sink does not catch errors from this callback).
|
|
53
|
+
*/
|
|
54
|
+
onRawChunk?: (chunk: string) => void;
|
|
44
55
|
}
|
|
45
56
|
export interface TruncationResult {
|
|
46
57
|
content: string;
|
|
@@ -46,6 +46,8 @@ export interface SkillActiveState {
|
|
|
46
46
|
session_id?: string;
|
|
47
47
|
thread_id?: string;
|
|
48
48
|
turn_id?: string;
|
|
49
|
+
initialized_mode?: CanonicalGjcWorkflowSkill;
|
|
50
|
+
initialized_state_path?: string;
|
|
49
51
|
active_skills?: SkillActiveEntry[];
|
|
50
52
|
[key: string]: unknown;
|
|
51
53
|
}
|
|
@@ -74,6 +76,7 @@ export declare function isCanonicalGjcWorkflowSkill(skill: string): skill is Can
|
|
|
74
76
|
export declare function listActiveSkills(raw: unknown): SkillActiveEntry[];
|
|
75
77
|
export declare function normalizeSkillActiveState(raw: unknown): SkillActiveState | null;
|
|
76
78
|
export declare function getSkillActiveStatePaths(cwd: string, sessionId?: string): SkillActiveStatePaths;
|
|
79
|
+
export declare function collapsePlanningPipeline(entries: readonly SkillActiveEntry[]): SkillActiveEntry[];
|
|
77
80
|
export declare function readVisibleSkillActiveState(cwd: string, sessionId?: string): Promise<SkillActiveState | null>;
|
|
78
81
|
export declare function syncSkillActiveState(options: SyncSkillActiveStateOptions): Promise<void>;
|
|
79
82
|
export interface ApplyHandoffOptions {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { AgentTool } from "@gajae-code/agent-core";
|
|
2
2
|
export declare const DEEP_INTERVIEW_MUTATION_BLOCK_MESSAGE = "Deep-interview phase boundary: continue gathering context/questions/risks and emit a handoff/spec before code edits. Mutation tools and patch execution are blocked while deep-interview is active; finalize specs through `gjc deep-interview --write --stage final` or hand off to an execution phase.";
|
|
3
|
-
export declare const WORKFLOW_STATE_MUTATION_BLOCK_MESSAGE = "
|
|
3
|
+
export declare const WORKFLOW_STATE_MUTATION_BLOCK_MESSAGE = ".gjc workflow state and artifacts are runtime-owned. Agent mutation tools cannot edit `.gjc/**`; use the sanctioned `gjc` CLI instead.";
|
|
4
4
|
type ToolWithEditMode = AgentTool & {
|
|
5
5
|
mode?: unknown;
|
|
6
6
|
customWireName?: unknown;
|
|
@@ -4,6 +4,12 @@ export declare const WORKFLOW_STATE_RECEIPT_VERSION = 1;
|
|
|
4
4
|
export declare const WORKFLOW_STATE_RECEIPT_FRESH_MS: number;
|
|
5
5
|
export type WorkflowStateMutationOwner = "gjc-state-cli" | "gjc-runtime" | "gjc-hook";
|
|
6
6
|
export type WorkflowStateReceiptStatus = "fresh" | "stale";
|
|
7
|
+
export interface WorkflowStateContentChecksum {
|
|
8
|
+
algorithm: "sha256";
|
|
9
|
+
value: string;
|
|
10
|
+
covered_path: string;
|
|
11
|
+
computed_at: string;
|
|
12
|
+
}
|
|
7
13
|
export interface WorkflowStateReceipt {
|
|
8
14
|
version: 1;
|
|
9
15
|
skill: CanonicalGjcWorkflowSkill;
|
|
@@ -15,6 +21,24 @@ export interface WorkflowStateReceipt {
|
|
|
15
21
|
fresh_until: string;
|
|
16
22
|
status: WorkflowStateReceiptStatus;
|
|
17
23
|
mutation_id: string;
|
|
24
|
+
verb?: string;
|
|
25
|
+
from_phase?: string;
|
|
26
|
+
to_phase?: string;
|
|
27
|
+
forced?: boolean;
|
|
28
|
+
paths?: string[];
|
|
29
|
+
content_sha256?: WorkflowStateContentChecksum;
|
|
30
|
+
}
|
|
31
|
+
export interface AuditEntry {
|
|
32
|
+
ts: string;
|
|
33
|
+
skill?: string;
|
|
34
|
+
category: string;
|
|
35
|
+
verb: string;
|
|
36
|
+
owner: WorkflowStateMutationOwner;
|
|
37
|
+
mutation_id: string;
|
|
38
|
+
from_phase?: string;
|
|
39
|
+
to_phase?: string;
|
|
40
|
+
forced: boolean;
|
|
41
|
+
paths: string[];
|
|
18
42
|
}
|
|
19
43
|
export declare function workflowModeStateFileName(skill: CanonicalGjcWorkflowSkill): string;
|
|
20
44
|
export declare function workflowStateStoragePath(cwd: string, skill: CanonicalGjcWorkflowSkill, sessionId?: string): string;
|
|
@@ -29,6 +29,9 @@ export interface ExecutorOptions {
|
|
|
29
29
|
index: number;
|
|
30
30
|
id: string;
|
|
31
31
|
modelOverride?: string | string[];
|
|
32
|
+
runMode?: "initial" | "resume" | "message";
|
|
33
|
+
resumeMessage?: string;
|
|
34
|
+
subagentId?: string;
|
|
32
35
|
/**
|
|
33
36
|
* Active model selector of the parent session, used as an auth-aware fallback
|
|
34
37
|
* if the resolved subagent model has no working credentials. See #985.
|
|
@@ -32,7 +32,7 @@ export interface SubagentLifecyclePayload {
|
|
|
32
32
|
agent: string;
|
|
33
33
|
agentSource: AgentSource;
|
|
34
34
|
description?: string;
|
|
35
|
-
status: "started" | "completed" | "failed" | "aborted";
|
|
35
|
+
status: "started" | "completed" | "failed" | "aborted" | "paused";
|
|
36
36
|
sessionFile?: string;
|
|
37
37
|
index: number;
|
|
38
38
|
}
|
|
@@ -161,6 +161,7 @@ export interface AgentDefinition {
|
|
|
161
161
|
autoloadSkills?: string[];
|
|
162
162
|
hide?: boolean;
|
|
163
163
|
forkContext?: ForkContextPolicy;
|
|
164
|
+
bashAllowedPrefixes?: string[];
|
|
164
165
|
source: AgentSource;
|
|
165
166
|
filePath?: string;
|
|
166
167
|
}
|
|
@@ -170,7 +171,7 @@ export interface AgentProgress {
|
|
|
170
171
|
id: string;
|
|
171
172
|
agent: string;
|
|
172
173
|
agentSource: AgentSource;
|
|
173
|
-
status: "pending" | "running" | "completed" | "failed" | "aborted";
|
|
174
|
+
status: "pending" | "running" | "completed" | "failed" | "aborted" | "paused";
|
|
174
175
|
task: string;
|
|
175
176
|
assignment?: string;
|
|
176
177
|
description?: string;
|
|
@@ -212,6 +213,7 @@ export interface AgentProgress {
|
|
|
212
213
|
retryState?: {
|
|
213
214
|
attempt: number;
|
|
214
215
|
maxAttempts: number;
|
|
216
|
+
unbounded?: boolean;
|
|
215
217
|
delayMs: number;
|
|
216
218
|
errorMessage: string;
|
|
217
219
|
startedAtMs: number;
|
|
@@ -260,6 +262,7 @@ export interface SingleResult {
|
|
|
260
262
|
error?: string;
|
|
261
263
|
aborted?: boolean;
|
|
262
264
|
abortReason?: string;
|
|
265
|
+
paused?: boolean;
|
|
263
266
|
/** Aggregated usage from the subprocess, accumulated incrementally from message_end events. */
|
|
264
267
|
usage?: Usage;
|
|
265
268
|
/** Output path for the task result */
|
|
@@ -298,9 +301,59 @@ export interface TaskToolDetails {
|
|
|
298
301
|
outputPaths?: string[];
|
|
299
302
|
progress?: AgentProgress[];
|
|
300
303
|
async?: {
|
|
301
|
-
state: "running" | "completed" | "failed";
|
|
304
|
+
state: "running" | "paused" | "queued" | "completed" | "failed";
|
|
302
305
|
jobId: string;
|
|
303
306
|
type: "task";
|
|
304
307
|
};
|
|
305
308
|
}
|
|
309
|
+
/**
|
|
310
|
+
* Persisted per-turn / per-subagent token record (Phase 0 instrumentation).
|
|
311
|
+
*
|
|
312
|
+
* Additive: this does not alter any existing task result shape. It is the
|
|
313
|
+
* durable, model-independent unit the deterministic orchestration-token
|
|
314
|
+
* benchmark (`@gajae-code/orchestration-token-benchmark`) consumes to measure
|
|
315
|
+
* token efficiency without any live-model calls.
|
|
316
|
+
*/
|
|
317
|
+
export interface TaskTokenLog {
|
|
318
|
+
/** Subagent id, or "root" for the orchestrator's own turn. */
|
|
319
|
+
subagentId: string;
|
|
320
|
+
/** Agent name for attribution, when known. */
|
|
321
|
+
agent?: string;
|
|
322
|
+
/** 1-based turn index within the subagent's session. */
|
|
323
|
+
turn: number;
|
|
324
|
+
/** ISO-8601 timestamp the turn completed. */
|
|
325
|
+
at: string;
|
|
326
|
+
/** Cost-bearing input tokens (excludes cache reads), mirrors `Usage.input`. */
|
|
327
|
+
input: number;
|
|
328
|
+
/** Total output tokens for the turn, mirrors `Usage.output`. */
|
|
329
|
+
output: number;
|
|
330
|
+
/** Tokens read from the prompt cache, mirrors `Usage.cacheRead`. */
|
|
331
|
+
cacheRead: number;
|
|
332
|
+
/** Tokens written to the prompt cache, mirrors `Usage.cacheWrite`. */
|
|
333
|
+
cacheWrite: number;
|
|
334
|
+
/** input + output + cacheRead + cacheWrite. */
|
|
335
|
+
totalTokens: number;
|
|
336
|
+
/** Latest per-turn context-window occupancy, when known. */
|
|
337
|
+
contextTokens?: number;
|
|
338
|
+
/** Estimated USD cost for the turn, when known. */
|
|
339
|
+
cost?: number;
|
|
340
|
+
/** Model id used for the turn, when known. */
|
|
341
|
+
model?: string;
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Deterministic aggregate token metrics computed from a set of `TaskTokenLog`
|
|
345
|
+
* entries. The cache-hit-rate field is the primary prompt-cache signal called
|
|
346
|
+
* out by the prefix-stability invariant (see the approved plan).
|
|
347
|
+
*/
|
|
348
|
+
export interface TaskTokenMetrics {
|
|
349
|
+
/** Number of token-log entries aggregated. */
|
|
350
|
+
turns: number;
|
|
351
|
+
inputTokens: number;
|
|
352
|
+
outputTokens: number;
|
|
353
|
+
cacheReadTokens: number;
|
|
354
|
+
cacheWriteTokens: number;
|
|
355
|
+
totalTokens: number;
|
|
356
|
+
/** cacheRead / (input + cacheRead); 0 when there is no input-class traffic. */
|
|
357
|
+
cacheHitRate: number;
|
|
358
|
+
}
|
|
306
359
|
export {};
|
|
@@ -59,6 +59,30 @@ export declare class BashTool implements AgentTool<BashToolSchema, BashToolDetai
|
|
|
59
59
|
readonly concurrency = "exclusive";
|
|
60
60
|
readonly strict = true;
|
|
61
61
|
constructor(session: ToolSession);
|
|
62
|
+
/**
|
|
63
|
+
* Start a background bash job for the Monitor tool. Reuses the full Bash
|
|
64
|
+
* pipeline (interceptors, internal-URL expansion, env, cwd, timeout); the
|
|
65
|
+
* public `monitor` tool itself is ACP-gated by `AgentSession` before this
|
|
66
|
+
* helper is called. The caller-supplied `onRawLine` callback is invoked once
|
|
67
|
+
* per newline-terminated stdout chunk, between turns, so the upstream Claude
|
|
68
|
+
* Code "Each stdout line is a task-notification event" semantics are preserved
|
|
69
|
+
* through the agent's existing background-task delivery path.
|
|
70
|
+
*/
|
|
71
|
+
startMonitorJob(input: {
|
|
72
|
+
command: string;
|
|
73
|
+
cwd?: string;
|
|
74
|
+
timeout?: number;
|
|
75
|
+
env?: Record<string, string>;
|
|
76
|
+
}, opts?: {
|
|
77
|
+
ownerId?: string;
|
|
78
|
+
label?: string;
|
|
79
|
+
ctx?: AgentToolContext;
|
|
80
|
+
onRawLine?: (line: string, jobId: string) => void;
|
|
81
|
+
}): Promise<{
|
|
82
|
+
jobId: string;
|
|
83
|
+
label: string;
|
|
84
|
+
commandCwd: string;
|
|
85
|
+
}>;
|
|
62
86
|
execute(_toolCallId: string, { command: rawCommand, env: rawEnv, timeout: rawTimeout, cwd, async: asyncRequested, pty }: BashToolInput, signal?: AbortSignal, onUpdate?: AgentToolUpdateCallback<BashToolDetails>, ctx?: AgentToolContext): Promise<AgentToolResult<BashToolDetails>>;
|
|
63
87
|
}
|
|
64
88
|
export interface BashRenderArgs {
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import type { AgentTool, AgentToolContext, AgentToolResult, AgentToolUpdateCallback } from "@gajae-code/agent-core";
|
|
2
|
+
import * as z from "zod/v4";
|
|
3
|
+
import type { ToolSession } from "./index";
|
|
4
|
+
/** Maximum scheduled tasks per owner. Mirrors upstream Claude Code's 50-task cap. */
|
|
5
|
+
export declare const MAX_CRON_TASKS_PER_OWNER = 50;
|
|
6
|
+
/** Recurring tasks auto-expire 7 days after creation (mirrors upstream). */
|
|
7
|
+
export declare const CRON_RECURRING_MAX_AGE_MS: number;
|
|
8
|
+
declare const cronCreateSchema: z.ZodObject<{
|
|
9
|
+
cron_expression: z.ZodString;
|
|
10
|
+
prompt: z.ZodString;
|
|
11
|
+
recurring: z.ZodDefault<z.ZodBoolean>;
|
|
12
|
+
}, z.core.$strip>;
|
|
13
|
+
export type CronCreateParams = z.infer<typeof cronCreateSchema>;
|
|
14
|
+
declare const cronListSchema: z.ZodObject<{}, z.core.$strip>;
|
|
15
|
+
export type CronListParams = z.infer<typeof cronListSchema>;
|
|
16
|
+
declare const cronDeleteSchema: z.ZodObject<{
|
|
17
|
+
id: z.ZodString;
|
|
18
|
+
}, z.core.$strip>;
|
|
19
|
+
export type CronDeleteParams = z.infer<typeof cronDeleteSchema>;
|
|
20
|
+
export interface CronJobSnapshot {
|
|
21
|
+
id: string;
|
|
22
|
+
cron_expression: string;
|
|
23
|
+
prompt: string;
|
|
24
|
+
recurring: boolean;
|
|
25
|
+
createdAt: number;
|
|
26
|
+
expiresAt?: number;
|
|
27
|
+
nextFireAt?: number;
|
|
28
|
+
humanSchedule: string;
|
|
29
|
+
ownerId?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface CronListJobDetails {
|
|
32
|
+
id: string;
|
|
33
|
+
cron: string;
|
|
34
|
+
recurring: boolean;
|
|
35
|
+
prompt: string;
|
|
36
|
+
humanSchedule: string;
|
|
37
|
+
}
|
|
38
|
+
export interface CronCreateToolDetails {
|
|
39
|
+
id: string;
|
|
40
|
+
cron_expression: string;
|
|
41
|
+
recurring: boolean;
|
|
42
|
+
nextFireAt?: number;
|
|
43
|
+
}
|
|
44
|
+
export interface CronListToolDetails {
|
|
45
|
+
jobs: CronListJobDetails[];
|
|
46
|
+
}
|
|
47
|
+
export interface CronDeleteToolDetails {
|
|
48
|
+
id: string;
|
|
49
|
+
deleted: boolean;
|
|
50
|
+
}
|
|
51
|
+
/** Clear every schedule for an owner. Exported for tests + lifecycle teardown. */
|
|
52
|
+
export declare function clearOwnerSchedules(ownerId: string | undefined): void;
|
|
53
|
+
/** Reset every owner's schedule store. Test-only. */
|
|
54
|
+
export declare function resetCronRegistryForTests(): void;
|
|
55
|
+
export declare function validateCronExpression(expression: string): void;
|
|
56
|
+
export declare function findNextCronMatchMs(expression: string, afterMs: number, deadlineMs?: number): number | undefined;
|
|
57
|
+
export declare function calculateCronFireTimeMs(params: {
|
|
58
|
+
id: string;
|
|
59
|
+
cronExpression: string;
|
|
60
|
+
baseMatchMs: number;
|
|
61
|
+
recurring: boolean;
|
|
62
|
+
nowMs: number;
|
|
63
|
+
expiresAt?: number;
|
|
64
|
+
}): number;
|
|
65
|
+
export declare class CronCreateTool implements AgentTool<typeof cronCreateSchema, CronCreateToolDetails> {
|
|
66
|
+
private readonly session;
|
|
67
|
+
readonly name = "CronCreate";
|
|
68
|
+
readonly label = "CronCreate";
|
|
69
|
+
readonly summary = "Schedule a prompt on a 5-field cron expression";
|
|
70
|
+
readonly description: string;
|
|
71
|
+
readonly parameters: z.ZodObject<{
|
|
72
|
+
cron_expression: z.ZodString;
|
|
73
|
+
prompt: z.ZodString;
|
|
74
|
+
recurring: z.ZodDefault<z.ZodBoolean>;
|
|
75
|
+
}, z.core.$strip>;
|
|
76
|
+
readonly strict = true;
|
|
77
|
+
readonly loadMode = "discoverable";
|
|
78
|
+
constructor(session: ToolSession);
|
|
79
|
+
static createIf(session: ToolSession): CronCreateTool | null;
|
|
80
|
+
execute(_toolCallId: string, params: CronCreateParams, _signal?: AbortSignal, _onUpdate?: AgentToolUpdateCallback<CronCreateToolDetails>, _context?: AgentToolContext): Promise<AgentToolResult<CronCreateToolDetails>>;
|
|
81
|
+
}
|
|
82
|
+
export declare class CronListTool implements AgentTool<typeof cronListSchema, CronListToolDetails> {
|
|
83
|
+
private readonly session;
|
|
84
|
+
readonly name = "CronList";
|
|
85
|
+
readonly label = "CronList";
|
|
86
|
+
readonly summary = "List scheduled cron jobs";
|
|
87
|
+
readonly description: string;
|
|
88
|
+
readonly parameters: z.ZodObject<{}, z.core.$strip>;
|
|
89
|
+
readonly strict = true;
|
|
90
|
+
readonly loadMode = "discoverable";
|
|
91
|
+
constructor(session: ToolSession);
|
|
92
|
+
static createIf(session: ToolSession): CronListTool | null;
|
|
93
|
+
execute(_toolCallId: string, _params: CronListParams, _signal?: AbortSignal, _onUpdate?: AgentToolUpdateCallback<CronListToolDetails>, _context?: AgentToolContext): Promise<AgentToolResult<CronListToolDetails>>;
|
|
94
|
+
}
|
|
95
|
+
export declare class CronDeleteTool implements AgentTool<typeof cronDeleteSchema, CronDeleteToolDetails> {
|
|
96
|
+
private readonly session;
|
|
97
|
+
readonly name = "CronDelete";
|
|
98
|
+
readonly label = "CronDelete";
|
|
99
|
+
readonly summary = "Cancel a scheduled cron job by ID";
|
|
100
|
+
readonly description: string;
|
|
101
|
+
readonly parameters: z.ZodObject<{
|
|
102
|
+
id: z.ZodString;
|
|
103
|
+
}, z.core.$strip>;
|
|
104
|
+
readonly strict = true;
|
|
105
|
+
readonly loadMode = "discoverable";
|
|
106
|
+
constructor(session: ToolSession);
|
|
107
|
+
static createIf(session: ToolSession): CronDeleteTool | null;
|
|
108
|
+
execute(_toolCallId: string, params: CronDeleteParams, _signal?: AbortSignal, _onUpdate?: AgentToolUpdateCallback<CronDeleteToolDetails>, _context?: AgentToolContext): Promise<AgentToolResult<CronDeleteToolDetails>>;
|
|
109
|
+
}
|
|
110
|
+
export {};
|
|
@@ -32,6 +32,7 @@ export * from "./bash";
|
|
|
32
32
|
export * from "./browser";
|
|
33
33
|
export * from "./calculator";
|
|
34
34
|
export * from "./checkpoint";
|
|
35
|
+
export * from "./cron";
|
|
35
36
|
export * from "./debug";
|
|
36
37
|
export * from "./eval";
|
|
37
38
|
export * from "./find";
|
|
@@ -43,6 +44,7 @@ export * from "./image-gen";
|
|
|
43
44
|
export * from "./inspect-image";
|
|
44
45
|
export * from "./irc";
|
|
45
46
|
export * from "./job";
|
|
47
|
+
export * from "./monitor";
|
|
46
48
|
export * from "./read";
|
|
47
49
|
export * from "./recipe";
|
|
48
50
|
export * from "./render-mermaid";
|
|
@@ -118,6 +120,8 @@ export interface ToolSession {
|
|
|
118
120
|
getToolByName?: (name: string) => AgentTool | undefined;
|
|
119
121
|
/** Agent registry for IRC routing across live sessions. */
|
|
120
122
|
agentRegistry?: AgentRegistry;
|
|
123
|
+
/** Optional restricted bash command prefixes for read-only role agents. */
|
|
124
|
+
bashAllowedPrefixes?: string[];
|
|
121
125
|
/** Get artifacts directory for artifact:// URLs */
|
|
122
126
|
getArtifactsDir?: () => string | null;
|
|
123
127
|
/** Get the ArtifactManager backing this session (shared across parent + subagents). */
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { AgentTool, AgentToolContext, AgentToolResult, AgentToolUpdateCallback } from "@gajae-code/agent-core";
|
|
2
|
+
import * as z from "zod/v4";
|
|
3
|
+
import type { ToolSession } from "./index";
|
|
4
|
+
declare const monitorKindEnum: z.ZodEnum<{
|
|
5
|
+
log: "log";
|
|
6
|
+
other: "other";
|
|
7
|
+
poll: "poll";
|
|
8
|
+
watch: "watch";
|
|
9
|
+
}>;
|
|
10
|
+
declare const monitorSchema: z.ZodObject<{
|
|
11
|
+
command: z.ZodString;
|
|
12
|
+
kind: z.ZodEnum<{
|
|
13
|
+
log: "log";
|
|
14
|
+
other: "other";
|
|
15
|
+
poll: "poll";
|
|
16
|
+
watch: "watch";
|
|
17
|
+
}>;
|
|
18
|
+
description: z.ZodString;
|
|
19
|
+
timeout: z.ZodOptional<z.ZodNumber>;
|
|
20
|
+
persistent: z.ZodOptional<z.ZodBoolean>;
|
|
21
|
+
}, z.core.$strip>;
|
|
22
|
+
export type MonitorParams = z.infer<typeof monitorSchema>;
|
|
23
|
+
export interface MonitorToolDetails {
|
|
24
|
+
taskId: string;
|
|
25
|
+
kind: z.infer<typeof monitorKindEnum>;
|
|
26
|
+
description: string;
|
|
27
|
+
command: string;
|
|
28
|
+
persistent: boolean;
|
|
29
|
+
}
|
|
30
|
+
export declare class MonitorTool implements AgentTool<typeof monitorSchema, MonitorToolDetails> {
|
|
31
|
+
private readonly session;
|
|
32
|
+
readonly name = "monitor";
|
|
33
|
+
readonly label = "Monitor";
|
|
34
|
+
readonly summary = "Start a background monitor that streams stdout lines as task notifications";
|
|
35
|
+
readonly description: string;
|
|
36
|
+
readonly parameters: z.ZodObject<{
|
|
37
|
+
command: z.ZodString;
|
|
38
|
+
kind: z.ZodEnum<{
|
|
39
|
+
log: "log";
|
|
40
|
+
other: "other";
|
|
41
|
+
poll: "poll";
|
|
42
|
+
watch: "watch";
|
|
43
|
+
}>;
|
|
44
|
+
description: z.ZodString;
|
|
45
|
+
timeout: z.ZodOptional<z.ZodNumber>;
|
|
46
|
+
persistent: z.ZodOptional<z.ZodBoolean>;
|
|
47
|
+
}, z.core.$strip>;
|
|
48
|
+
readonly strict = true;
|
|
49
|
+
readonly loadMode = "discoverable";
|
|
50
|
+
constructor(session: ToolSession);
|
|
51
|
+
static createIf(session: ToolSession): MonitorTool | null;
|
|
52
|
+
execute(_toolCallId: string, params: MonitorParams, _signal?: AbortSignal, _onUpdate?: AgentToolUpdateCallback<MonitorToolDetails>, context?: AgentToolContext): Promise<AgentToolResult<MonitorToolDetails>>;
|
|
53
|
+
}
|
|
54
|
+
export {};
|
|
@@ -8,13 +8,18 @@ declare const subagentSchema: z.ZodObject<{
|
|
|
8
8
|
cancel: "cancel";
|
|
9
9
|
inspect: "inspect";
|
|
10
10
|
list: "list";
|
|
11
|
+
pause: "pause";
|
|
12
|
+
resume: "resume";
|
|
13
|
+
steer: "steer";
|
|
11
14
|
}>;
|
|
12
15
|
ids: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
16
|
+
message: z.ZodOptional<z.ZodString>;
|
|
17
|
+
pause: z.ZodOptional<z.ZodBoolean>;
|
|
13
18
|
timeout_ms: z.ZodOptional<z.ZodNumber>;
|
|
14
19
|
limit: z.ZodOptional<z.ZodNumber>;
|
|
15
20
|
}, z.core.$strip>;
|
|
16
21
|
type SubagentParams = z.infer<typeof subagentSchema>;
|
|
17
|
-
type SubagentStatus = "running" | "completed" | "failed" | "cancelled" | "not_found" | "already_completed";
|
|
22
|
+
type SubagentStatus = "running" | "paused" | "queued" | "completed" | "failed" | "cancelled" | "not_found" | "already_completed";
|
|
18
23
|
export interface SubagentSnapshot {
|
|
19
24
|
id: string;
|
|
20
25
|
jobId: string;
|
|
@@ -45,8 +50,13 @@ export declare class SubagentTool implements AgentTool<typeof subagentSchema, Su
|
|
|
45
50
|
cancel: "cancel";
|
|
46
51
|
inspect: "inspect";
|
|
47
52
|
list: "list";
|
|
53
|
+
pause: "pause";
|
|
54
|
+
resume: "resume";
|
|
55
|
+
steer: "steer";
|
|
48
56
|
}>;
|
|
49
57
|
ids: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
58
|
+
message: z.ZodOptional<z.ZodString>;
|
|
59
|
+
pause: z.ZodOptional<z.ZodBoolean>;
|
|
50
60
|
timeout_ms: z.ZodOptional<z.ZodNumber>;
|
|
51
61
|
limit: z.ZodOptional<z.ZodNumber>;
|
|
52
62
|
}, z.core.$strip>;
|
|
@@ -14,8 +14,15 @@ export declare const SEARCH_PROVIDER_ORDER: SearchProviderId[];
|
|
|
14
14
|
/** Set the preferred web search provider from settings */
|
|
15
15
|
export declare function setPreferredSearchProvider(provider: SearchProviderId | "auto"): void;
|
|
16
16
|
/**
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* is
|
|
17
|
+
* Resolve the ordered provider chain for a search request.
|
|
18
|
+
*
|
|
19
|
+
* Resolution is active-model-gated, never credential-scanning:
|
|
20
|
+
* 1. An explicitly preferred provider (settings) that is available is primary.
|
|
21
|
+
* 2. Otherwise the active model's own native search is primary, but only when
|
|
22
|
+
* that provider's own credentials are present (its `isAvailable()`).
|
|
23
|
+
* 3. DuckDuckGo (keyless) is always appended as the terminal fallback, so a
|
|
24
|
+
* missing primary — or a primary runtime failure — still returns results
|
|
25
|
+
* with zero configuration. Keyed standalone providers are never
|
|
26
|
+
* auto-selected; they are reachable only via explicit selection (step 1).
|
|
20
27
|
*/
|
|
21
|
-
export declare function resolveProviderChain(authStorage: AuthStorage, preferredProvider?: SearchProviderId | "auto"): Promise<SearchProvider[]>;
|
|
28
|
+
export declare function resolveProviderChain(authStorage: AuthStorage, preferredProvider?: SearchProviderId | "auto", activeModelProvider?: string): Promise<SearchProvider[]>;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DuckDuckGo Web Search Provider
|
|
3
|
+
*
|
|
4
|
+
* Keyless, permissionless web search. Scrapes DuckDuckGo's no-JavaScript HTML
|
|
5
|
+
* endpoints and maps anchors/snippets into the unified SearchResponse shape
|
|
6
|
+
* (sources only — DuckDuckGo does not synthesize an answer).
|
|
7
|
+
*
|
|
8
|
+
* This is the zero-config default/fallback backend: it requires no API key and
|
|
9
|
+
* no OAuth, so `isAvailable()` is always true. Because DuckDuckGo applies
|
|
10
|
+
* anti-bot rate limiting (HTTP 202 / 403 / empty responses) from datacenter and
|
|
11
|
+
* VPN IPs, the provider is best-effort: it retries with backoff, rotates the
|
|
12
|
+
* user-agent, and alternates between the `html` and `lite` endpoints. When every
|
|
13
|
+
* attempt fails it throws a {@link SearchProviderError} rather than returning an
|
|
14
|
+
* empty success — it never falls through to keyed providers.
|
|
15
|
+
*
|
|
16
|
+
* Endpoints:
|
|
17
|
+
* https://html.duckduckgo.com/html/ (primary)
|
|
18
|
+
* https://lite.duckduckgo.com/lite/ (fallback markup)
|
|
19
|
+
*
|
|
20
|
+
* The HTML markup is liable to drift; the parser is deliberately small and is
|
|
21
|
+
* pinned by fixture-driven tests (see test/tools/web-search-duckduckgo.test.ts).
|
|
22
|
+
*/
|
|
23
|
+
import type { AuthStorage } from "@gajae-code/ai";
|
|
24
|
+
import type { SearchResponse } from "../../../web/search/types";
|
|
25
|
+
import type { SearchParams } from "./base";
|
|
26
|
+
import { SearchProvider } from "./base";
|
|
27
|
+
interface ParsedResult {
|
|
28
|
+
title: string;
|
|
29
|
+
url: string;
|
|
30
|
+
snippet?: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Resolve a DuckDuckGo result href to the real destination URL. DuckDuckGo wraps
|
|
34
|
+
* external links in a `/l/?uddg=<encoded>` redirect; `lite` sometimes links
|
|
35
|
+
* directly. Returns null for unusable or internal links (so ads/redirect shells
|
|
36
|
+
* are dropped).
|
|
37
|
+
*/
|
|
38
|
+
export declare function decodeResultUrl(href: string): string | null;
|
|
39
|
+
/** Parse results from the `html.duckduckgo.com/html/` markup. */
|
|
40
|
+
export declare function parseHtmlResults(html: string): ParsedResult[];
|
|
41
|
+
/** Parse results from the `lite.duckduckgo.com/lite/` markup. */
|
|
42
|
+
export declare function parseLiteResults(html: string): ParsedResult[];
|
|
43
|
+
/** Execute a keyless DuckDuckGo web search with light resilience. */
|
|
44
|
+
export declare function searchDuckDuckGo(params: {
|
|
45
|
+
query: string;
|
|
46
|
+
num_results?: number;
|
|
47
|
+
recency?: "day" | "week" | "month" | "year";
|
|
48
|
+
signal?: AbortSignal;
|
|
49
|
+
}): Promise<SearchResponse>;
|
|
50
|
+
/** Keyless, permissionless web search provider backed by DuckDuckGo. */
|
|
51
|
+
export declare class DuckDuckGoProvider extends SearchProvider {
|
|
52
|
+
readonly id = "duckduckgo";
|
|
53
|
+
readonly label = "DuckDuckGo";
|
|
54
|
+
isAvailable(_authStorage: AuthStorage): boolean;
|
|
55
|
+
search(params: SearchParams): Promise<SearchResponse>;
|
|
56
|
+
}
|
|
57
|
+
export {};
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Unified types for web search responses across supported providers.
|
|
5
5
|
*/
|
|
6
6
|
/** Supported web search providers */
|
|
7
|
-
export type SearchProviderId = "exa" | "brave" | "jina" | "kimi" | "zai" | "anthropic" | "perplexity" | "gemini" | "codex" | "tavily" | "parallel" | "kagi" | "synthetic" | "searxng";
|
|
7
|
+
export type SearchProviderId = "duckduckgo" | "exa" | "brave" | "jina" | "kimi" | "zai" | "anthropic" | "perplexity" | "gemini" | "codex" | "tavily" | "parallel" | "kagi" | "synthetic" | "searxng";
|
|
8
8
|
export declare function isSearchProviderId(value: string): value is SearchProviderId;
|
|
9
9
|
export declare function isSearchProviderPreference(value: string): value is SearchProviderId | "auto";
|
|
10
10
|
/** Source returned by search (all providers) */
|