@twelvehart/orcats 0.0.0-seed.0 → 0.2.3
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/LICENSE +48 -0
- package/NOTICE +5 -0
- package/README.md +399 -0
- package/bin/orcats +4 -0
- package/dist/backends/acp-client.d.ts +74 -0
- package/dist/backends/acp-client.d.ts.map +1 -0
- package/dist/backends/acp-run.d.ts +31 -0
- package/dist/backends/acp-run.d.ts.map +1 -0
- package/dist/backends/claude-run.d.ts +35 -0
- package/dist/backends/claude-run.d.ts.map +1 -0
- package/dist/backends/claude-stream-json.d.ts +15 -0
- package/dist/backends/claude-stream-json.d.ts.map +1 -0
- package/dist/backends/codex-jsonl.d.ts +34 -0
- package/dist/backends/codex-jsonl.d.ts.map +1 -0
- package/dist/backends/codex-run.d.ts +40 -0
- package/dist/backends/codex-run.d.ts.map +1 -0
- package/dist/backends/codex.d.ts +5 -0
- package/dist/backends/codex.d.ts.map +1 -0
- package/dist/backends/conversation-config.d.ts +12 -0
- package/dist/backends/conversation-config.d.ts.map +1 -0
- package/dist/backends/index.d.ts +14 -0
- package/dist/backends/index.d.ts.map +1 -0
- package/dist/backends/opencode-run.d.ts +48 -0
- package/dist/backends/opencode-run.d.ts.map +1 -0
- package/dist/backends/opencode-sse.d.ts +35 -0
- package/dist/backends/opencode-sse.d.ts.map +1 -0
- package/dist/backends/pi-rpc.d.ts +21 -0
- package/dist/backends/pi-rpc.d.ts.map +1 -0
- package/dist/backends/pi-run.d.ts +21 -0
- package/dist/backends/pi-run.d.ts.map +1 -0
- package/dist/backends/select.d.ts +17 -0
- package/dist/backends/select.d.ts.map +1 -0
- package/dist/backends/subprocess-run.d.ts +68 -0
- package/dist/backends/subprocess-run.d.ts.map +1 -0
- package/dist/backends/types.d.ts +17 -0
- package/dist/backends/types.d.ts.map +1 -0
- package/dist/backends/unsupported.d.ts +9 -0
- package/dist/backends/unsupported.d.ts.map +1 -0
- package/dist/baseline/index.d.ts +56 -0
- package/dist/baseline/index.d.ts.map +1 -0
- package/dist/cli/args.d.ts +22 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/embedded.d.ts +7 -0
- package/dist/cli/embedded.d.ts.map +1 -0
- package/dist/cli/main.d.ts +6 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/version.d.ts +2 -0
- package/dist/cli/version.d.ts.map +1 -0
- package/dist/conversation/ask-user.d.ts +17 -0
- package/dist/conversation/ask-user.d.ts.map +1 -0
- package/dist/conversation/conversation.d.ts +46 -0
- package/dist/conversation/conversation.d.ts.map +1 -0
- package/dist/conversation/harness.d.ts +14 -0
- package/dist/conversation/harness.d.ts.map +1 -0
- package/dist/conversation/index.d.ts +5 -0
- package/dist/conversation/index.d.ts.map +1 -0
- package/dist/conversation/queue.d.ts +15 -0
- package/dist/conversation/queue.d.ts.map +1 -0
- package/dist/flow/accessors.d.ts +13 -0
- package/dist/flow/accessors.d.ts.map +1 -0
- package/dist/flow/approvals.d.ts +6 -0
- package/dist/flow/approvals.d.ts.map +1 -0
- package/dist/flow/args.d.ts +4 -0
- package/dist/flow/args.d.ts.map +1 -0
- package/dist/flow/context.d.ts +36 -0
- package/dist/flow/context.d.ts.map +1 -0
- package/dist/flow/index.d.ts +5 -0
- package/dist/flow/index.d.ts.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/loop/builder/index.d.ts +17 -0
- package/dist/loop/builder/index.d.ts.map +1 -0
- package/dist/loop/builder/types.d.ts +97 -0
- package/dist/loop/builder/types.d.ts.map +1 -0
- package/dist/loop/context/compaction.d.ts +38 -0
- package/dist/loop/context/compaction.d.ts.map +1 -0
- package/dist/loop/context/index.d.ts +4 -0
- package/dist/loop/context/index.d.ts.map +1 -0
- package/dist/loop/context/offload.d.ts +34 -0
- package/dist/loop/context/offload.d.ts.map +1 -0
- package/dist/loop/context/types.d.ts +13 -0
- package/dist/loop/context/types.d.ts.map +1 -0
- package/dist/loop/engine/bridge.d.ts +21 -0
- package/dist/loop/engine/bridge.d.ts.map +1 -0
- package/dist/loop/engine/index.d.ts +73 -0
- package/dist/loop/engine/index.d.ts.map +1 -0
- package/dist/loop/execution.d.ts +68 -0
- package/dist/loop/execution.d.ts.map +1 -0
- package/dist/loop/fanout.d.ts +148 -0
- package/dist/loop/fanout.d.ts.map +1 -0
- package/dist/loop/firing.d.ts +54 -0
- package/dist/loop/firing.d.ts.map +1 -0
- package/dist/loop/graph/analyze.d.ts +8 -0
- package/dist/loop/graph/analyze.d.ts.map +1 -0
- package/dist/loop/graph/index.d.ts +3 -0
- package/dist/loop/graph/index.d.ts.map +1 -0
- package/dist/loop/graph/types.d.ts +35 -0
- package/dist/loop/graph/types.d.ts.map +1 -0
- package/dist/loop/index.d.ts +7 -0
- package/dist/loop/index.d.ts.map +1 -0
- package/dist/loop/io/index.d.ts +4 -0
- package/dist/loop/io/index.d.ts.map +1 -0
- package/dist/loop/io/linear.d.ts +142 -0
- package/dist/loop/io/linear.d.ts.map +1 -0
- package/dist/loop/io/sink.d.ts +47 -0
- package/dist/loop/io/sink.d.ts.map +1 -0
- package/dist/loop/io/source.d.ts +64 -0
- package/dist/loop/io/source.d.ts.map +1 -0
- package/dist/loop/serve.d.ts +97 -0
- package/dist/loop/serve.d.ts.map +1 -0
- package/dist/loop/state/index.d.ts +5 -0
- package/dist/loop/state/index.d.ts.map +1 -0
- package/dist/loop/state/manifest.d.ts +36 -0
- package/dist/loop/state/manifest.d.ts.map +1 -0
- package/dist/loop/state/port.d.ts +33 -0
- package/dist/loop/state/port.d.ts.map +1 -0
- package/dist/loop/state/snapshot.d.ts +15 -0
- package/dist/loop/state/snapshot.d.ts.map +1 -0
- package/dist/loop/state/sqlite.d.ts +31 -0
- package/dist/loop/state/sqlite.d.ts.map +1 -0
- package/dist/loop/termination-contract.d.ts +28 -0
- package/dist/loop/termination-contract.d.ts.map +1 -0
- package/dist/loop/termination.d.ts +33 -0
- package/dist/loop/termination.d.ts.map +1 -0
- package/dist/model/backend-config.d.ts +30 -0
- package/dist/model/backend-config.d.ts.map +1 -0
- package/dist/model/brand.d.ts +9 -0
- package/dist/model/brand.d.ts.map +1 -0
- package/dist/model/errors.d.ts +11 -0
- package/dist/model/errors.d.ts.map +1 -0
- package/dist/model/index.d.ts +8 -0
- package/dist/model/index.d.ts.map +1 -0
- package/dist/model/json-schema.d.ts +4 -0
- package/dist/model/json-schema.d.ts.map +1 -0
- package/dist/model/result.d.ts +3 -0
- package/dist/model/result.d.ts.map +1 -0
- package/dist/model/schemas.d.ts +435 -0
- package/dist/model/schemas.d.ts.map +1 -0
- package/dist/model/structured.d.ts +9 -0
- package/dist/model/structured.d.ts.map +1 -0
- package/dist/monitor/index.d.ts +139 -0
- package/dist/monitor/index.d.ts.map +1 -0
- package/dist/plan/index.d.ts +3 -0
- package/dist/plan/index.d.ts.map +1 -0
- package/dist/plan/persistent.d.ts +23 -0
- package/dist/plan/persistent.d.ts.map +1 -0
- package/dist/plan/verdict.d.ts +9 -0
- package/dist/plan/verdict.d.ts.map +1 -0
- package/dist/review/index.d.ts +4 -0
- package/dist/review/index.d.ts.map +1 -0
- package/dist/review/loop.d.ts +117 -0
- package/dist/review/loop.d.ts.map +1 -0
- package/dist/review/reviewers.d.ts +13 -0
- package/dist/review/reviewers.d.ts.map +1 -0
- package/dist/review/tool.d.ts +20 -0
- package/dist/review/tool.d.ts.map +1 -0
- package/dist/run-output/index.d.ts +112 -0
- package/dist/run-output/index.d.ts.map +1 -0
- package/dist/runner/index.d.ts +2 -0
- package/dist/runner/index.d.ts.map +1 -0
- package/dist/runner/typecheck.d.ts +23 -0
- package/dist/runner/typecheck.d.ts.map +1 -0
- package/dist/test-utils/fakes.d.ts +76 -0
- package/dist/test-utils/fakes.d.ts.map +1 -0
- package/dist/test-utils/fixtures.d.ts +4 -0
- package/dist/test-utils/fixtures.d.ts.map +1 -0
- package/dist/test-utils/index.d.ts +4 -0
- package/dist/test-utils/index.d.ts.map +1 -0
- package/dist/test-utils/tier2.d.ts +8 -0
- package/dist/test-utils/tier2.d.ts.map +1 -0
- package/dist/tools/fs.d.ts +11 -0
- package/dist/tools/fs.d.ts.map +1 -0
- package/dist/tools/git.d.ts +10 -0
- package/dist/tools/git.d.ts.map +1 -0
- package/dist/tools/github.d.ts +13 -0
- package/dist/tools/github.d.ts.map +1 -0
- package/dist/tools/index.d.ts +7 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/linear.d.ts +117 -0
- package/dist/tools/linear.d.ts.map +1 -0
- package/dist/tools/process.d.ts +40 -0
- package/dist/tools/process.d.ts.map +1 -0
- package/dist/tools/terminal.d.ts +23 -0
- package/dist/tools/terminal.d.ts.map +1 -0
- package/package.json +89 -9
- package/src/backends/acp-client.ts +324 -0
- package/src/backends/acp-run.ts +636 -0
- package/src/backends/claude-run.ts +226 -0
- package/src/backends/claude-stream-json.ts +273 -0
- package/src/backends/codex-jsonl.ts +339 -0
- package/src/backends/codex-run.ts +177 -0
- package/src/backends/codex.ts +84 -0
- package/src/backends/conversation-config.ts +26 -0
- package/src/backends/index.ts +13 -0
- package/src/backends/opencode-run.ts +432 -0
- package/src/backends/opencode-sse.ts +360 -0
- package/src/backends/pi-rpc.ts +242 -0
- package/src/backends/pi-run.ts +154 -0
- package/src/backends/select.ts +77 -0
- package/src/backends/subprocess-run.ts +305 -0
- package/src/backends/types.ts +29 -0
- package/src/backends/unsupported.ts +48 -0
- package/src/baseline/index.ts +437 -0
- package/src/cli/args.ts +109 -0
- package/src/cli/embedded.ts +206 -0
- package/src/cli/main.ts +332 -0
- package/src/cli/version.ts +1 -0
- package/src/conversation/ask-user.ts +105 -0
- package/src/conversation/conversation.ts +109 -0
- package/src/conversation/harness.ts +39 -0
- package/src/conversation/index.ts +4 -0
- package/src/conversation/queue.ts +86 -0
- package/src/flow/accessors.ts +43 -0
- package/src/flow/approvals.ts +10 -0
- package/src/flow/args.ts +26 -0
- package/src/flow/context.ts +106 -0
- package/src/flow/index.ts +4 -0
- package/src/index.ts +17 -0
- package/src/loop/builder/index.ts +346 -0
- package/src/loop/builder/types.ts +131 -0
- package/src/loop/context/compaction.ts +175 -0
- package/src/loop/context/index.ts +3 -0
- package/src/loop/context/offload.ts +79 -0
- package/src/loop/context/types.ts +17 -0
- package/src/loop/engine/bridge.ts +61 -0
- package/src/loop/engine/index.ts +166 -0
- package/src/loop/execution.ts +453 -0
- package/src/loop/fanout.ts +444 -0
- package/src/loop/firing.ts +188 -0
- package/src/loop/graph/analyze.ts +128 -0
- package/src/loop/graph/index.ts +2 -0
- package/src/loop/graph/types.ts +45 -0
- package/src/loop/index.ts +11 -0
- package/src/loop/io/index.ts +3 -0
- package/src/loop/io/linear.ts +714 -0
- package/src/loop/io/sink.ts +170 -0
- package/src/loop/io/source.ts +255 -0
- package/src/loop/serve.ts +307 -0
- package/src/loop/state/index.ts +4 -0
- package/src/loop/state/manifest.ts +56 -0
- package/src/loop/state/port.ts +43 -0
- package/src/loop/state/snapshot.ts +129 -0
- package/src/loop/state/sqlite.ts +265 -0
- package/src/loop/termination-contract.ts +89 -0
- package/src/loop/termination.ts +156 -0
- package/src/model/backend-config.ts +34 -0
- package/src/model/brand.ts +11 -0
- package/src/model/errors.ts +28 -0
- package/src/model/index.ts +7 -0
- package/src/model/json-schema.ts +14 -0
- package/src/model/result.ts +28 -0
- package/src/model/schemas.ts +218 -0
- package/src/model/structured.ts +26 -0
- package/src/monitor/index.ts +367 -0
- package/src/plan/index.ts +2 -0
- package/src/plan/persistent.ts +98 -0
- package/src/plan/verdict.ts +3 -0
- package/src/review/index.ts +3 -0
- package/src/review/loop.ts +365 -0
- package/src/review/reviewers.ts +92 -0
- package/src/review/tool.ts +41 -0
- package/src/run-output/index.ts +319 -0
- package/src/runner/index.ts +1 -0
- package/src/runner/typecheck.ts +72 -0
- package/src/test-utils/fakes.ts +260 -0
- package/src/test-utils/fixtures.ts +33 -0
- package/src/test-utils/index.ts +3 -0
- package/src/test-utils/tier2.ts +12 -0
- package/src/tools/fs.ts +44 -0
- package/src/tools/git.ts +34 -0
- package/src/tools/github.ts +25 -0
- package/src/tools/index.ts +6 -0
- package/src/tools/linear.ts +428 -0
- package/src/tools/process.ts +156 -0
- package/src/tools/terminal.ts +116 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linear.d.ts","sourceRoot":"","sources":["../../src/tools/linear.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { type Result } from "neverthrow";
|
|
2
|
+
import { type RuntimeError } from "../model/index.ts";
|
|
3
|
+
export interface QuietProcResult {
|
|
4
|
+
readonly stdout: string;
|
|
5
|
+
readonly stderr: string;
|
|
6
|
+
readonly exitCode: number | null;
|
|
7
|
+
readonly durationMs: number;
|
|
8
|
+
}
|
|
9
|
+
export interface QuietProcOptions {
|
|
10
|
+
readonly cwd?: string;
|
|
11
|
+
readonly signal?: AbortSignal;
|
|
12
|
+
readonly timeoutMs?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface VerificationCommand {
|
|
15
|
+
readonly command: string;
|
|
16
|
+
readonly args?: readonly string[];
|
|
17
|
+
readonly cwd?: string;
|
|
18
|
+
readonly timeoutMs?: number;
|
|
19
|
+
}
|
|
20
|
+
export type VerificationCommandResult = {
|
|
21
|
+
readonly type: "success";
|
|
22
|
+
readonly command: string;
|
|
23
|
+
readonly stdout: string;
|
|
24
|
+
readonly stderr: string;
|
|
25
|
+
readonly exitCode: 0;
|
|
26
|
+
readonly durationMs: number;
|
|
27
|
+
} | {
|
|
28
|
+
readonly type: "failed";
|
|
29
|
+
readonly command: string;
|
|
30
|
+
readonly stdout: string;
|
|
31
|
+
readonly stderr: string;
|
|
32
|
+
readonly exitCode: number | null;
|
|
33
|
+
readonly durationMs: number;
|
|
34
|
+
};
|
|
35
|
+
export interface CommandTool {
|
|
36
|
+
run(command: VerificationCommand): Promise<VerificationCommandResult>;
|
|
37
|
+
}
|
|
38
|
+
export declare function runQuiet(command: string, args?: readonly string[], options?: QuietProcOptions): Promise<Result<QuietProcResult, RuntimeError>>;
|
|
39
|
+
export declare function createCommandTool(defaultCwd?: string): CommandTool;
|
|
40
|
+
//# sourceMappingURL=process.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../src/tools/process.ts"],"names":[],"mappings":"AACA,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAErE,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,yBAAyB,GACjC;IACE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IACrB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEN,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC;CACvE;AAED,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,SAAS,MAAM,EAAO,EAC5B,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC,CA0DhD;AAED,wBAAgB,iBAAiB,CAAC,UAAU,SAAgB,GAAG,WAAW,CA6CzE"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { OrcaEvent } from "../model/index.ts";
|
|
2
|
+
import type { RunReporter } from "../run-output/index.ts";
|
|
3
|
+
export interface TerminalTool {
|
|
4
|
+
emit(event: OrcaEvent): void;
|
|
5
|
+
lines(): readonly string[];
|
|
6
|
+
status(status: StatusBarState, options?: StatusBarOptions): string;
|
|
7
|
+
}
|
|
8
|
+
export interface StatusBarState {
|
|
9
|
+
readonly label: string;
|
|
10
|
+
readonly current: number;
|
|
11
|
+
readonly total: number;
|
|
12
|
+
}
|
|
13
|
+
export interface StatusBarOptions {
|
|
14
|
+
readonly env?: NodeJS.ProcessEnv;
|
|
15
|
+
readonly isTTY?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface TerminalToolOptions {
|
|
18
|
+
readonly reporter?: RunReporter;
|
|
19
|
+
}
|
|
20
|
+
export declare function createTerminalTool(options?: TerminalToolOptions): TerminalTool;
|
|
21
|
+
export declare function renderOrcaEvent(event: OrcaEvent): string;
|
|
22
|
+
export declare function renderStatusBar(status: StatusBarState, options?: StatusBarOptions): string;
|
|
23
|
+
//# sourceMappingURL=terminal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/tools/terminal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IAC7B,KAAK,IAAI,SAAS,MAAM,EAAE,CAAC;IAC3B,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAAC;CACpE;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC;CACjC;AAED,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,mBAAwB,GAAG,YAAY,CAwBlF;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAiBxD;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,cAAc,EACtB,OAAO,GAAE,gBAAqB,GAC7B,MAAM,CAUR"}
|
package/package.json
CHANGED
|
@@ -1,14 +1,94 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@twelvehart/orcats",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
5
|
-
"
|
|
3
|
+
"version": "0.2.3",
|
|
4
|
+
"description": "TypeScript-native reimagining of Orca: deterministic coding-agent flows with author-time type feedback.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "Apache-2.0",
|
|
7
|
+
"author": "Ahmad Ragab",
|
|
8
|
+
"homepage": "https://github.com/ASRagab/orca-ts#readme",
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/ASRagab/orca-ts.git"
|
|
12
|
+
},
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/ASRagab/orca-ts/issues"
|
|
15
|
+
},
|
|
16
|
+
"bin": {
|
|
17
|
+
"orcats": "bin/orcats"
|
|
18
|
+
},
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
20
|
+
"files": [
|
|
21
|
+
"bin/orcats",
|
|
22
|
+
"dist/**/*.d.ts",
|
|
23
|
+
"dist/**/*.d.ts.map",
|
|
24
|
+
"src/**/*.ts",
|
|
25
|
+
"README.md",
|
|
26
|
+
"LICENSE",
|
|
27
|
+
"NOTICE"
|
|
28
|
+
],
|
|
29
|
+
"publishConfig": {
|
|
30
|
+
"access": "public",
|
|
31
|
+
"registry": "https://registry.npmjs.org/"
|
|
32
|
+
},
|
|
33
|
+
"exports": {
|
|
34
|
+
".": {
|
|
35
|
+
"types": "./dist/index.d.ts",
|
|
36
|
+
"default": "./src/index.ts"
|
|
37
|
+
},
|
|
38
|
+
"./loop": {
|
|
39
|
+
"types": "./dist/loop/index.d.ts",
|
|
40
|
+
"default": "./src/loop/index.ts"
|
|
41
|
+
},
|
|
42
|
+
"./model": {
|
|
43
|
+
"types": "./dist/model/index.d.ts",
|
|
44
|
+
"default": "./src/model/index.ts"
|
|
45
|
+
},
|
|
46
|
+
"./testing": {
|
|
47
|
+
"types": "./dist/test-utils/index.d.ts",
|
|
48
|
+
"default": "./src/test-utils/index.ts"
|
|
49
|
+
},
|
|
50
|
+
"./package.json": {
|
|
51
|
+
"default": "./package.json"
|
|
52
|
+
}
|
|
53
|
+
},
|
|
6
54
|
"scripts": {
|
|
7
|
-
"
|
|
55
|
+
"build": "bun build src/cli/main.ts --target bun --outfile dist/orcats",
|
|
56
|
+
"build:binary": "bun build src/cli/main.ts --compile --outfile dist/orcats",
|
|
57
|
+
"build:types": "tsc -p tsconfig.build.json",
|
|
58
|
+
"build:release": "bun run scripts/build-release-binaries.ts",
|
|
59
|
+
"lint": "bun run docs:site:prepare && eslint .",
|
|
60
|
+
"test": "bun test",
|
|
61
|
+
"typecheck": "tsc --noEmit",
|
|
62
|
+
"docs:site:dev": "cd website && bun run dev",
|
|
63
|
+
"docs:site:prepare": "cd website && bun install --frozen-lockfile && bunx astro sync",
|
|
64
|
+
"docs:site:build": "cd website && bun install --frozen-lockfile && bun run build",
|
|
65
|
+
"docs:site:preview": "cd website && bun run preview",
|
|
66
|
+
"docs:check": "bun run scripts/check-doc-links.ts",
|
|
67
|
+
"docs:symbols": "bun run scripts/check-doc-symbols.ts",
|
|
68
|
+
"docs:signatures": "bun run scripts/check-doc-signatures.ts",
|
|
69
|
+
"check:facade-gate": "bun run scripts/check-facade-gate.ts",
|
|
70
|
+
"test:integration:real": "ORCA_REAL_BACKEND_SMOKE=1 bun test tests/integration/real-backend-smoke.test.ts",
|
|
71
|
+
"validate:fixtures": "bun run scripts/validate-fixtures.ts && bun run scripts/validate-adr-matrix.ts",
|
|
72
|
+
"validate:release": "bun run scripts/validate-release.ts",
|
|
73
|
+
"validate:package": "bun run build:types && bun run scripts/validate-package-artifact.ts",
|
|
74
|
+
"smoke:package": "bun run scripts/smoke-package.ts",
|
|
75
|
+
"smoke:binary": "bun run scripts/smoke-binary.ts",
|
|
76
|
+
"verify": "bun run lint && bun run typecheck && bun test && bun run docs:site:build && bun run docs:check && bun run docs:symbols && bun run validate:fixtures && bun run validate:release && bun run build:types && bun run docs:signatures && bun run check:facade-gate && bun run smoke:binary"
|
|
77
|
+
},
|
|
78
|
+
"dependencies": {
|
|
79
|
+
"effect": "^3.21.2",
|
|
80
|
+
"neverthrow": "^8.2.0",
|
|
81
|
+
"zod": "^4.1.13"
|
|
82
|
+
},
|
|
83
|
+
"devDependencies": {
|
|
84
|
+
"@eslint/js": "^9.39.1",
|
|
85
|
+
"@types/bun": "^1.3.3",
|
|
86
|
+
"eslint": "^9.39.1",
|
|
87
|
+
"eslint-plugin-boundaries": "^6.0.2",
|
|
88
|
+
"typescript": "^5.9.3",
|
|
89
|
+
"typescript-eslint": "^8.46.4"
|
|
8
90
|
},
|
|
9
|
-
"
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
"type": "commonjs",
|
|
13
|
-
"private": false
|
|
91
|
+
"engines": {
|
|
92
|
+
"bun": ">=1.3.0"
|
|
93
|
+
}
|
|
14
94
|
}
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { BoundedAsyncQueue } from "../conversation/index.ts";
|
|
3
|
+
import { collectText, splitLines } from "./subprocess-run.ts";
|
|
4
|
+
|
|
5
|
+
export type AcpId = number | string;
|
|
6
|
+
|
|
7
|
+
export interface AcpErrorPayload {
|
|
8
|
+
readonly code: number;
|
|
9
|
+
readonly message: string;
|
|
10
|
+
readonly data?: unknown;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface AcpRequestMessage {
|
|
14
|
+
readonly jsonrpc: "2.0";
|
|
15
|
+
readonly id: AcpId;
|
|
16
|
+
readonly method: string;
|
|
17
|
+
readonly params?: unknown;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface AcpNotificationMessage {
|
|
21
|
+
readonly jsonrpc: "2.0";
|
|
22
|
+
readonly method: string;
|
|
23
|
+
readonly params?: unknown;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface AcpResponseMessage {
|
|
27
|
+
readonly jsonrpc: "2.0";
|
|
28
|
+
readonly id: AcpId;
|
|
29
|
+
readonly result?: unknown;
|
|
30
|
+
readonly error?: AcpErrorPayload;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export type AcpIncomingMessage = AcpRequestMessage | AcpNotificationMessage;
|
|
34
|
+
|
|
35
|
+
export interface AcpProcess {
|
|
36
|
+
readonly stdout: AsyncIterable<string | Uint8Array>;
|
|
37
|
+
readonly stderr?: AsyncIterable<string | Uint8Array>;
|
|
38
|
+
readonly exit: Promise<number | null>;
|
|
39
|
+
write(data: string): void;
|
|
40
|
+
endStdin(): void;
|
|
41
|
+
kill(signal?: NodeJS.Signals): void;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export interface AcpSpawnOptions {
|
|
45
|
+
readonly cwd?: string;
|
|
46
|
+
readonly env?: NodeJS.ProcessEnv;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export type AcpProcessSpawner = (
|
|
50
|
+
command: string,
|
|
51
|
+
args: readonly string[],
|
|
52
|
+
options: AcpSpawnOptions
|
|
53
|
+
) => AcpProcess;
|
|
54
|
+
|
|
55
|
+
export type AcpRequestHandler = (message: AcpRequestMessage) => unknown;
|
|
56
|
+
|
|
57
|
+
interface Deferred<T> {
|
|
58
|
+
readonly promise: Promise<T>;
|
|
59
|
+
resolve(value: T | PromiseLike<T>): void;
|
|
60
|
+
reject(reason?: unknown): void;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export interface AcpClientOptions {
|
|
64
|
+
readonly command: string;
|
|
65
|
+
readonly args?: readonly string[];
|
|
66
|
+
readonly cwd?: string;
|
|
67
|
+
readonly env?: NodeJS.ProcessEnv;
|
|
68
|
+
readonly capacity?: number;
|
|
69
|
+
readonly requestTimeoutMs?: number;
|
|
70
|
+
readonly spawnProcess?: AcpProcessSpawner;
|
|
71
|
+
readonly handleRequest?: AcpRequestHandler;
|
|
72
|
+
readonly onIncomingMessage?: () => void;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export class AcpClient {
|
|
76
|
+
readonly process: AcpProcess;
|
|
77
|
+
private readonly queue: BoundedAsyncQueue<AcpIncomingMessage>;
|
|
78
|
+
private readonly pending = new Map<
|
|
79
|
+
AcpId,
|
|
80
|
+
{
|
|
81
|
+
readonly resolve: (value: unknown) => void;
|
|
82
|
+
readonly reject: (reason: unknown) => void;
|
|
83
|
+
readonly timer: ReturnType<typeof setTimeout>;
|
|
84
|
+
}
|
|
85
|
+
>();
|
|
86
|
+
private readonly closedState: Deferred<void> = Promise.withResolvers();
|
|
87
|
+
private nextId = 0;
|
|
88
|
+
private closed = false;
|
|
89
|
+
|
|
90
|
+
readonly stderr: Promise<string>;
|
|
91
|
+
readonly done: Promise<void>;
|
|
92
|
+
|
|
93
|
+
constructor(private readonly options: AcpClientOptions) {
|
|
94
|
+
const spawnProcess = options.spawnProcess ?? spawnAcpProcess;
|
|
95
|
+
this.process = spawnProcess(options.command, options.args ?? [], {
|
|
96
|
+
...(options.cwd === undefined ? {} : { cwd: options.cwd }),
|
|
97
|
+
...(options.env === undefined ? {} : { env: options.env })
|
|
98
|
+
});
|
|
99
|
+
this.queue = new BoundedAsyncQueue(options.capacity ?? 256);
|
|
100
|
+
this.stderr = collectText(this.process.stderr);
|
|
101
|
+
this.done = this.closedState.promise;
|
|
102
|
+
queueMicrotask(() => {
|
|
103
|
+
void this.readLoop();
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
messages(): AsyncIterable<AcpIncomingMessage> {
|
|
108
|
+
return this.queue;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
async request<T = unknown>(method: string, params: unknown = {}): Promise<T> {
|
|
112
|
+
if (this.closed) {
|
|
113
|
+
throw new Error("ACP client is closed");
|
|
114
|
+
}
|
|
115
|
+
const id = this.nextId;
|
|
116
|
+
this.nextId += 1;
|
|
117
|
+
const message: AcpRequestMessage = { jsonrpc: "2.0", id, method, params };
|
|
118
|
+
const timeoutMs = this.options.requestTimeoutMs ?? 30_000;
|
|
119
|
+
const response = new Promise<T>((resolve, reject) => {
|
|
120
|
+
const timer = setTimeout(() => {
|
|
121
|
+
this.pending.delete(id);
|
|
122
|
+
reject(new Error(`ACP request ${method} timed out after ${String(timeoutMs)}ms`));
|
|
123
|
+
}, timeoutMs);
|
|
124
|
+
this.pending.set(id, {
|
|
125
|
+
resolve: (value) => {
|
|
126
|
+
resolve(value as T);
|
|
127
|
+
},
|
|
128
|
+
reject,
|
|
129
|
+
timer
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
this.write(message);
|
|
133
|
+
return await response;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
notify(method: string, params: unknown = {}): void {
|
|
137
|
+
if (this.closed) {
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
this.write({ jsonrpc: "2.0", method, params });
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
close(signal: NodeJS.Signals = "SIGTERM", force = false): void {
|
|
144
|
+
if (this.closed) {
|
|
145
|
+
if (force) {
|
|
146
|
+
this.process.kill(signal);
|
|
147
|
+
}
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
this.closed = true;
|
|
151
|
+
this.process.endStdin();
|
|
152
|
+
this.process.kill(signal);
|
|
153
|
+
for (const entry of this.pending.values()) {
|
|
154
|
+
clearTimeout(entry.timer);
|
|
155
|
+
entry.reject(new Error("ACP client closed"));
|
|
156
|
+
}
|
|
157
|
+
this.pending.clear();
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
private async readLoop(): Promise<void> {
|
|
161
|
+
try {
|
|
162
|
+
for await (const line of splitLines(this.process.stdout)) {
|
|
163
|
+
if (line.trim().length === 0) {
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
await this.route(parseAcpMessage(line));
|
|
167
|
+
}
|
|
168
|
+
const exitCode = await this.process.exit;
|
|
169
|
+
if (!this.closed && exitCode !== 0) {
|
|
170
|
+
throw new Error(`ACP process exited with code ${String(exitCode ?? "unknown")}`);
|
|
171
|
+
}
|
|
172
|
+
this.finish();
|
|
173
|
+
} catch (error) {
|
|
174
|
+
this.fail(error);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
private async route(message: AcpResponseMessage | AcpIncomingMessage): Promise<void> {
|
|
179
|
+
this.options.onIncomingMessage?.();
|
|
180
|
+
if (isResponse(message)) {
|
|
181
|
+
const entry = this.pending.get(message.id);
|
|
182
|
+
if (!entry) {
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
clearTimeout(entry.timer);
|
|
186
|
+
this.pending.delete(message.id);
|
|
187
|
+
if (message.error) {
|
|
188
|
+
entry.reject(new Error(`${message.error.message} (${String(message.error.code)})`));
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
entry.resolve(message.result);
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
if (isRequest(message)) {
|
|
196
|
+
await this.respondToRequest(message);
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
await this.queue.push(message);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
private async respondToRequest(message: AcpRequestMessage): Promise<void> {
|
|
204
|
+
try {
|
|
205
|
+
const result = await this.options.handleRequest?.(message);
|
|
206
|
+
this.write({ jsonrpc: "2.0", id: message.id, result: result ?? {} });
|
|
207
|
+
} catch (error) {
|
|
208
|
+
this.write({
|
|
209
|
+
jsonrpc: "2.0",
|
|
210
|
+
id: message.id,
|
|
211
|
+
error: { code: -32000, message: errorMessage(error) }
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
private finish(): void {
|
|
217
|
+
if (this.closed) {
|
|
218
|
+
this.queue.close();
|
|
219
|
+
this.closedState.resolve();
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
this.closed = true;
|
|
223
|
+
this.queue.close();
|
|
224
|
+
for (const entry of this.pending.values()) {
|
|
225
|
+
clearTimeout(entry.timer);
|
|
226
|
+
entry.reject(new Error("ACP process exited"));
|
|
227
|
+
}
|
|
228
|
+
this.pending.clear();
|
|
229
|
+
this.closedState.resolve();
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
private fail(error: unknown): void {
|
|
233
|
+
if (this.closed) {
|
|
234
|
+
this.queue.close();
|
|
235
|
+
this.closedState.reject(error);
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
this.closed = true;
|
|
239
|
+
this.queue.close();
|
|
240
|
+
for (const entry of this.pending.values()) {
|
|
241
|
+
clearTimeout(entry.timer);
|
|
242
|
+
entry.reject(error);
|
|
243
|
+
}
|
|
244
|
+
this.pending.clear();
|
|
245
|
+
this.closedState.reject(error);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
private write(message: AcpRequestMessage | AcpNotificationMessage | AcpResponseMessage): void {
|
|
249
|
+
this.process.write(`${JSON.stringify(message)}\n`);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
export function createAcpClient(options: AcpClientOptions): AcpClient {
|
|
254
|
+
return new AcpClient(options);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
export function spawnAcpProcess(
|
|
258
|
+
command: string,
|
|
259
|
+
args: readonly string[],
|
|
260
|
+
options: AcpSpawnOptions
|
|
261
|
+
): AcpProcess {
|
|
262
|
+
const child = spawn(command, [...args], {
|
|
263
|
+
cwd: options.cwd,
|
|
264
|
+
env: options.env,
|
|
265
|
+
stdio: ["pipe", "pipe", "pipe"]
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
const exit = Promise.withResolvers<number | null>();
|
|
269
|
+
child.on("error", exit.reject);
|
|
270
|
+
child.on("close", exit.resolve);
|
|
271
|
+
|
|
272
|
+
return {
|
|
273
|
+
stdout: child.stdout,
|
|
274
|
+
stderr: child.stderr,
|
|
275
|
+
exit: exit.promise,
|
|
276
|
+
write(data: string) {
|
|
277
|
+
child.stdin.write(data);
|
|
278
|
+
},
|
|
279
|
+
endStdin() {
|
|
280
|
+
child.stdin.end();
|
|
281
|
+
},
|
|
282
|
+
kill(signal?: NodeJS.Signals) {
|
|
283
|
+
child.kill(signal);
|
|
284
|
+
}
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
function parseAcpMessage(line: string): AcpResponseMessage | AcpIncomingMessage {
|
|
289
|
+
let value: unknown;
|
|
290
|
+
try {
|
|
291
|
+
value = JSON.parse(line) as unknown;
|
|
292
|
+
} catch (error) {
|
|
293
|
+
throw new Error(`invalid ACP JSON-RPC message: ${errorMessage(error)}`);
|
|
294
|
+
}
|
|
295
|
+
if (!isObject(value) || value.jsonrpc !== "2.0") {
|
|
296
|
+
throw new Error("invalid ACP JSON-RPC message");
|
|
297
|
+
}
|
|
298
|
+
if ("method" in value && typeof value.method === "string") {
|
|
299
|
+
if ("id" in value) {
|
|
300
|
+
return value as unknown as AcpRequestMessage;
|
|
301
|
+
}
|
|
302
|
+
return value as unknown as AcpNotificationMessage;
|
|
303
|
+
}
|
|
304
|
+
if ("id" in value && ("result" in value || "error" in value)) {
|
|
305
|
+
return value as unknown as AcpResponseMessage;
|
|
306
|
+
}
|
|
307
|
+
throw new Error("invalid ACP JSON-RPC message");
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
function isResponse(message: AcpResponseMessage | AcpIncomingMessage): message is AcpResponseMessage {
|
|
311
|
+
return "id" in message && ("result" in message || "error" in message) && !("method" in message);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
function isRequest(message: AcpResponseMessage | AcpIncomingMessage): message is AcpRequestMessage {
|
|
315
|
+
return "id" in message && "method" in message;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
function isObject(value: unknown): value is Record<string, unknown> {
|
|
319
|
+
return typeof value === "object" && value !== null;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
function errorMessage(error: unknown): string {
|
|
323
|
+
return error instanceof Error ? error.message : String(error);
|
|
324
|
+
}
|