@twelvehart/orcats 0.0.0-seed.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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 +54 -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 +88 -9
- package/src/backends/acp-client.ts +322 -0
- package/src/backends/acp-run.ts +636 -0
- package/src/backends/claude-run.ts +229 -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 +435 -0
- package/src/cli/args.ts +109 -0
- package/src/cli/embedded.ts +187 -0
- package/src/cli/main.ts +330 -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 +365 -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,68 @@
|
|
|
1
|
+
import { type Result } from "neverthrow";
|
|
2
|
+
import type { BranchObservation } from "../monitor/index.ts";
|
|
3
|
+
import type { RuntimeError, Usage } from "../model/index.ts";
|
|
4
|
+
import { type CompactionConfig, type CompactionStage, type Observation, type OffloadStore } from "./context/index.ts";
|
|
5
|
+
import { type FingerprintAction, type FingerprintDetectorOptions, type TokenUsageSummary } from "./termination.ts";
|
|
6
|
+
export type LoopExecutionStop = "converged" | "unfixable" | "stuck" | "timeout" | "ceiling" | "budget-exhausted" | "cancelled";
|
|
7
|
+
export type LoopExecutionAction = FingerprintAction;
|
|
8
|
+
export interface LoopContextPressure {
|
|
9
|
+
readonly offloadCount: number;
|
|
10
|
+
readonly compactionStages: readonly CompactionStage[];
|
|
11
|
+
readonly tokensBefore: number;
|
|
12
|
+
readonly tokensAfter: number;
|
|
13
|
+
readonly observationCount: number;
|
|
14
|
+
}
|
|
15
|
+
export interface LoopExecutionStepResult {
|
|
16
|
+
readonly usage?: Usage;
|
|
17
|
+
readonly observations?: readonly Observation[];
|
|
18
|
+
readonly branches?: readonly BranchObservation[];
|
|
19
|
+
readonly measure?: number;
|
|
20
|
+
readonly stopReason?: LoopExecutionStop;
|
|
21
|
+
readonly contextPressure?: LoopContextPressure;
|
|
22
|
+
}
|
|
23
|
+
export interface LoopExecutionProgress {
|
|
24
|
+
readonly iteration: number;
|
|
25
|
+
readonly usage?: Usage;
|
|
26
|
+
readonly branches?: readonly BranchObservation[];
|
|
27
|
+
readonly measure?: number;
|
|
28
|
+
readonly stopReason?: LoopExecutionStop;
|
|
29
|
+
readonly contextPressure?: LoopContextPressure;
|
|
30
|
+
}
|
|
31
|
+
export interface LoopExecutionContextOptions {
|
|
32
|
+
readonly root?: string;
|
|
33
|
+
readonly config?: CompactionConfig;
|
|
34
|
+
readonly offloadStore?: OffloadStore;
|
|
35
|
+
readonly observations?: readonly Observation[];
|
|
36
|
+
}
|
|
37
|
+
export interface LoopExecutionContextSnapshot {
|
|
38
|
+
readonly observations: readonly Observation[];
|
|
39
|
+
readonly lastPressure?: LoopContextPressure;
|
|
40
|
+
}
|
|
41
|
+
export interface LoopExecutionSummary<State> {
|
|
42
|
+
readonly iterations: number;
|
|
43
|
+
readonly converged: boolean;
|
|
44
|
+
readonly stop: LoopExecutionStop;
|
|
45
|
+
readonly lastEvaluation: State;
|
|
46
|
+
readonly events: readonly string[];
|
|
47
|
+
readonly tokenUsage?: TokenUsageSummary;
|
|
48
|
+
readonly context: LoopExecutionContextSnapshot;
|
|
49
|
+
}
|
|
50
|
+
export interface LoopExecutionOptions<State, Action extends LoopExecutionAction = LoopExecutionAction> {
|
|
51
|
+
readonly evaluate: () => Promise<Result<State, RuntimeError>>;
|
|
52
|
+
readonly converged: (state: State) => boolean;
|
|
53
|
+
readonly nextAction: (state: State) => Action | undefined;
|
|
54
|
+
readonly execute: (action: Action, state: State, iteration: number) => Promise<Result<unknown, RuntimeError>>;
|
|
55
|
+
readonly maxIterations?: number;
|
|
56
|
+
readonly wallClockMs?: number;
|
|
57
|
+
readonly tokenBudget?: number;
|
|
58
|
+
readonly stalled?: (state: State, action: Action) => boolean;
|
|
59
|
+
readonly fingerprint?: false | Omit<FingerprintDetectorOptions<{
|
|
60
|
+
readonly state: State;
|
|
61
|
+
readonly action: Action;
|
|
62
|
+
}>, "project">;
|
|
63
|
+
readonly now?: () => number;
|
|
64
|
+
readonly context?: LoopExecutionContextOptions;
|
|
65
|
+
readonly onCycle?: (progress: LoopExecutionProgress) => void;
|
|
66
|
+
}
|
|
67
|
+
export declare function executeLoop<State, Action extends LoopExecutionAction = LoopExecutionAction>(options: LoopExecutionOptions<State, Action>): Promise<Result<LoopExecutionSummary<State>, RuntimeError>>;
|
|
68
|
+
//# sourceMappingURL=execution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../../src/loop/execution.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { type Result } from "neverthrow";
|
|
2
|
+
import type { JoinPolicy } from "./builder/types.ts";
|
|
3
|
+
import type { RuntimeError, Usage } from "../model/index.ts";
|
|
4
|
+
import type { BranchWritableStateStore, StateHash, StateReducer, StateStore } from "./state/index.ts";
|
|
5
|
+
/**
|
|
6
|
+
* What an isolated branch returns: a bounded prose summary (NEVER the raw branch state, task 6.3)
|
|
7
|
+
* plus an optional small structured payload the reducer folds. `fanOut` truncates `summary` to the
|
|
8
|
+
* configured char budget so one runaway branch cannot blow the parent loop's context window.
|
|
9
|
+
*/
|
|
10
|
+
export interface BranchSummary<D = unknown> {
|
|
11
|
+
readonly summary: string;
|
|
12
|
+
readonly data?: D;
|
|
13
|
+
}
|
|
14
|
+
/** A branch: pure work over an ISOLATED copy of the input state, returning a condensed summary. */
|
|
15
|
+
export type Branch<S, D> = (isolated: S) => Promise<BranchSummary<D>> | BranchSummary<D>;
|
|
16
|
+
/** A branch that threw/rejected; the message is preserved for the partial-failure report. */
|
|
17
|
+
export interface BranchFailure {
|
|
18
|
+
readonly message: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Per-branch outcome captured by `fanOut`. Failure is DATA, not a thrown error, so `fanIn`'s
|
|
22
|
+
* partial-failure policy can weigh it; `elapsedMs` lets the `race` policy pick the fastest success.
|
|
23
|
+
*/
|
|
24
|
+
export type BranchOutcome<D = unknown> = {
|
|
25
|
+
readonly index: number;
|
|
26
|
+
readonly ok: true;
|
|
27
|
+
readonly summary: BranchSummary<D>;
|
|
28
|
+
readonly elapsedMs: number;
|
|
29
|
+
} | {
|
|
30
|
+
readonly index: number;
|
|
31
|
+
readonly ok: false;
|
|
32
|
+
readonly error: BranchFailure;
|
|
33
|
+
readonly elapsedMs: number;
|
|
34
|
+
};
|
|
35
|
+
export interface FanOutSpec<S, D> {
|
|
36
|
+
/** Shared input state; each branch receives an isolated `structuredClone`, never the original. */
|
|
37
|
+
readonly state: S;
|
|
38
|
+
readonly branches: readonly Branch<S, D>[];
|
|
39
|
+
/** Concurrency cap (design D2/D8: in-process, ~3–10): at most this many branches run at once. */
|
|
40
|
+
readonly maxConcurrency: number;
|
|
41
|
+
/** Per-branch summary char budget; defaults to ~1.5k tokens. */
|
|
42
|
+
readonly summaryBudgetChars?: number;
|
|
43
|
+
/** Aborting interrupts in-flight branches and fails the fan-out with `cancelled`. */
|
|
44
|
+
readonly signal?: AbortSignal;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* `fanOut` fails as a whole only on misconfiguration or hard interruption — never on a branch
|
|
48
|
+
* failure, which is captured per-branch for `fanIn`'s partial-failure policy to decide.
|
|
49
|
+
*/
|
|
50
|
+
export type FanOutError = {
|
|
51
|
+
readonly kind: "misconfigured";
|
|
52
|
+
readonly reason: string;
|
|
53
|
+
} | {
|
|
54
|
+
readonly kind: "cancelled";
|
|
55
|
+
readonly reason: string;
|
|
56
|
+
};
|
|
57
|
+
/** The merge reducer — the ONLY point where branch results recombine into one state. */
|
|
58
|
+
export type FanInReducer<S, D> = (summaries: readonly BranchSummary<D>[]) => S;
|
|
59
|
+
/** What to do when some branches failed. */
|
|
60
|
+
export type PartialFailurePolicy = {
|
|
61
|
+
readonly kind: "fail-fast";
|
|
62
|
+
} | {
|
|
63
|
+
readonly kind: "tolerate";
|
|
64
|
+
readonly minSuccess: number;
|
|
65
|
+
};
|
|
66
|
+
export interface FanInOptions<S, D> {
|
|
67
|
+
readonly reducer: FanInReducer<S, D>;
|
|
68
|
+
/** Defaults per policy: `barrier` ⇒ fail-fast; `quorum` ⇒ tolerate(quorum); `race`/`reduce` ⇒ tolerate(1). */
|
|
69
|
+
readonly onPartialFailure?: PartialFailurePolicy;
|
|
70
|
+
/** Required for `quorum`: proceed once this many branches AGREE. */
|
|
71
|
+
readonly quorum?: number;
|
|
72
|
+
/** Agreement key for `quorum`; defaults to the branch's `data`, falling back to its `summary`. */
|
|
73
|
+
readonly agreeBy?: (summary: BranchSummary<D>) => unknown;
|
|
74
|
+
}
|
|
75
|
+
export type FanInError = {
|
|
76
|
+
readonly kind: "partial-failure";
|
|
77
|
+
readonly succeeded: number;
|
|
78
|
+
readonly failed: number;
|
|
79
|
+
readonly failures: readonly BranchFailure[];
|
|
80
|
+
} | {
|
|
81
|
+
readonly kind: "no-success";
|
|
82
|
+
readonly failures: readonly BranchFailure[];
|
|
83
|
+
} | {
|
|
84
|
+
readonly kind: "no-quorum";
|
|
85
|
+
readonly required: number;
|
|
86
|
+
readonly largestAgreement: number;
|
|
87
|
+
} | {
|
|
88
|
+
readonly kind: "misconfigured";
|
|
89
|
+
readonly reason: string;
|
|
90
|
+
};
|
|
91
|
+
export interface StoreBackedBranchContext {
|
|
92
|
+
readonly index: number;
|
|
93
|
+
readonly branchHash: StateHash;
|
|
94
|
+
}
|
|
95
|
+
export interface StoreBackedBranchResult<S, D = unknown> {
|
|
96
|
+
readonly state: S;
|
|
97
|
+
readonly summary?: BranchSummary<D>;
|
|
98
|
+
readonly usage?: Usage;
|
|
99
|
+
}
|
|
100
|
+
export type StoreBackedBranch<S, D = unknown> = (state: S, context: StoreBackedBranchContext) => Promise<StoreBackedBranchResult<S, D>> | StoreBackedBranchResult<S, D>;
|
|
101
|
+
export interface StoreBackedFanOutSpec<S, D = unknown> {
|
|
102
|
+
readonly store: BranchWritableStateStore<S>;
|
|
103
|
+
readonly from: StateHash;
|
|
104
|
+
readonly branches: readonly StoreBackedBranch<S, D>[];
|
|
105
|
+
readonly maxConcurrency: number;
|
|
106
|
+
readonly summaryBudgetChars?: number;
|
|
107
|
+
readonly signal?: AbortSignal;
|
|
108
|
+
}
|
|
109
|
+
export type StoreBackedBranchOutcome<D = unknown> = {
|
|
110
|
+
readonly index: number;
|
|
111
|
+
readonly ok: true;
|
|
112
|
+
readonly branchHash: StateHash;
|
|
113
|
+
readonly stateHash: StateHash;
|
|
114
|
+
readonly summary: BranchSummary<D>;
|
|
115
|
+
readonly elapsedMs: number;
|
|
116
|
+
readonly usage?: Usage;
|
|
117
|
+
} | {
|
|
118
|
+
readonly index: number;
|
|
119
|
+
readonly ok: false;
|
|
120
|
+
readonly branchHash?: StateHash;
|
|
121
|
+
readonly error: BranchFailure;
|
|
122
|
+
readonly elapsedMs: number;
|
|
123
|
+
readonly usage?: Usage;
|
|
124
|
+
};
|
|
125
|
+
export interface StoreBackedFanInOptions<S, D = unknown> {
|
|
126
|
+
readonly store: StateStore<S>;
|
|
127
|
+
readonly reducer: StateReducer<S>;
|
|
128
|
+
readonly onPartialFailure?: PartialFailurePolicy;
|
|
129
|
+
readonly quorum?: number;
|
|
130
|
+
readonly agreeBy?: (summary: BranchSummary<D>) => unknown;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Bounded fan-out (tasks 6.1, 6.3). Runs each branch over an isolated `structuredClone` of `state`
|
|
134
|
+
* (copy-on-fanout: no shared-mutable across branches) with at most `maxConcurrency` running at
|
|
135
|
+
* once, and returns every branch's outcome — successes carry a condensed summary, failures carry a
|
|
136
|
+
* message — for `fanIn` to combine. The whole fan-out errs only on misconfiguration or abort.
|
|
137
|
+
*/
|
|
138
|
+
export declare function fanOut<S, D = unknown>(spec: FanOutSpec<S, D>): Promise<Result<readonly BranchOutcome<D>[], FanOutError>>;
|
|
139
|
+
export declare function storeBackedFanOut<S, D = unknown>(spec: StoreBackedFanOutSpec<S, D>): Promise<Result<readonly StoreBackedBranchOutcome<D>[], FanOutError>>;
|
|
140
|
+
export declare function storeBackedFanIn<S, D = unknown>(policy: JoinPolicy, outcomes: readonly StoreBackedBranchOutcome<D>[], options: StoreBackedFanInOptions<S, D>): Promise<Result<S, FanInError | RuntimeError>>;
|
|
141
|
+
/**
|
|
142
|
+
* Join-policy fan-in (tasks 6.2, 6.4). Applies the partial-failure gate, then the join policy
|
|
143
|
+
* selects which successful summaries count, then the reducer — the ONLY merge point — folds them
|
|
144
|
+
* into one state. `barrier`/`reduce` fold every success; `race` folds the fastest; `quorum` folds
|
|
145
|
+
* the first group of `quorum` branches to agree.
|
|
146
|
+
*/
|
|
147
|
+
export declare function fanIn<S, D = unknown>(policy: JoinPolicy, outcomes: readonly BranchOutcome<D>[], options: FanInOptions<S, D>): Result<S, FanInError>;
|
|
148
|
+
//# sourceMappingURL=fanout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fanout.d.ts","sourceRoot":"","sources":["../../src/loop/fanout.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { Result } from "neverthrow";
|
|
2
|
+
import type { LoopOutcome, LoopRunError, LoopStopReason } from "./builder/index.ts";
|
|
3
|
+
import type { LoopDefinition } from "./serve.ts";
|
|
4
|
+
import { type RunReporter } from "../run-output/index.ts";
|
|
5
|
+
export declare const LOOP_EVENT_ENV = "ORCA_LOOP_EVENT";
|
|
6
|
+
/** What the supervisor hands the spawner for one trigger firing. */
|
|
7
|
+
export interface ChildSpec {
|
|
8
|
+
/** The loop module path or registered name the child `orcats run` resolves. */
|
|
9
|
+
readonly loop: string;
|
|
10
|
+
/** The trigger event, serialized to the child by the default spawner. */
|
|
11
|
+
readonly event: unknown;
|
|
12
|
+
}
|
|
13
|
+
/** A spawned ephemeral child running one loop firing; independently terminable. */
|
|
14
|
+
export interface ChildHandle {
|
|
15
|
+
/** OS-level termination of a runaway child (default `SIGKILL`). */
|
|
16
|
+
kill(signal?: NodeJS.Signals): void;
|
|
17
|
+
/** Resolves when the child exits with its code (null when terminated by signal). */
|
|
18
|
+
readonly exited: Promise<number | null>;
|
|
19
|
+
}
|
|
20
|
+
/** Spawns one ephemeral child per trigger firing. Injectable so tests avoid real processes. */
|
|
21
|
+
export type ChildSpawner = (spec: ChildSpec) => ChildHandle;
|
|
22
|
+
export interface ChildProcessSpec {
|
|
23
|
+
readonly command: string;
|
|
24
|
+
readonly args: readonly string[];
|
|
25
|
+
readonly env: NodeJS.ProcessEnv;
|
|
26
|
+
}
|
|
27
|
+
export interface ChildProcessSpecOptions {
|
|
28
|
+
readonly argv?: readonly string[];
|
|
29
|
+
readonly env?: NodeJS.ProcessEnv;
|
|
30
|
+
readonly execPath?: string;
|
|
31
|
+
}
|
|
32
|
+
export interface LoopFiringResult {
|
|
33
|
+
readonly result: Result<LoopOutcome, LoopRunError>;
|
|
34
|
+
readonly exitCode: number;
|
|
35
|
+
readonly diagnostic: string;
|
|
36
|
+
}
|
|
37
|
+
export interface LoopFiringOptions {
|
|
38
|
+
readonly writeDiagnostic?: (message: string) => void;
|
|
39
|
+
readonly reporter?: RunReporter;
|
|
40
|
+
}
|
|
41
|
+
export declare function createLoopChildSpec(loop: string, event: unknown): ChildSpec;
|
|
42
|
+
export declare function encodeLoopEvent(event: unknown): string | undefined;
|
|
43
|
+
export declare function decodeLoopEvent(env?: NodeJS.ProcessEnv): unknown;
|
|
44
|
+
export declare function buildChildProcessSpec(spec: ChildSpec, options?: ChildProcessSpecOptions): ChildProcessSpec;
|
|
45
|
+
/** Default spawner: re-invoke this CLI as `orcats run --no-typecheck <loop>` in a fresh OS process. */
|
|
46
|
+
export declare const spawnLoopChild: ChildSpawner;
|
|
47
|
+
/** Process exit status for a stop reason: `converged` is 0, every other stop is non-zero. */
|
|
48
|
+
export declare function exitCodeForStop(reason: LoopStopReason): number;
|
|
49
|
+
/** Exit status for a completed run: the stop reason's code, or 70 for a build/runtime error. */
|
|
50
|
+
export declare function exitCodeForRun(result: Result<LoopOutcome, LoopRunError>): number;
|
|
51
|
+
export declare function runLoopFiring(definition: LoopDefinition, event: unknown, options?: LoopFiringOptions): Promise<LoopFiringResult>;
|
|
52
|
+
export declare function formatLoopFiringDiagnostic(name: string, result: Result<LoopOutcome, LoopRunError>): string;
|
|
53
|
+
export declare function describeLoopRunError(error: LoopRunError): string;
|
|
54
|
+
//# sourceMappingURL=firing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firing.d.ts","sourceRoot":"","sources":["../../src/loop/firing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { CycleReport, GraphInput } from "./types.ts";
|
|
2
|
+
/**
|
|
3
|
+
* One-pass 3-color DFS. Declared back-edges are recorded first-class with the cycle they
|
|
4
|
+
* close (`to → … → from` over the forward DAG); accidental cycles are discovered by the DFS
|
|
5
|
+
* and named from the grey stack.
|
|
6
|
+
*/
|
|
7
|
+
export declare function analyzeGraph(input: GraphInput): CycleReport;
|
|
8
|
+
//# sourceMappingURL=analyze.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../../src/loop/graph/analyze.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAY,WAAW,EAAQ,UAAU,EAAU,MAAM,YAAY,CAAC;AAiDlF;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,CA+D3D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/loop/graph/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export type NodeId = string;
|
|
2
|
+
export interface Edge {
|
|
3
|
+
readonly from: NodeId;
|
|
4
|
+
readonly to: NodeId;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* A back-edge closes a cycle. `declared` distinguishes intentional loop back-edges —
|
|
8
|
+
* first-class domain data the builder hands us (design D6) — from accidental cycles the
|
|
9
|
+
* DFS discovers in the forward subgraph. `cycle` is the node path naming the loop, used
|
|
10
|
+
* to name the offending cycle in build/lint errors. For a declared back-edge it runs
|
|
11
|
+
* `to → … → from` (the forward path the back-edge closes); for an accidental one it is
|
|
12
|
+
* the grey DFS-stack slice `to → … → from`.
|
|
13
|
+
*/
|
|
14
|
+
export interface BackEdge extends Edge {
|
|
15
|
+
readonly declared: boolean;
|
|
16
|
+
readonly cycle: readonly NodeId[];
|
|
17
|
+
}
|
|
18
|
+
/** Input to {@link analyzeGraph}: the node set, all edges, and which edges are declared loop back-edges. */
|
|
19
|
+
export interface GraphInput {
|
|
20
|
+
readonly nodes: readonly NodeId[];
|
|
21
|
+
readonly edges: readonly Edge[];
|
|
22
|
+
/** Edges the builder declares as intentional loop back-edges; trusted, not rediscovered. */
|
|
23
|
+
readonly declaredBackEdges: readonly Edge[];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* One-pass 3-color DFS output. `traversal` is the preorder visit sequence; `topoOrder` is a
|
|
27
|
+
* valid topological order of the forward DAG (reverse postorder, back-edges removed);
|
|
28
|
+
* `backEdges` holds both declared loop back-edges and discovered accidental cycles.
|
|
29
|
+
*/
|
|
30
|
+
export interface CycleReport {
|
|
31
|
+
readonly traversal: readonly NodeId[];
|
|
32
|
+
readonly topoOrder: readonly NodeId[];
|
|
33
|
+
readonly backEdges: readonly BackEdge[];
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/loop/graph/types.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC;AAE5B,MAAM,WAAW,IAAI;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,QAAS,SAAQ,IAAI;IACpC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,4GAA4G;AAC5G,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IAChC,4FAA4F;IAC5F,QAAQ,CAAC,iBAAiB,EAAE,SAAS,IAAI,EAAE,CAAC;CAC7C;AAED;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,SAAS,QAAQ,EAAE,CAAC;CACzC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from "./builder/index.ts";
|
|
2
|
+
export type { LoopContextPressure, LoopExecutionContextOptions } from "./execution.ts";
|
|
3
|
+
export * from "./state/index.ts";
|
|
4
|
+
export * from "./io/index.ts";
|
|
5
|
+
export * from "./context/index.ts";
|
|
6
|
+
export * from "./serve.ts";
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/loop/index.ts"],"names":[],"mappings":"AAGA,cAAc,oBAAoB,CAAC;AACnC,YAAY,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AACvF,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AAGnC,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/loop/io/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { type Result } from "neverthrow";
|
|
2
|
+
import { type RuntimeError } from "../../model/index.ts";
|
|
3
|
+
import { type LinearExternalUrl, type LinearIssueUpdateInput, type LinearTool } from "../../tools/index.ts";
|
|
4
|
+
import type { Sink } from "./sink.ts";
|
|
5
|
+
import type { Source } from "./source.ts";
|
|
6
|
+
export interface LinearWebhookHeaders {
|
|
7
|
+
readonly [name: string]: string | readonly string[] | undefined;
|
|
8
|
+
}
|
|
9
|
+
export interface LinearWebhookRequest {
|
|
10
|
+
readonly method: string;
|
|
11
|
+
readonly url: string;
|
|
12
|
+
readonly rawBody: string;
|
|
13
|
+
readonly headers: LinearWebhookHeaders;
|
|
14
|
+
readonly payload: unknown;
|
|
15
|
+
}
|
|
16
|
+
export interface LinearWebhookDelivery {
|
|
17
|
+
readonly accepted: boolean;
|
|
18
|
+
readonly status: number;
|
|
19
|
+
readonly error?: RuntimeError;
|
|
20
|
+
}
|
|
21
|
+
export type LinearWebhookRequestHandler = (request: LinearWebhookRequest) => Promise<LinearWebhookDelivery>;
|
|
22
|
+
export interface LinearWebhookListener {
|
|
23
|
+
close(): Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
export type LinearWebhookListenerFactory = (onRequest: LinearWebhookRequestHandler) => Promise<Result<LinearWebhookListener, RuntimeError>>;
|
|
26
|
+
export interface LinearWebhookListenerOptions {
|
|
27
|
+
readonly port: number;
|
|
28
|
+
readonly path?: string;
|
|
29
|
+
}
|
|
30
|
+
export interface LinearWebhookVerificationOptions {
|
|
31
|
+
readonly request: LinearWebhookRequest;
|
|
32
|
+
readonly secret: string;
|
|
33
|
+
readonly now?: () => number;
|
|
34
|
+
readonly replayToleranceMs?: number;
|
|
35
|
+
}
|
|
36
|
+
export declare function linearWebhookSignature(secret: string, rawBody: string, timestamp: string): string;
|
|
37
|
+
export declare function verifyLinearWebhookRequest(options: LinearWebhookVerificationOptions): Result<void, RuntimeError>;
|
|
38
|
+
export declare function createLinearWebhookListenerFactory(options: LinearWebhookListenerOptions): LinearWebhookListenerFactory;
|
|
39
|
+
export interface LinearActor {
|
|
40
|
+
readonly id?: string;
|
|
41
|
+
readonly name?: string;
|
|
42
|
+
readonly email?: string;
|
|
43
|
+
readonly type?: string;
|
|
44
|
+
readonly isApp?: boolean;
|
|
45
|
+
}
|
|
46
|
+
export interface LinearIssueTriggerEvent {
|
|
47
|
+
readonly kind: "linear.issue";
|
|
48
|
+
readonly webhookType: "Issue" | "Comment";
|
|
49
|
+
readonly action: string;
|
|
50
|
+
readonly issueId: string;
|
|
51
|
+
readonly issueIdentifier?: string;
|
|
52
|
+
readonly issueUrl?: string;
|
|
53
|
+
readonly teamId?: string;
|
|
54
|
+
readonly projectId?: string;
|
|
55
|
+
readonly workflowStateId?: string;
|
|
56
|
+
readonly labelIds: readonly string[];
|
|
57
|
+
readonly actor?: LinearActor;
|
|
58
|
+
readonly dedupeKey: string;
|
|
59
|
+
readonly raw: unknown;
|
|
60
|
+
}
|
|
61
|
+
export interface LinearAgentIssueContext {
|
|
62
|
+
readonly id?: string;
|
|
63
|
+
readonly identifier?: string;
|
|
64
|
+
readonly url?: string;
|
|
65
|
+
readonly title?: string;
|
|
66
|
+
}
|
|
67
|
+
export interface LinearAgentPromptContext {
|
|
68
|
+
readonly id?: string;
|
|
69
|
+
readonly body?: string;
|
|
70
|
+
readonly actor?: LinearActor;
|
|
71
|
+
}
|
|
72
|
+
export interface LinearAgentActivityContext {
|
|
73
|
+
readonly id?: string;
|
|
74
|
+
readonly type?: string;
|
|
75
|
+
readonly body?: string;
|
|
76
|
+
}
|
|
77
|
+
export type LinearAgentEventType = "session_created" | "session_prompted" | "activity" | "stop";
|
|
78
|
+
export interface LinearAgentTriggerEvent {
|
|
79
|
+
readonly kind: "linear.agent";
|
|
80
|
+
readonly eventType: LinearAgentEventType;
|
|
81
|
+
readonly action: string;
|
|
82
|
+
readonly agentSessionId: string;
|
|
83
|
+
readonly issue?: LinearAgentIssueContext;
|
|
84
|
+
readonly prompt?: LinearAgentPromptContext;
|
|
85
|
+
readonly activity?: LinearAgentActivityContext;
|
|
86
|
+
readonly isStopSignal: boolean;
|
|
87
|
+
readonly dedupeKey: string;
|
|
88
|
+
readonly raw: unknown;
|
|
89
|
+
}
|
|
90
|
+
export interface LinearSourceBaseOptions {
|
|
91
|
+
readonly webhookSecret: string;
|
|
92
|
+
readonly port?: number;
|
|
93
|
+
readonly path?: string;
|
|
94
|
+
readonly listenerFactory?: LinearWebhookListenerFactory;
|
|
95
|
+
readonly replayToleranceMs?: number;
|
|
96
|
+
readonly now?: () => number;
|
|
97
|
+
readonly seenDedupeKeys?: Set<string>;
|
|
98
|
+
}
|
|
99
|
+
export interface LinearIssueSourceOptions extends LinearSourceBaseOptions {
|
|
100
|
+
readonly teamId?: string;
|
|
101
|
+
readonly teamIds?: readonly string[];
|
|
102
|
+
readonly projectId?: string;
|
|
103
|
+
readonly projectIds?: readonly string[];
|
|
104
|
+
readonly workflowStateId?: string;
|
|
105
|
+
readonly workflowStateIds?: readonly string[];
|
|
106
|
+
readonly labelIds?: readonly string[];
|
|
107
|
+
readonly actions?: readonly string[];
|
|
108
|
+
readonly selfActorId?: string;
|
|
109
|
+
readonly excludeActorIds?: readonly string[];
|
|
110
|
+
readonly excludeSelfActor?: boolean;
|
|
111
|
+
}
|
|
112
|
+
export interface LinearAgentSourceOptions extends LinearSourceBaseOptions {
|
|
113
|
+
readonly appUserId?: string;
|
|
114
|
+
readonly excludeActorIds?: readonly string[];
|
|
115
|
+
}
|
|
116
|
+
export declare function linearIssueSource(options: LinearIssueSourceOptions): Source<LinearIssueTriggerEvent>;
|
|
117
|
+
export declare function linearAgentSource(options: LinearAgentSourceOptions): Source<LinearAgentTriggerEvent>;
|
|
118
|
+
export interface LinearIssueSinkOutput {
|
|
119
|
+
readonly issueId: string;
|
|
120
|
+
readonly finalSummary?: string;
|
|
121
|
+
readonly prUrl?: string;
|
|
122
|
+
readonly commentBody?: string;
|
|
123
|
+
readonly update?: Omit<LinearIssueUpdateInput, "issueId">;
|
|
124
|
+
}
|
|
125
|
+
export interface LinearIssueSinkOptions {
|
|
126
|
+
readonly tool?: LinearTool;
|
|
127
|
+
readonly commentPrefix?: string;
|
|
128
|
+
}
|
|
129
|
+
export declare function linearIssueSink(options?: LinearIssueSinkOptions): Sink<LinearIssueSinkOutput>;
|
|
130
|
+
export interface LinearAgentSinkOutput {
|
|
131
|
+
readonly agentSessionId: string;
|
|
132
|
+
readonly responseBody?: string;
|
|
133
|
+
readonly errorBody?: string;
|
|
134
|
+
readonly prUrl?: string;
|
|
135
|
+
readonly plan?: string;
|
|
136
|
+
readonly externalUrls?: readonly LinearExternalUrl[];
|
|
137
|
+
}
|
|
138
|
+
export interface LinearAgentSinkOptions {
|
|
139
|
+
readonly tool?: LinearTool;
|
|
140
|
+
}
|
|
141
|
+
export declare function linearAgentSink(options?: LinearAgentSinkOptions): Sink<LinearAgentSinkOutput>;
|
|
142
|
+
//# sourceMappingURL=linear.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linear.d.ts","sourceRoot":"","sources":["../../../src/loop/io/linear.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { type Result } from "neverthrow";
|
|
2
|
+
import { type RuntimeError } from "../../model/index.ts";
|
|
3
|
+
import { type GitHubTool } from "../../tools/index.ts";
|
|
4
|
+
/** Bundled sink kinds. A custom output reuses the closest kind or its own structural object. */
|
|
5
|
+
export type SinkKind = "pr" | "file" | "slack" | "queue" | "stdout" | "linear-issue" | "linear-agent";
|
|
6
|
+
/** A loop output — the only loop-level emit boundary; Result-typed. */
|
|
7
|
+
export interface Sink<A = unknown> {
|
|
8
|
+
readonly kind: SinkKind;
|
|
9
|
+
emit(output: A): Promise<Result<void, RuntimeError>>;
|
|
10
|
+
}
|
|
11
|
+
export interface StdoutOptions<A> {
|
|
12
|
+
readonly format?: (output: A) => string;
|
|
13
|
+
/** Write target; default: process.stdout. Injectable for tests. */
|
|
14
|
+
readonly write?: (text: string) => void;
|
|
15
|
+
}
|
|
16
|
+
export declare function stdout<A = unknown>(options?: StdoutOptions<A>): Sink<A>;
|
|
17
|
+
export interface FileSinkOptions<A> {
|
|
18
|
+
readonly path: string;
|
|
19
|
+
readonly format?: (output: A) => string;
|
|
20
|
+
}
|
|
21
|
+
export declare function file<A = unknown>(options: FileSinkOptions<A>): Sink<A>;
|
|
22
|
+
export interface PrSinkOptions<A> {
|
|
23
|
+
readonly title: string;
|
|
24
|
+
readonly base?: string;
|
|
25
|
+
/** Body file written before `gh pr create --body-file`; default: a tmpdir file. */
|
|
26
|
+
readonly bodyFile?: string;
|
|
27
|
+
readonly format?: (output: A) => string;
|
|
28
|
+
/** GitHub client; default: the repo gh CLI tool. Injectable for tests. */
|
|
29
|
+
readonly gh?: GitHubTool;
|
|
30
|
+
}
|
|
31
|
+
export declare function pr<A = unknown>(options: PrSinkOptions<A>): Sink<A>;
|
|
32
|
+
/** POSTs `body` to `url`; resolves to `ok` on a 2xx, `err(RuntimeError)` otherwise. */
|
|
33
|
+
export type SlackPost = (url: string, body: string) => Promise<Result<void, RuntimeError>>;
|
|
34
|
+
export interface SlackOptions<A> {
|
|
35
|
+
readonly webhookUrl: string;
|
|
36
|
+
readonly format?: (output: A) => string;
|
|
37
|
+
readonly post?: SlackPost;
|
|
38
|
+
}
|
|
39
|
+
export declare function slack<A = unknown>(options: SlackOptions<A>): Sink<A>;
|
|
40
|
+
export interface QueueProducer<A> {
|
|
41
|
+
push(message: A): Promise<Result<void, RuntimeError>>;
|
|
42
|
+
}
|
|
43
|
+
export interface QueueSinkOptions<A> {
|
|
44
|
+
readonly producer: QueueProducer<A>;
|
|
45
|
+
}
|
|
46
|
+
export declare function queueSink<A = unknown>(options: QueueSinkOptions<A>): Sink<A>;
|
|
47
|
+
//# sourceMappingURL=sink.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sink.d.ts","sourceRoot":"","sources":["../../../src/loop/io/sink.ts"],"names":[],"mappings":"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"}
|