@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.
Files changed (266) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +1 -1
  3. package/dist/types/async/job-manager.d.ts +145 -2
  4. package/dist/types/commands/harness.d.ts +37 -0
  5. package/dist/types/config/settings-schema.d.ts +13 -3
  6. package/dist/types/config/settings.d.ts +3 -1
  7. package/dist/types/deep-interview/render-middleware.d.ts +5 -0
  8. package/dist/types/discovery/helpers.d.ts +1 -0
  9. package/dist/types/exec/bash-executor.d.ts +8 -1
  10. package/dist/types/extensibility/custom-tools/types.d.ts +1 -0
  11. package/dist/types/extensibility/extensions/types.d.ts +6 -0
  12. package/dist/types/extensibility/shared-events.d.ts +1 -0
  13. package/dist/types/gjc-runtime/restricted-role-agent-bash.d.ts +2 -0
  14. package/dist/types/gjc-runtime/state-graph.d.ts +4 -0
  15. package/dist/types/gjc-runtime/state-migrations.d.ts +24 -0
  16. package/dist/types/gjc-runtime/state-renderer.d.ts +65 -0
  17. package/dist/types/gjc-runtime/state-runtime.d.ts +2 -0
  18. package/dist/types/gjc-runtime/state-validation.d.ts +6 -0
  19. package/dist/types/gjc-runtime/state-writer.d.ts +137 -0
  20. package/dist/types/gjc-runtime/team-runtime.d.ts +81 -7
  21. package/dist/types/gjc-runtime/workflow-manifest.d.ts +54 -0
  22. package/dist/types/harness-control-plane/classifier.d.ts +13 -0
  23. package/dist/types/harness-control-plane/control-endpoint.d.ts +30 -0
  24. package/dist/types/harness-control-plane/finalize.d.ts +47 -0
  25. package/dist/types/harness-control-plane/frame-mapper.d.ts +29 -0
  26. package/dist/types/harness-control-plane/operate.d.ts +35 -0
  27. package/dist/types/harness-control-plane/owner.d.ts +46 -0
  28. package/dist/types/harness-control-plane/preserve.d.ts +19 -0
  29. package/dist/types/harness-control-plane/receipts.d.ts +88 -0
  30. package/dist/types/harness-control-plane/rpc-adapter.d.ts +66 -0
  31. package/dist/types/harness-control-plane/seams.d.ts +21 -0
  32. package/dist/types/harness-control-plane/session-lease.d.ts +65 -0
  33. package/dist/types/harness-control-plane/state-machine.d.ts +19 -0
  34. package/dist/types/harness-control-plane/storage.d.ts +53 -0
  35. package/dist/types/harness-control-plane/types.d.ts +162 -0
  36. package/dist/types/hooks/skill-keywords.d.ts +2 -1
  37. package/dist/types/hooks/skill-state.d.ts +2 -29
  38. package/dist/types/modes/acp/acp-client-bridge.d.ts +1 -1
  39. package/dist/types/modes/components/hook-selector.d.ts +1 -0
  40. package/dist/types/modes/components/skill-hud/render.d.ts +1 -1
  41. package/dist/types/modes/interactive-mode.d.ts +2 -0
  42. package/dist/types/modes/theme/defaults/index.d.ts +45 -9477
  43. package/dist/types/modes/theme/theme.d.ts +1 -5
  44. package/dist/types/modes/types.d.ts +2 -0
  45. package/dist/types/sdk.d.ts +4 -0
  46. package/dist/types/session/agent-session.d.ts +8 -0
  47. package/dist/types/session/streaming-output.d.ts +11 -0
  48. package/dist/types/skill-state/active-state.d.ts +3 -0
  49. package/dist/types/skill-state/deep-interview-mutation-guard.d.ts +1 -1
  50. package/dist/types/skill-state/workflow-state-contract.d.ts +24 -0
  51. package/dist/types/task/executor.d.ts +3 -0
  52. package/dist/types/task/types.d.ts +56 -3
  53. package/dist/types/tools/bash-allowed-prefixes.d.ts +5 -0
  54. package/dist/types/tools/bash.d.ts +24 -0
  55. package/dist/types/tools/cron.d.ts +110 -0
  56. package/dist/types/tools/index.d.ts +4 -0
  57. package/dist/types/tools/monitor.d.ts +54 -0
  58. package/dist/types/tools/subagent.d.ts +11 -1
  59. package/dist/types/web/search/index.d.ts +1 -0
  60. package/dist/types/web/search/provider.d.ts +11 -4
  61. package/dist/types/web/search/providers/duckduckgo.d.ts +57 -0
  62. package/dist/types/web/search/types.d.ts +1 -1
  63. package/package.json +7 -7
  64. package/src/async/job-manager.ts +522 -6
  65. package/src/cli/agents-cli.ts +3 -0
  66. package/src/cli/auth-broker-cli.ts +1 -0
  67. package/src/cli/config-cli.ts +10 -2
  68. package/src/cli.ts +2 -0
  69. package/src/commands/harness.ts +592 -0
  70. package/src/commands/team.ts +36 -39
  71. package/src/config/settings-schema.ts +15 -2
  72. package/src/config/settings.ts +49 -7
  73. package/src/deep-interview/render-middleware.ts +366 -0
  74. package/src/defaults/gjc/skills/deep-interview/SKILL.md +9 -2
  75. package/src/defaults/gjc/skills/ralplan/SKILL.md +8 -4
  76. package/src/defaults/gjc/skills/team/SKILL.md +47 -21
  77. package/src/defaults/gjc/skills/ultragoal/SKILL.md +78 -11
  78. package/src/discovery/helpers.ts +5 -0
  79. package/src/eval/js/shared/rewrite-imports.ts +1 -2
  80. package/src/exec/bash-executor.ts +20 -9
  81. package/src/extensibility/custom-tools/types.ts +1 -0
  82. package/src/extensibility/extensions/types.ts +6 -0
  83. package/src/extensibility/shared-events.ts +1 -0
  84. package/src/gjc-runtime/deep-interview-runtime.ts +40 -21
  85. package/src/gjc-runtime/goal-mode-request.ts +11 -3
  86. package/src/gjc-runtime/ralplan-runtime.ts +27 -10
  87. package/src/gjc-runtime/restricted-role-agent-bash.ts +5 -0
  88. package/src/gjc-runtime/state-graph.ts +86 -0
  89. package/src/gjc-runtime/state-migrations.ts +132 -0
  90. package/src/gjc-runtime/state-renderer.ts +345 -0
  91. package/src/gjc-runtime/state-runtime.ts +733 -21
  92. package/src/gjc-runtime/state-validation.ts +49 -0
  93. package/src/gjc-runtime/state-writer.ts +718 -0
  94. package/src/gjc-runtime/team-runtime.ts +1083 -89
  95. package/src/gjc-runtime/ultragoal-runtime.ts +348 -19
  96. package/src/gjc-runtime/workflow-manifest.generated.json +1497 -0
  97. package/src/gjc-runtime/workflow-manifest.ts +425 -0
  98. package/src/harness-control-plane/classifier.ts +128 -0
  99. package/src/harness-control-plane/control-endpoint.ts +137 -0
  100. package/src/harness-control-plane/finalize.ts +222 -0
  101. package/src/harness-control-plane/frame-mapper.ts +286 -0
  102. package/src/harness-control-plane/operate.ts +225 -0
  103. package/src/harness-control-plane/owner.ts +553 -0
  104. package/src/harness-control-plane/preserve.ts +102 -0
  105. package/src/harness-control-plane/receipts.ts +216 -0
  106. package/src/harness-control-plane/rpc-adapter.ts +276 -0
  107. package/src/harness-control-plane/seams.ts +39 -0
  108. package/src/harness-control-plane/session-lease.ts +388 -0
  109. package/src/harness-control-plane/state-machine.ts +97 -0
  110. package/src/harness-control-plane/storage.ts +257 -0
  111. package/src/harness-control-plane/types.ts +214 -0
  112. package/src/hooks/skill-keywords.ts +4 -2
  113. package/src/hooks/skill-state.ts +25 -42
  114. package/src/internal-urls/docs-index.generated.ts +6 -4
  115. package/src/lsp/render.ts +1 -1
  116. package/src/modes/acp/acp-agent.ts +1 -1
  117. package/src/modes/acp/acp-client-bridge.ts +1 -1
  118. package/src/modes/components/agent-dashboard.ts +1 -1
  119. package/src/modes/components/assistant-message.ts +5 -1
  120. package/src/modes/components/diff.ts +2 -2
  121. package/src/modes/components/hook-selector.ts +72 -2
  122. package/src/modes/components/skill-hud/render.ts +7 -2
  123. package/src/modes/controllers/event-controller.ts +71 -6
  124. package/src/modes/controllers/extension-ui-controller.ts +6 -0
  125. package/src/modes/controllers/input-controller.ts +19 -3
  126. package/src/modes/controllers/selector-controller.ts +3 -2
  127. package/src/modes/interactive-mode.ts +21 -2
  128. package/src/modes/theme/defaults/index.ts +0 -196
  129. package/src/modes/theme/theme.ts +35 -35
  130. package/src/modes/types.ts +2 -0
  131. package/src/prompts/agents/architect.md +5 -1
  132. package/src/prompts/agents/critic.md +5 -1
  133. package/src/prompts/agents/executor.md +13 -0
  134. package/src/prompts/agents/frontmatter.md +1 -0
  135. package/src/prompts/agents/planner.md +5 -1
  136. package/src/prompts/tools/bash.md +9 -0
  137. package/src/prompts/tools/cron.md +25 -0
  138. package/src/prompts/tools/monitor.md +30 -0
  139. package/src/prompts/tools/subagent.md +33 -3
  140. package/src/runtime-mcp/oauth-flow.ts +4 -2
  141. package/src/sdk.ts +7 -0
  142. package/src/session/agent-session.ts +247 -38
  143. package/src/session/session-manager.ts +13 -1
  144. package/src/session/streaming-output.ts +21 -0
  145. package/src/skill-state/active-state.ts +222 -78
  146. package/src/skill-state/deep-interview-mutation-guard.ts +91 -13
  147. package/src/skill-state/initial-phase.ts +2 -0
  148. package/src/skill-state/workflow-state-contract.ts +26 -0
  149. package/src/task/agents.ts +1 -0
  150. package/src/task/executor.ts +51 -8
  151. package/src/task/index.ts +120 -8
  152. package/src/task/render.ts +6 -3
  153. package/src/task/types.ts +57 -3
  154. package/src/tools/ask.ts +28 -7
  155. package/src/tools/bash-allowed-prefixes.ts +169 -0
  156. package/src/tools/bash.ts +190 -29
  157. package/src/tools/browser/tab-worker.ts +1 -1
  158. package/src/tools/cron.ts +665 -0
  159. package/src/tools/index.ts +20 -2
  160. package/src/tools/monitor.ts +136 -0
  161. package/src/tools/subagent.ts +255 -64
  162. package/src/vim/engine.ts +3 -3
  163. package/src/web/search/index.ts +31 -18
  164. package/src/web/search/provider.ts +57 -12
  165. package/src/web/search/providers/duckduckgo.ts +279 -0
  166. package/src/web/search/types.ts +2 -0
  167. package/src/modes/theme/dark.json +0 -95
  168. package/src/modes/theme/defaults/alabaster.json +0 -93
  169. package/src/modes/theme/defaults/amethyst.json +0 -96
  170. package/src/modes/theme/defaults/anthracite.json +0 -93
  171. package/src/modes/theme/defaults/basalt.json +0 -91
  172. package/src/modes/theme/defaults/birch.json +0 -95
  173. package/src/modes/theme/defaults/dark-abyss.json +0 -91
  174. package/src/modes/theme/defaults/dark-arctic.json +0 -104
  175. package/src/modes/theme/defaults/dark-aurora.json +0 -95
  176. package/src/modes/theme/defaults/dark-catppuccin.json +0 -107
  177. package/src/modes/theme/defaults/dark-cavern.json +0 -91
  178. package/src/modes/theme/defaults/dark-copper.json +0 -95
  179. package/src/modes/theme/defaults/dark-cosmos.json +0 -90
  180. package/src/modes/theme/defaults/dark-cyberpunk.json +0 -102
  181. package/src/modes/theme/defaults/dark-dracula.json +0 -98
  182. package/src/modes/theme/defaults/dark-eclipse.json +0 -91
  183. package/src/modes/theme/defaults/dark-ember.json +0 -95
  184. package/src/modes/theme/defaults/dark-equinox.json +0 -90
  185. package/src/modes/theme/defaults/dark-forest.json +0 -96
  186. package/src/modes/theme/defaults/dark-github.json +0 -105
  187. package/src/modes/theme/defaults/dark-gruvbox.json +0 -112
  188. package/src/modes/theme/defaults/dark-lavender.json +0 -95
  189. package/src/modes/theme/defaults/dark-lunar.json +0 -89
  190. package/src/modes/theme/defaults/dark-midnight.json +0 -95
  191. package/src/modes/theme/defaults/dark-monochrome.json +0 -94
  192. package/src/modes/theme/defaults/dark-monokai.json +0 -98
  193. package/src/modes/theme/defaults/dark-nebula.json +0 -90
  194. package/src/modes/theme/defaults/dark-nord.json +0 -97
  195. package/src/modes/theme/defaults/dark-ocean.json +0 -101
  196. package/src/modes/theme/defaults/dark-one.json +0 -100
  197. package/src/modes/theme/defaults/dark-poimandres.json +0 -141
  198. package/src/modes/theme/defaults/dark-rainforest.json +0 -91
  199. package/src/modes/theme/defaults/dark-reef.json +0 -91
  200. package/src/modes/theme/defaults/dark-retro.json +0 -92
  201. package/src/modes/theme/defaults/dark-rose-pine.json +0 -96
  202. package/src/modes/theme/defaults/dark-sakura.json +0 -95
  203. package/src/modes/theme/defaults/dark-slate.json +0 -95
  204. package/src/modes/theme/defaults/dark-solarized.json +0 -97
  205. package/src/modes/theme/defaults/dark-solstice.json +0 -90
  206. package/src/modes/theme/defaults/dark-starfall.json +0 -91
  207. package/src/modes/theme/defaults/dark-sunset.json +0 -99
  208. package/src/modes/theme/defaults/dark-swamp.json +0 -90
  209. package/src/modes/theme/defaults/dark-synthwave.json +0 -103
  210. package/src/modes/theme/defaults/dark-taiga.json +0 -91
  211. package/src/modes/theme/defaults/dark-terminal.json +0 -95
  212. package/src/modes/theme/defaults/dark-tokyo-night.json +0 -101
  213. package/src/modes/theme/defaults/dark-tundra.json +0 -91
  214. package/src/modes/theme/defaults/dark-twilight.json +0 -91
  215. package/src/modes/theme/defaults/dark-volcanic.json +0 -91
  216. package/src/modes/theme/defaults/graphite.json +0 -92
  217. package/src/modes/theme/defaults/light-arctic.json +0 -107
  218. package/src/modes/theme/defaults/light-aurora-day.json +0 -91
  219. package/src/modes/theme/defaults/light-canyon.json +0 -91
  220. package/src/modes/theme/defaults/light-catppuccin.json +0 -106
  221. package/src/modes/theme/defaults/light-cirrus.json +0 -90
  222. package/src/modes/theme/defaults/light-coral.json +0 -95
  223. package/src/modes/theme/defaults/light-cyberpunk.json +0 -96
  224. package/src/modes/theme/defaults/light-dawn.json +0 -90
  225. package/src/modes/theme/defaults/light-dunes.json +0 -91
  226. package/src/modes/theme/defaults/light-eucalyptus.json +0 -95
  227. package/src/modes/theme/defaults/light-forest.json +0 -100
  228. package/src/modes/theme/defaults/light-frost.json +0 -95
  229. package/src/modes/theme/defaults/light-github.json +0 -115
  230. package/src/modes/theme/defaults/light-glacier.json +0 -91
  231. package/src/modes/theme/defaults/light-gruvbox.json +0 -108
  232. package/src/modes/theme/defaults/light-haze.json +0 -90
  233. package/src/modes/theme/defaults/light-honeycomb.json +0 -95
  234. package/src/modes/theme/defaults/light-lagoon.json +0 -91
  235. package/src/modes/theme/defaults/light-lavender.json +0 -95
  236. package/src/modes/theme/defaults/light-meadow.json +0 -91
  237. package/src/modes/theme/defaults/light-mint.json +0 -95
  238. package/src/modes/theme/defaults/light-monochrome.json +0 -101
  239. package/src/modes/theme/defaults/light-ocean.json +0 -99
  240. package/src/modes/theme/defaults/light-one.json +0 -99
  241. package/src/modes/theme/defaults/light-opal.json +0 -91
  242. package/src/modes/theme/defaults/light-orchard.json +0 -91
  243. package/src/modes/theme/defaults/light-paper.json +0 -95
  244. package/src/modes/theme/defaults/light-poimandres.json +0 -141
  245. package/src/modes/theme/defaults/light-prism.json +0 -90
  246. package/src/modes/theme/defaults/light-retro.json +0 -98
  247. package/src/modes/theme/defaults/light-sand.json +0 -95
  248. package/src/modes/theme/defaults/light-savanna.json +0 -91
  249. package/src/modes/theme/defaults/light-solarized.json +0 -102
  250. package/src/modes/theme/defaults/light-soleil.json +0 -90
  251. package/src/modes/theme/defaults/light-sunset.json +0 -99
  252. package/src/modes/theme/defaults/light-synthwave.json +0 -98
  253. package/src/modes/theme/defaults/light-tokyo-night.json +0 -111
  254. package/src/modes/theme/defaults/light-wetland.json +0 -91
  255. package/src/modes/theme/defaults/light-zenith.json +0 -89
  256. package/src/modes/theme/defaults/limestone.json +0 -94
  257. package/src/modes/theme/defaults/mahogany.json +0 -97
  258. package/src/modes/theme/defaults/marble.json +0 -93
  259. package/src/modes/theme/defaults/obsidian.json +0 -91
  260. package/src/modes/theme/defaults/onyx.json +0 -91
  261. package/src/modes/theme/defaults/pearl.json +0 -93
  262. package/src/modes/theme/defaults/porcelain.json +0 -91
  263. package/src/modes/theme/defaults/quartz.json +0 -96
  264. package/src/modes/theme/defaults/sandstone.json +0 -95
  265. package/src/modes/theme/defaults/titanium.json +0 -90
  266. package/src/modes/theme/light.json +0 -93
@@ -0,0 +1,88 @@
1
+ import type { GitDelta, ReceiptFamily, RecoveryClassification } from "./types";
2
+ export interface ReceiptSubject {
3
+ workspace: string;
4
+ branch: string | null;
5
+ head: string | null;
6
+ commit: string | null;
7
+ }
8
+ export interface ReceiptEnvelope<E = Record<string, unknown>> {
9
+ receiptId: string;
10
+ schemaVersion: number;
11
+ sessionId: string;
12
+ family: ReceiptFamily;
13
+ valid: boolean;
14
+ createdAt: string;
15
+ source: string;
16
+ subject: ReceiptSubject;
17
+ evidence: E;
18
+ /** Hashes of out-of-line artifacts (diff patches, validation logs) folded into the receipt hash. */
19
+ artifactHashes: Record<string, string>;
20
+ sha256: string;
21
+ }
22
+ export declare const RECEIPT_SCHEMA_VERSION: 1;
23
+ export declare function sha256Hex(input: string): string;
24
+ export interface BuildReceiptInput<E> {
25
+ receiptId: string;
26
+ sessionId: string;
27
+ family: ReceiptFamily;
28
+ source: string;
29
+ subject: ReceiptSubject;
30
+ evidence: E;
31
+ artifactHashes?: Record<string, string>;
32
+ createdAt?: string;
33
+ valid?: boolean;
34
+ }
35
+ export declare function buildReceipt<E>(input: BuildReceiptInput<E>): ReceiptEnvelope<E>;
36
+ export interface ValidationOutcome {
37
+ valid: boolean;
38
+ reasons: string[];
39
+ }
40
+ /** Recompute the hash and run structural family checks. Fail-closed. */
41
+ export declare function validateReceipt(receipt: ReceiptEnvelope<unknown>): ValidationOutcome;
42
+ export interface VanishEvidence {
43
+ classification: RecoveryClassification;
44
+ gitDelta: GitDelta;
45
+ gitStatusPorcelain: string;
46
+ untrackedManifest: {
47
+ path: string;
48
+ size: number;
49
+ sha256: string;
50
+ }[];
51
+ preservation: "snapshot" | "stash" | "block";
52
+ stashRef: string | null;
53
+ snapshotComplete: boolean;
54
+ forbiddenActions: string[];
55
+ }
56
+ export interface PromptAcceptanceEvidence {
57
+ promptSha256: string;
58
+ rpcCommandId: string;
59
+ preSubmitState: {
60
+ isStreaming: boolean;
61
+ steeringQueueDepth: number;
62
+ followupQueueDepth: number;
63
+ };
64
+ preSubmitCursor: number;
65
+ agentStartCursor: number;
66
+ acceptedAt: string;
67
+ singleFlight: true;
68
+ }
69
+ export interface ValidationEvidence {
70
+ command: string;
71
+ exactCommand: string;
72
+ cwd: string;
73
+ exitStatus: number;
74
+ pass: boolean;
75
+ commitUnderTest: string | null;
76
+ }
77
+ export interface CompletionEvidence {
78
+ finalCommit: string;
79
+ branch: string;
80
+ prUrl: string | null;
81
+ issueArtifact: string | null;
82
+ requiredValidationReceiptIds: string[];
83
+ finalLifecycle: string;
84
+ finalizedAt: string;
85
+ blockers: string[];
86
+ }
87
+ /** Classifications that MUST have a valid `vanish` receipt before the action proceeds. */
88
+ export declare function requiresVanishBeforeAction(classification: RecoveryClassification): boolean;
@@ -0,0 +1,66 @@
1
+ export interface RpcStateSnapshot {
2
+ isStreaming: boolean;
3
+ steeringQueueDepth: number;
4
+ followupQueueDepth: number;
5
+ }
6
+ /** Abstract handle to a live gajae-code RPC session. */
7
+ export interface HarnessRpc {
8
+ getState(): Promise<RpcStateSnapshot>;
9
+ /** Send a prompt; resolves with the RPC command id and whether it was acked. Does NOT await agent_start. */
10
+ sendPrompt(prompt: string): Promise<{
11
+ commandId: string;
12
+ ack: boolean;
13
+ }>;
14
+ /** Monotonic count of events observed so far (the acceptance cursor). */
15
+ eventCursor(): number;
16
+ /** Resolve when an `agent_start` event arrives strictly after `afterCursor`, else null on timeout. */
17
+ waitForAgentStart(afterCursor: number, timeoutMs: number): Promise<{
18
+ cursor: number;
19
+ } | null>;
20
+ close(): Promise<void>;
21
+ /** Subscribe to parsed event frames (non-ready, non-response), fired AFTER the cursor advances. Returns unsubscribe. */
22
+ onEventFrame?(listener: (frame: Record<string, unknown>) => void): () => void;
23
+ /** Whether the underlying RPC subprocess is still alive. */
24
+ isLive?(): boolean;
25
+ /** ISO timestamp of the last observed event frame, or null. */
26
+ lastFrameAt?(): string | null;
27
+ }
28
+ export interface AcceptanceResult {
29
+ accepted: boolean;
30
+ reason: string;
31
+ commandId: string | null;
32
+ preSubmitCursor: number;
33
+ agentStartCursor: number | null;
34
+ preSubmitState: RpcStateSnapshot;
35
+ }
36
+ /**
37
+ * Single-flight acceptance: idle + empty-queue pre-state, ack, then the NEXT
38
+ * `agent_start` after the pre-submit cursor within `timeoutMs`.
39
+ */
40
+ export declare function singleFlightAccept(rpc: HarnessRpc, prompt: string, timeoutMs: number): Promise<AcceptanceResult>;
41
+ /**
42
+ * Real adapter: spawns `gjc --mode rpc --session-dir <dir>` and speaks the JSONL
43
+ * protocol from docs/rpc.md. Verified end-to-end in the M10 suite.
44
+ */
45
+ export declare class GajaeCodeRpc implements HarnessRpc {
46
+ #private;
47
+ constructor(opts: {
48
+ sessionDir: string;
49
+ command?: string[];
50
+ cwd?: string;
51
+ env?: NodeJS.ProcessEnv;
52
+ });
53
+ onEventFrame(listener: (frame: Record<string, unknown>) => void): () => void;
54
+ isLive(): boolean;
55
+ lastFrameAt(): string | null;
56
+ getState(): Promise<RpcStateSnapshot>;
57
+ sendPrompt(prompt: string): Promise<{
58
+ commandId: string;
59
+ ack: boolean;
60
+ }>;
61
+ eventCursor(): number;
62
+ waitForAgentStart(afterCursor: number, timeoutMs: number): Promise<{
63
+ cursor: number;
64
+ } | null>;
65
+ close(): Promise<void>;
66
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * v1 seams (M11). The control plane is harness-agnostic by design, but v1 ships ONLY the
3
+ * gajae-code adapter. Other harnesses and transports are explicit, designed-not-built seams
4
+ * that fail closed with a clear `seam_unsupported_in_v1` signal rather than silently degrading.
5
+ */
6
+ import type { Harness } from "./types";
7
+ export declare const SUPPORTED_HARNESSES: readonly Harness[];
8
+ export declare const DEFERRED_SEAMS: readonly ["codex-adapter", "omx-adapter", "remote-transport", "global-daemon", "capability-token-auth", "web-viewer", "fleet-control-plane", "rich-tui-coview"];
9
+ export type DeferredSeam = (typeof DEFERRED_SEAMS)[number];
10
+ export declare function isHarnessSupported(harness: string): harness is Harness;
11
+ export interface UnsupportedSeamResult {
12
+ ok: false;
13
+ error: string;
14
+ evidence: {
15
+ seam: true;
16
+ name: string;
17
+ supported: readonly Harness[];
18
+ deferred: readonly string[];
19
+ };
20
+ }
21
+ export declare function unsupportedSeam(name: string): UnsupportedSeamResult;
@@ -0,0 +1,65 @@
1
+ export interface SessionLease {
2
+ ownerId: string;
3
+ sessionId: string;
4
+ pid: number;
5
+ leaseTokenHash: string;
6
+ endpoint: {
7
+ kind: "unix-socket" | "fifo";
8
+ path: string;
9
+ } | null;
10
+ eventsPath: string;
11
+ heartbeatAt: string;
12
+ expiresAt: string;
13
+ leaseEpoch: number;
14
+ writer: {
15
+ ownerId: string;
16
+ leaseEpoch: number;
17
+ };
18
+ }
19
+ export declare class LeaseError extends Error {
20
+ readonly code: string;
21
+ constructor(message: string, code: string);
22
+ }
23
+ export type LeaseStatus = "missing" | "live" | "expiredAlive" | "dead" | "epermAlive";
24
+ type PidStatus = "alive" | "dead" | "eperm";
25
+ export declare function readLease(root: string, sessionId: string): Promise<SessionLease | null>;
26
+ export declare function isExpired(lease: SessionLease, clock?: () => number): boolean;
27
+ export declare function classifyLeaseStatus(lease: SessionLease | null, opts?: {
28
+ clock?: () => number;
29
+ probe?: (pid: number) => PidStatus;
30
+ }): LeaseStatus;
31
+ /** Liveness probe via signal 0. Defaults to the real process table; injectable for tests. */
32
+ export declare function isOwnerAlive(pid: number, probe?: (pid: number) => boolean): boolean;
33
+ export declare function isStale(lease: SessionLease, opts?: {
34
+ clock?: () => number;
35
+ probe?: (pid: number) => boolean;
36
+ }): boolean;
37
+ export interface AcquireOptions {
38
+ ownerId: string;
39
+ pid: number;
40
+ endpoint?: SessionLease["endpoint"];
41
+ eventsPath: string;
42
+ ttlMs: number;
43
+ clock?: () => number;
44
+ probe?: (pid: number) => boolean | PidStatus;
45
+ }
46
+ export interface AcquiredLease {
47
+ lease: SessionLease;
48
+ token: string;
49
+ }
50
+ /**
51
+ * Acquire (or take over a stale) lease. Fails closed with `lease_held` when a live,
52
+ * unexpired lease is held by a different owner. Re-acquiring as the current owner refreshes.
53
+ */
54
+ export declare function acquireLease(root: string, sessionId: string, opts: AcquireOptions): Promise<AcquiredLease>;
55
+ /** Refresh the lease expiry. Only the recorded owner may heartbeat (single-writer). */
56
+ export declare function heartbeat(root: string, sessionId: string, ownerId: string, ttlMs: number, clock?: () => number): Promise<SessionLease>;
57
+ /** Whether `ownerId` is the live, unexpired single writer permitted to append events. */
58
+ export declare function canWriteEvents(lease: SessionLease, ownerId: string, clock?: () => number): boolean;
59
+ /** Release the lease (owner shutdown). Only the holder may release. */
60
+ export declare function releaseLease(root: string, sessionId: string, ownerId: string): Promise<void>;
61
+ export declare function reapDeadOwnerArtifacts(root: string, sessionId: string, expectedOwnerId: string, expectedEpoch: number, opts?: {
62
+ clock?: () => number;
63
+ probe?: (pid: number) => PidStatus;
64
+ }): Promise<boolean>;
65
+ export {};
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Lifecycle state machine + the universal `{state, evidence, nextAllowedActions}` contract.
3
+ *
4
+ * `nextAllowedActions` is the forcing function: it tells the caller exactly which
5
+ * primitives are currently permitted and, when not, why. Owner-routed verbs
6
+ * (`submit`) report `owner-not-live` when no `RuntimeOwner` holds the session lease.
7
+ */
8
+ import type { HarnessLifecycle, NextAllowedAction, PrimitiveResponse, SessionState, SessionStateView } from "./types";
9
+ export declare function isTerminal(lifecycle: HarnessLifecycle): boolean;
10
+ export declare function canTransition(from: HarnessLifecycle, to: HarnessLifecycle): boolean;
11
+ export declare function assertTransition(from: HarnessLifecycle, to: HarnessLifecycle): void;
12
+ /**
13
+ * Derive the permitted next actions for a session given its lifecycle and whether
14
+ * a live owner currently holds the lease.
15
+ */
16
+ export declare function nextAllowedActions(lifecycle: HarnessLifecycle, ownerLive: boolean): NextAllowedAction[];
17
+ export declare function buildStateView(state: SessionState, ownerLive: boolean): SessionStateView;
18
+ /** Build the universal contract response carried by every primitive. */
19
+ export declare function buildResponse<E extends Record<string, unknown>>(state: SessionState, ownerLive: boolean, evidence: E, ok?: boolean): PrimitiveResponse<E>;
@@ -0,0 +1,53 @@
1
+ import type { EventEnvelope, ReceiptFamily, SessionState } from "./types";
2
+ export declare const MAX_UNIX_SOCKET_PATH_BYTES = 100;
3
+ export declare function controlSocketPath(root: string, sessionId: string, env?: NodeJS.ProcessEnv): string;
4
+ export declare class StorageError extends Error {
5
+ readonly code: string;
6
+ constructor(message: string, code: string);
7
+ }
8
+ /** Resolve the harness state root from explicit value, env, or cwd default. */
9
+ export declare function resolveHarnessRoot(opts?: {
10
+ root?: string;
11
+ cwd?: string;
12
+ env?: NodeJS.ProcessEnv;
13
+ }): string;
14
+ export declare function assertSafeSessionId(id: string): void;
15
+ export declare function generateSessionId(prefix?: string): string;
16
+ export interface SessionPaths {
17
+ dir: string;
18
+ state: string;
19
+ lease: string;
20
+ events: string;
21
+ receiptsIndex: string;
22
+ receiptsDir: string;
23
+ artifactsDir: string;
24
+ controlSock: string;
25
+ controlFifo: string;
26
+ gjcSessionDir: string;
27
+ }
28
+ export declare function sessionPaths(root: string, sessionId: string): SessionPaths;
29
+ export declare function readSessionState(root: string, sessionId: string): Promise<SessionState | null>;
30
+ export declare function writeSessionState(root: string, state: SessionState): Promise<void>;
31
+ export declare function sessionExists(root: string, sessionId: string): Promise<boolean>;
32
+ /** Append a single severity envelope to events.jsonl. Single-writer discipline is the owner's job (M3). */
33
+ export declare function appendEvent(root: string, sessionId: string, envelope: EventEnvelope): Promise<void>;
34
+ /** Read events from cursor (exclusive). Tail-only: never mutates the log. */
35
+ export declare function readEvents(root: string, sessionId: string, fromCursor?: number): Promise<EventEnvelope[]>;
36
+ export interface ReceiptIndexEntry {
37
+ receiptId: string;
38
+ family: ReceiptFamily;
39
+ valid: boolean;
40
+ createdAt: string;
41
+ path: string;
42
+ }
43
+ /**
44
+ * Persist a receipt immutably. Fails closed if the receipt id already exists,
45
+ * then appends an index entry to receipts.jsonl.
46
+ */
47
+ export declare function writeReceiptImmutable(root: string, sessionId: string, family: ReceiptFamily, receiptId: string, value: {
48
+ receiptId: string;
49
+ family: ReceiptFamily;
50
+ valid: boolean;
51
+ createdAt: string;
52
+ }): Promise<ReceiptIndexEntry>;
53
+ export declare function readReceiptIndex(root: string, sessionId: string, family?: ReceiptFamily): Promise<ReceiptIndexEntry[]>;
@@ -0,0 +1,162 @@
1
+ /**
2
+ * Core types for the gajae-code-native coding-harness operations control plane (v1).
3
+ *
4
+ * See the approved consensus plan at
5
+ * `.gjc/plans/ralplan/2026-06-02-0853-3e33/stage-02-revision.md` and the spec at
6
+ * `.gjc/specs/deep-interview-harness-control-plane.md`.
7
+ *
8
+ * v1 implements the gajae-code adapter only. omx/codex/remote/auth are deferred seams.
9
+ */
10
+ /** Harnesses the control plane can operate. v1 implements `gajae-code` only. */
11
+ export type Harness = "gajae-code" | "codex" | "omx";
12
+ /** Lifecycle states of an operated session. */
13
+ export type HarnessLifecycle = "new" | "started" | "submitted" | "observing" | "recovering" | "validating" | "finalizing" | "completed" | "blocked" | "retired";
14
+ /** Event severities emitted by the owner. */
15
+ export type Severity = "info" | "warn" | "critical";
16
+ /** Bounded git delta classification surfaced by `observe`. */
17
+ export type GitDelta = "clean" | "dirty" | "zero-delta" | "unknown";
18
+ /** Risk classification surfaced by `observe`. */
19
+ export type RiskKind = "normal" | "prompt-not-accepted" | "deleted-worktree" | "vanished-dirty";
20
+ /** Deterministic recovery classifications. */
21
+ export type RecoveryClassification = "continue" | "send-enter" | "reinject-prompt" | "restart-clean" | "restart-preserve-delta" | "fallback-codex-exec" | "human-check";
22
+ /** Receipt families persisted under the session storage dir. */
23
+ export type ReceiptFamily = "vanish" | "prompt-acceptance" | "validation" | "completion";
24
+ /** The CLI verbs / primitives exposed by `gjc harness <verb>`. */
25
+ export type HarnessVerb = "start" | "submit" | "observe" | "classify" | "recover" | "validate" | "finalize" | "retire" | "events" | "monitor" | "operate";
26
+ /** Submission transports. */
27
+ export type SubmitMode = "paste-buffer" | "stdin" | "file";
28
+ /** A single entry in the forcing-function `nextAllowedActions` list. */
29
+ export interface NextAllowedAction {
30
+ verb: HarnessVerb;
31
+ available: boolean;
32
+ /** Present when `available` is false; explains why the verb is currently disallowed. */
33
+ reason?: string;
34
+ }
35
+ /** Compact, model-facing view of session state included in every response. */
36
+ export interface SessionStateView {
37
+ sessionId: string;
38
+ lifecycle: HarnessLifecycle;
39
+ harness: Harness;
40
+ ownerLive: boolean;
41
+ blockers: string[];
42
+ }
43
+ /**
44
+ * The universal contract: EVERY primitive response carries `{state, evidence, nextAllowedActions}`.
45
+ * `ok` is a transport-level convenience; semantic blocking is expressed via state + nextAllowedActions.
46
+ */
47
+ export interface PrimitiveResponse<E = Record<string, unknown>> {
48
+ ok: boolean;
49
+ state: SessionStateView;
50
+ evidence: E;
51
+ nextAllowedActions: NextAllowedAction[];
52
+ }
53
+ /** Re-grabbable session handle returned by `start` / `operate`. */
54
+ export interface SessionHandle {
55
+ sessionId: string;
56
+ harness: Harness;
57
+ repo: string | null;
58
+ workspace: string;
59
+ branch: string | null;
60
+ base: string | null;
61
+ issueOrPr: string | null;
62
+ processHandle: {
63
+ kind: "runtime-owner";
64
+ ownerId: string | null;
65
+ pid: number | null;
66
+ };
67
+ rpcHandle: {
68
+ kind: "rpc-subprocess";
69
+ pid: number | null;
70
+ sessionDir: string;
71
+ };
72
+ ownerHandle: {
73
+ leasePath: string;
74
+ endpoint: string | null;
75
+ heartbeatAt: string | null;
76
+ };
77
+ routerHandle: {
78
+ kind: "default-in-owner";
79
+ policy: string;
80
+ eventsPath: string;
81
+ };
82
+ viewportHandle: {
83
+ kind: "event-monitor";
84
+ tmuxSessionName: string | null;
85
+ viewOnly: true;
86
+ };
87
+ startedAt: string;
88
+ updatedAt: string;
89
+ }
90
+ /** Persisted per-session record (state.json). */
91
+ export interface SessionState {
92
+ schemaVersion: number;
93
+ sessionId: string;
94
+ lifecycle: HarnessLifecycle;
95
+ harness: Harness;
96
+ handle: SessionHandle;
97
+ /** Per-classification retry counters consumed by the recovery policy. */
98
+ retries: Record<string, number>;
99
+ blockers: string[];
100
+ createdAt: string;
101
+ updatedAt: string;
102
+ }
103
+ /** Bounded observed-signal vocabulary surfaced by `observe` (the owner only ever emits these). */
104
+ export type ObservedSignal = "SessionStart" | "prompt-accepted" | "tool-call" | "test-running" | "commit-created" | "completed" | "error" | "streaming" | "idle";
105
+ export declare const OBSERVED_SIGNALS: readonly ObservedSignal[];
106
+ /** Bounded observation surfaced by `observe` — never a raw pane/transcript dump. */
107
+ export interface Observation {
108
+ lifecycle: HarnessLifecycle;
109
+ ownerLive: boolean;
110
+ cwd: string;
111
+ branch: string | null;
112
+ gitDelta: GitDelta;
113
+ lastActivityAt: string | null;
114
+ observedSignals: string[];
115
+ risk: RiskKind;
116
+ /** RPC subprocess liveness, distinct from owner-process/lease liveness. Optional for back-compat. */
117
+ rpcLive?: boolean;
118
+ /** ISO timestamp of the most recent RPC frame the owner observed, if any. */
119
+ rpcLastFrameAt?: string | null;
120
+ }
121
+ /** Input to the deterministic recovery classifier. */
122
+ export interface ClassifyInput {
123
+ observation: Observation;
124
+ /** Remaining retry budget per classification family. */
125
+ retryBudget: RetryBudget;
126
+ /** Whether an accepted prompt was in flight when the owner/RPC was last seen. */
127
+ acceptedPromptActive?: boolean;
128
+ }
129
+ /** Default and supplied retry budgets. */
130
+ export interface RetryBudget {
131
+ reinjectPrompt: number;
132
+ zeroDeltaVanish: number;
133
+ dirtyVanishPreserve: number;
134
+ validationRepair: number;
135
+ }
136
+ /** Result of the deterministic recovery classifier. */
137
+ export interface RecoveryDecision {
138
+ classification: RecoveryClassification;
139
+ reason: string;
140
+ severity: Severity;
141
+ /** Whether executing the recommended action requires a live owner. */
142
+ ownerRequired: boolean;
143
+ /** Receipt family that MUST be valid before the action may proceed (e.g. `vanish`). */
144
+ requiredReceiptFamily: ReceiptFamily | null;
145
+ }
146
+ /** Severity-tagged event envelope written exclusively by the owner. */
147
+ export interface EventEnvelope<E = Record<string, unknown>> {
148
+ eventId: string;
149
+ cursor: number;
150
+ createdAt: string;
151
+ severity: Severity;
152
+ kind: string;
153
+ state: SessionStateView;
154
+ evidence: E;
155
+ nextAllowedActions: NextAllowedAction[];
156
+ writer: {
157
+ ownerId: string;
158
+ leaseEpoch: number;
159
+ };
160
+ }
161
+ export declare const SESSION_SCHEMA_VERSION: 1;
162
+ export declare const DEFAULT_RETRY_BUDGET: RetryBudget;
@@ -1,3 +1,4 @@
1
+ import { type CanonicalGjcWorkflowSkill } from "../skill-state/active-state";
1
2
  export interface SkillKeywordDefinition {
2
3
  keyword: string;
3
4
  skill: GjcWorkflowSkill;
@@ -5,7 +6,7 @@ export interface SkillKeywordDefinition {
5
6
  guidance: string;
6
7
  }
7
8
  export declare const GJC_WORKFLOW_SKILLS: readonly ["deep-interview", "ralplan", "ultragoal", "team"];
8
- export type GjcWorkflowSkill = (typeof GJC_WORKFLOW_SKILLS)[number];
9
+ export type GjcWorkflowSkill = CanonicalGjcWorkflowSkill;
9
10
  export declare const GJC_SKILL_KEYWORD_DEFINITIONS: readonly SkillKeywordDefinition[];
10
11
  export declare function isGjcWorkflowSkill(value: string): value is GjcWorkflowSkill;
11
12
  export declare function compareSkillKeywordMatches(a: {
@@ -1,5 +1,5 @@
1
1
  import type { SkillDiscoverySettings } from "../config/skill-settings-defaults";
2
- import type { SkillActiveEntry as CanonicalSkillActiveEntry, WorkflowHudSummary } from "../skill-state/active-state";
2
+ import { type SkillActiveState } from "../skill-state/active-state";
3
3
  import { type GjcWorkflowSkill } from "./skill-keywords";
4
4
  export declare const GJC_STATE_DIR = ".gjc/state";
5
5
  export declare const SKILL_ACTIVE_STATE_FILE = "skill-active-state.json";
@@ -14,34 +14,7 @@ export interface SkillKeywordMatch {
14
14
  skill: GjcWorkflowSkill;
15
15
  priority: number;
16
16
  }
17
- export interface SkillActiveEntry extends Omit<CanonicalSkillActiveEntry, "skill"> {
18
- skill: GjcWorkflowSkill;
19
- phase?: string;
20
- active?: boolean;
21
- activated_at?: string;
22
- updated_at?: string;
23
- session_id?: string;
24
- thread_id?: string;
25
- turn_id?: string;
26
- hud?: WorkflowHudSummary;
27
- stale?: boolean;
28
- }
29
- export interface SkillActiveState {
30
- version: number;
31
- active: boolean;
32
- skill: GjcWorkflowSkill;
33
- keyword: string;
34
- phase: string;
35
- activated_at: string;
36
- updated_at: string;
37
- source: "gjc-skill-state-hook";
38
- session_id?: string;
39
- thread_id?: string;
40
- turn_id?: string;
41
- initialized_mode?: GjcWorkflowSkill;
42
- initialized_state_path?: string;
43
- active_skills: SkillActiveEntry[];
44
- }
17
+ export type { SkillActiveEntry, SkillActiveState } from "../skill-state/active-state";
45
18
  export interface ModeState {
46
19
  active?: boolean;
47
20
  current_phase?: string;
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * ACP-side `ClientBridge` implementation. Wraps `AgentSideConnection` so the
3
- * `read`/`write`/`bash`/`edit` tools (and the permission gate in
3
+ * `read`/`write`/`bash`/`monitor`/`edit` tools (and the permission gate in
4
4
  * `AgentSession`) can route through the client when it advertises the
5
5
  * relevant capabilities at `initialize` time.
6
6
  */
@@ -21,6 +21,7 @@ export interface HookSelectorOptions {
21
21
  * byte-identical to the previous implementation for all consumers.
22
22
  */
23
23
  wrapFocused?: boolean;
24
+ scrollTitleRows?: number;
24
25
  }
25
26
  export declare class HookSelectorComponent extends Container {
26
27
  #private;
@@ -1,2 +1,2 @@
1
- import type { SkillActiveEntry } from "../../../skill-state/active-state";
1
+ import { type SkillActiveEntry } from "../../../skill-state/active-state";
2
2
  export declare function renderSkillHudBar(entries: readonly SkillActiveEntry[], width: number): string | null;
@@ -61,6 +61,7 @@ export declare class InteractiveMode implements InteractiveModeContext {
61
61
  isInitialized: boolean;
62
62
  isBackgrounded: boolean;
63
63
  isBashMode: boolean;
64
+ isBashNoContext: boolean;
64
65
  toolOutputExpanded: boolean;
65
66
  todoExpanded: boolean;
66
67
  planModeEnabled: boolean;
@@ -85,6 +86,7 @@ export declare class InteractiveMode implements InteractiveModeContext {
85
86
  retryLoader: Loader | undefined;
86
87
  autoCompactionEscapeHandler?: () => void;
87
88
  retryEscapeHandler?: () => void;
89
+ retryCountdownTimer?: ReturnType<typeof setInterval>;
88
90
  unsubscribe?: () => void;
89
91
  onInputCallback?: (input: SubmittedUserInput) => void;
90
92
  optimisticUserMessageSignature: string | undefined;