@agent-relay/factory 0.1.62 → 0.1.64
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/README.md +117 -15
- package/dist/cli/exit-codes.d.ts +81 -0
- package/dist/cli/exit-codes.d.ts.map +1 -0
- package/dist/cli/exit-codes.js +122 -0
- package/dist/cli/exit-codes.js.map +1 -0
- package/dist/cli/fleet.d.ts +26 -2
- package/dist/cli/fleet.d.ts.map +1 -1
- package/dist/cli/fleet.js +183 -40
- package/dist/cli/fleet.js.map +1 -1
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config/schema.d.ts +156 -52
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +17 -5
- package/dist/config/schema.js.map +1 -1
- package/dist/dispatch/templates.d.ts +7 -0
- package/dist/dispatch/templates.d.ts.map +1 -1
- package/dist/dispatch/templates.js +64 -12
- package/dist/dispatch/templates.js.map +1 -1
- package/dist/dispatch/work-unit-identity.d.ts +19 -0
- package/dist/dispatch/work-unit-identity.d.ts.map +1 -0
- package/dist/dispatch/work-unit-identity.js +40 -0
- package/dist/dispatch/work-unit-identity.js.map +1 -0
- package/dist/environments/stack-descriptor.d.ts +3 -3
- package/dist/fleet/control-plane-circuit.d.ts +57 -0
- package/dist/fleet/control-plane-circuit.d.ts.map +1 -0
- package/dist/fleet/control-plane-circuit.js +231 -0
- package/dist/fleet/control-plane-circuit.js.map +1 -0
- package/dist/fleet/internal-fleet-client.d.ts +2 -1
- package/dist/fleet/internal-fleet-client.d.ts.map +1 -1
- package/dist/fleet/internal-fleet-client.js +11 -7
- package/dist/fleet/internal-fleet-client.js.map +1 -1
- package/dist/fleet/relay-fleet-client.d.ts +3 -0
- package/dist/fleet/relay-fleet-client.d.ts.map +1 -1
- package/dist/fleet/relay-fleet-client.js +97 -18
- package/dist/fleet/relay-fleet-client.js.map +1 -1
- package/dist/github/writeback-paths.d.ts +7 -0
- package/dist/github/writeback-paths.d.ts.map +1 -0
- package/dist/github/writeback-paths.js +28 -0
- package/dist/github/writeback-paths.js.map +1 -0
- package/dist/hosted/orchestrator.d.ts.map +1 -1
- package/dist/hosted/orchestrator.js +2 -0
- package/dist/hosted/orchestrator.js.map +1 -1
- package/dist/index.d.ts +10 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/intake/index.d.ts +2 -1
- package/dist/intake/index.d.ts.map +1 -1
- package/dist/intake/index.js +2 -1
- package/dist/intake/index.js.map +1 -1
- package/dist/intake/notion-manifest.d.ts +48 -0
- package/dist/intake/notion-manifest.d.ts.map +1 -0
- package/dist/intake/notion-manifest.js +258 -0
- package/dist/intake/notion-manifest.js.map +1 -0
- package/dist/intake/notion-relay-claim.d.ts +5 -4
- package/dist/intake/notion-relay-claim.d.ts.map +1 -1
- package/dist/intake/notion-relay-claim.js +48 -7
- package/dist/intake/notion-relay-claim.js.map +1 -1
- package/dist/intake/notion.d.ts +6 -3
- package/dist/intake/notion.d.ts.map +1 -1
- package/dist/intake/notion.js +63 -13
- package/dist/intake/notion.js.map +1 -1
- package/dist/issue-key-match.d.ts +6 -0
- package/dist/issue-key-match.d.ts.map +1 -1
- package/dist/issue-key-match.js +6 -1
- package/dist/issue-key-match.js.map +1 -1
- package/dist/mount/local-mount-preflight.d.ts.map +1 -1
- package/dist/mount/local-mount-preflight.js +6 -2
- package/dist/mount/local-mount-preflight.js.map +1 -1
- package/dist/mount/mount-auth-error.d.ts +16 -3
- package/dist/mount/mount-auth-error.d.ts.map +1 -1
- package/dist/mount/mount-auth-error.js +34 -7
- package/dist/mount/mount-auth-error.js.map +1 -1
- package/dist/mount/relayfile-cloud-mount-client.d.ts +36 -1
- package/dist/mount/relayfile-cloud-mount-client.d.ts.map +1 -1
- package/dist/mount/relayfile-cloud-mount-client.js +136 -6
- package/dist/mount/relayfile-cloud-mount-client.js.map +1 -1
- package/dist/mount/relayfile-github-connection-write.d.ts +24 -2
- package/dist/mount/relayfile-github-connection-write.d.ts.map +1 -1
- package/dist/mount/relayfile-github-connection-write.js +90 -1
- package/dist/mount/relayfile-github-connection-write.js.map +1 -1
- package/dist/node/factory-node.d.ts.map +1 -1
- package/dist/node/factory-node.js +18 -4
- package/dist/node/factory-node.js.map +1 -1
- package/dist/observability/cloud-reporter.d.ts +1 -0
- package/dist/observability/cloud-reporter.d.ts.map +1 -1
- package/dist/observability/cloud-reporter.js +182 -50
- package/dist/observability/cloud-reporter.js.map +1 -1
- package/dist/observability/events.d.ts +52 -52
- package/dist/orchestrator/batch-tracker.d.ts +25 -0
- package/dist/orchestrator/batch-tracker.d.ts.map +1 -1
- package/dist/orchestrator/batch-tracker.js +48 -2
- package/dist/orchestrator/batch-tracker.js.map +1 -1
- package/dist/orchestrator/factory.d.ts +36 -2
- package/dist/orchestrator/factory.d.ts.map +1 -1
- package/dist/orchestrator/factory.js +1208 -82
- package/dist/orchestrator/factory.js.map +1 -1
- package/dist/orchestrator/index.d.ts +1 -1
- package/dist/orchestrator/index.d.ts.map +1 -1
- package/dist/orchestrator/index.js +1 -1
- package/dist/orchestrator/index.js.map +1 -1
- package/dist/ports/fleet.d.ts +6 -0
- package/dist/ports/fleet.d.ts.map +1 -1
- package/dist/ports/index.d.ts +1 -1
- package/dist/ports/index.d.ts.map +1 -1
- package/dist/ports/mount.d.ts +39 -0
- package/dist/ports/mount.d.ts.map +1 -1
- package/dist/ports/state.d.ts +75 -4
- package/dist/ports/state.d.ts.map +1 -1
- package/dist/state/document-store.d.ts +33 -0
- package/dist/state/document-store.d.ts.map +1 -0
- package/dist/state/document-store.js +7 -0
- package/dist/state/document-store.js.map +1 -0
- package/dist/state/file-state-store.d.ts +32 -7
- package/dist/state/file-state-store.d.ts.map +1 -1
- package/dist/state/file-state-store.js +169 -250
- package/dist/state/file-state-store.js.map +1 -1
- package/dist/state/in-memory-state-store.d.ts +13 -2
- package/dist/state/in-memory-state-store.d.ts.map +1 -1
- package/dist/state/in-memory-state-store.js +87 -4
- package/dist/state/in-memory-state-store.js.map +1 -1
- package/dist/state/watch-state-document.d.ts +5 -0
- package/dist/state/watch-state-document.d.ts.map +1 -0
- package/dist/state/watch-state-document.js +486 -0
- package/dist/state/watch-state-document.js.map +1 -0
- package/dist/testing/deadline.d.ts +11 -0
- package/dist/testing/deadline.d.ts.map +1 -0
- package/dist/testing/deadline.js +23 -0
- package/dist/testing/deadline.js.map +1 -0
- package/dist/testing/fakes.d.ts +2 -0
- package/dist/testing/fakes.d.ts.map +1 -1
- package/dist/testing/fakes.js.map +1 -1
- package/dist/testing/index.d.ts +1 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +1 -0
- package/dist/testing/index.js.map +1 -1
- package/dist/trajectory.d.ts +25 -0
- package/dist/trajectory.d.ts.map +1 -0
- package/dist/trajectory.js +51 -0
- package/dist/trajectory.js.map +1 -0
- package/dist/triage/heuristic.d.ts +5 -0
- package/dist/triage/heuristic.d.ts.map +1 -1
- package/dist/triage/heuristic.js +42 -3
- package/dist/triage/heuristic.js.map +1 -1
- package/dist/triage/index.d.ts +1 -1
- package/dist/triage/index.d.ts.map +1 -1
- package/dist/triage/index.js +1 -1
- package/dist/triage/index.js.map +1 -1
- package/dist/triage/schema.d.ts +73 -55
- package/dist/triage/schema.d.ts.map +1 -1
- package/dist/triage/schema.js +2 -1
- package/dist/triage/schema.js.map +1 -1
- package/dist/types.d.ts +19 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/writeback/github.d.ts +22 -7
- package/dist/writeback/github.d.ts.map +1 -1
- package/dist/writeback/github.js +86 -16
- package/dist/writeback/github.js.map +1 -1
- package/dist/writeback/index.d.ts +1 -1
- package/dist/writeback/index.d.ts.map +1 -1
- package/dist/writeback/index.js +1 -1
- package/dist/writeback/index.js.map +1 -1
- package/package.json +13 -8
package/README.md
CHANGED
|
@@ -73,8 +73,9 @@ After init, add the `factory` label to an open issue and run a dry run below.
|
|
|
73
73
|
1. **Connect GitHub to your relay workspace** with push access for the target
|
|
74
74
|
repositories. Factory uses that workspace connection to publish branches and
|
|
75
75
|
open pull requests by default. A local `gh` installation and `gh auth login`
|
|
76
|
-
are required
|
|
77
|
-
|
|
76
|
+
are required when `github.identity` is `"user"`, or when the default
|
|
77
|
+
`"auto"` mode uses the compatibility GitHub issue lifecycle path. Exact
|
|
78
|
+
`"app"` mode needs no local GitHub credential. If a required
|
|
78
79
|
connection is missing, an interactive Factory command offers to open the
|
|
79
80
|
Relayfile connection flow and waits for it to finish. Linear-backed operations
|
|
80
81
|
require both Linear and GitHub; GitHub-native operations require GitHub.
|
|
@@ -149,6 +150,34 @@ names and the provider-claim state (`pending`, `verified`, or `degraded`). This
|
|
|
149
150
|
view is read from Factory's local in-flight registry, so it remains available
|
|
150
151
|
when GitHub lifecycle writeback is the degraded subsystem.
|
|
151
152
|
|
|
153
|
+
It also reports `fleetControlPlane`. Factory bounds its read-only roster probe,
|
|
154
|
+
pauses a live dispatch immediately when that probe fails, and opens a circuit
|
|
155
|
+
after repeated failures. While the circuit is open, new spawn and resume calls
|
|
156
|
+
fail fast. After `fleetHealth.resetTimeoutMs`, one half-open roster probe may
|
|
157
|
+
close the circuit. Configure `fleetHealth.rosterTimeoutMs`,
|
|
158
|
+
`fleetHealth.failureThreshold`, and `fleetHealth.resetTimeoutMs` when the fleet
|
|
159
|
+
has intentionally higher control-plane latency. Mutating calls are never
|
|
160
|
+
abandoned behind a local timeout because an accepted-but-late spawn would be
|
|
161
|
+
ambiguous.
|
|
162
|
+
|
|
163
|
+
A paused `run-once` or `loop` exits non-zero and logs `dispatch paused by the
|
|
164
|
+
circuit`; `factory status` reads the daemon heartbeat and reports the circuit's
|
|
165
|
+
`state`, `lastError`, and `retryAtMs`. If the broker is healthy but slower than
|
|
166
|
+
the configured bound, raise `fleetHealth.rosterTimeoutMs` (maximum 60 seconds)
|
|
167
|
+
to match measured control-plane latency. If the control path is unavailable,
|
|
168
|
+
repair the isolated broker and wait until `retryAtMs`; the next successful
|
|
169
|
+
half-open roster probe closes the circuit automatically. Do not treat an open
|
|
170
|
+
circuit as an empty queue or successful no-work iteration.
|
|
171
|
+
|
|
172
|
+
For production, set `fleetHealth.requireDedicatedBroker` to `true` and point
|
|
173
|
+
`AGENT_RELAY_STATE_DIR` at a state directory that is distinct from the
|
|
174
|
+
project's `.agentworkforce/relay`. Factory then refuses startup if it would
|
|
175
|
+
silently reuse the interactive project broker.
|
|
176
|
+
|
|
177
|
+
Factory now defaults `batchSize` to `1`. Operators may explicitly raise it to
|
|
178
|
+
at most `5` after isolating Factory workers from an interactive broker and
|
|
179
|
+
measuring control-plane latency under the intended recipe mix.
|
|
180
|
+
|
|
152
181
|
For a live daemon, `factory status` also includes `readinessReconcile`. Its
|
|
153
182
|
state advances from `retrying` to `degraded` after three consecutive periodic
|
|
154
183
|
discovery failures and returns to `healthy` after a successful checkpoint.
|
|
@@ -221,6 +250,31 @@ pages can be admitted only with a bootstrap entry containing the exact
|
|
|
221
250
|
`authorizedPageId`, destination, safe summary, and operator reason. That escape
|
|
222
251
|
hatch is deliberately page-specific; there is no title or content heuristic.
|
|
223
252
|
|
|
253
|
+
Factory can generate that manifest directly from the **Factory Tasks** Notion
|
|
254
|
+
data source. The generator uses `NOTION_API_KEY` for read-only data-source and
|
|
255
|
+
page-markdown requests, selects only rows whose `Status` is `Ready for Agent`,
|
|
256
|
+
and never updates a row or its status. `Labels` and `Route` values are combined
|
|
257
|
+
for repository issue labels. A repository row can supply a separately reviewed
|
|
258
|
+
`Public Summary`; Factory uses that text for a public lifecycle issue and never
|
|
259
|
+
copies the private page body. The output order is stable by page ID, so the same
|
|
260
|
+
database state produces the same manifest on every run.
|
|
261
|
+
|
|
262
|
+
```bash
|
|
263
|
+
factory intake notion generate \
|
|
264
|
+
--mount-root ../.integrations/notion \
|
|
265
|
+
--worker-mount-root .integrations/notion \
|
|
266
|
+
--worker-mount-transport relay-channel \
|
|
267
|
+
--state-path ../.factory/notion-intake-state.json \
|
|
268
|
+
> ./ops/notion-intake.json
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
`--data-source` can override the built-in Factory Tasks data source ID. Paths in
|
|
272
|
+
the generated manifest retain the existing intake semantics: `mountRoot` and
|
|
273
|
+
`statePath` are resolved relative to the saved manifest, while
|
|
274
|
+
`workerMountRoot` is the path workers receive. Generation fails closed if there
|
|
275
|
+
are no ready rows, a required property is missing, a row sets both (or neither)
|
|
276
|
+
of `Repo` and `Project Path`, or Notion returns a truncated page body.
|
|
277
|
+
|
|
224
278
|
```json
|
|
225
279
|
{
|
|
226
280
|
"version": 1,
|
|
@@ -555,13 +609,21 @@ as local processes.
|
|
|
555
609
|
|
|
556
610
|
The supported topology for the **CLI control plane** is one Factory host per
|
|
557
611
|
workspace, with any number of relay execution nodes. Multiple Factory processes
|
|
558
|
-
|
|
612
|
+
that open the same state file do not mutate it concurrently: `FileStateStore`
|
|
613
|
+
holds a cross-process filesystem lock around the complete read/modify/write,
|
|
614
|
+
so a second process waits, reloads after it acquires the lock, and then publishes
|
|
615
|
+
through fsync plus atomic rename. The in-process operation queue alone is not
|
|
616
|
+
the cross-process fence.
|
|
559
617
|
Active/active CLI control planes on different hosts remain intentionally
|
|
560
618
|
unsupported: separate local state files cannot provide a truthful cross-host
|
|
561
619
|
fence.
|
|
562
620
|
|
|
563
621
|
### Hosting the control plane in Cloud
|
|
564
622
|
|
|
623
|
+
Embedded CLI hosts can inject durable coordination storage through the
|
|
624
|
+
host-neutral [`WatchStateDocumentStore` port](docs/document-state-store.md)
|
|
625
|
+
via `stateStoreFactory`.
|
|
626
|
+
|
|
565
627
|
`@agent-relay/factory/hosted` is the worker-safe control-plane entrypoint. It
|
|
566
628
|
contains no Node filesystem/process dependency and runs the complete sweep:
|
|
567
629
|
|
|
@@ -645,13 +707,45 @@ abandoned so a restart cannot respawn it:
|
|
|
645
707
|
}
|
|
646
708
|
```
|
|
647
709
|
|
|
710
|
+
### Recover names created before dispatch identity proofs
|
|
711
|
+
|
|
712
|
+
Factory stamps every dispatched agent with a stable broker identity derived from
|
|
713
|
+
the provider-native issue identity and role. For example, the reviewer for
|
|
714
|
+
`AgentWorkforce/factory#244` uses
|
|
715
|
+
`factory:dispatch:v1:github:agentworkforce/factory#244:reviewer`. A retry of that
|
|
716
|
+
work unit can reclaim its deterministic agent name after a crash, while another
|
|
717
|
+
repository's issue 244 cannot.
|
|
718
|
+
|
|
719
|
+
Agent records created before this behavior have no identity stamp and cannot be
|
|
720
|
+
reclaimed automatically. This includes the burned `ar-244-review-factory` seat
|
|
721
|
+
and any `ar-244-impl-factory` / `ar-244-babysit-factory` siblings created by the
|
|
722
|
+
same pre-fix dispatch. After verifying the named process is no longer live, run
|
|
723
|
+
the broker's guarded, one-time legacy recovery for each affected name. The
|
|
724
|
+
workspace key and Relaycast base URL use their normal environment variables;
|
|
725
|
+
the raw proof is supplied only through the environment and is never placed on
|
|
726
|
+
the command line:
|
|
727
|
+
|
|
728
|
+
```bash
|
|
729
|
+
BROKER_BIN="$(node --input-type=module -e \
|
|
730
|
+
"import { getBrokerBinaryPath } from '@agent-relay/harness-driver/broker-path'; const p = getBrokerBinaryPath(); if (!p) process.exit(1); process.stdout.write(p)")"
|
|
731
|
+
|
|
732
|
+
RELAY_AGENT_IDENTITY_KEY='factory:dispatch:v1:github:agentworkforce/factory#244:reviewer' \
|
|
733
|
+
"$BROKER_BIN" reclaim-legacy-identity ar-244-review-factory
|
|
734
|
+
```
|
|
735
|
+
|
|
736
|
+
Use the matching role suffix (`implementer`, `reviewer`, or `babysitter`) for
|
|
737
|
+
each sibling. Recovery refuses a live record, a record that already has an
|
|
738
|
+
identity stamp, or a concurrent competing claim; it does not weaken ordinary
|
|
739
|
+
collision checks. Once stamped, the next Factory retry presents the same proof
|
|
740
|
+
and reclaims normally.
|
|
741
|
+
|
|
648
742
|
The full schema — every field and default — is validated by Zod at load time, so
|
|
649
743
|
an invalid config fails fast with a field-level error. See
|
|
650
744
|
[`src/config/schema.ts`](src/config/schema.ts) for the authoritative reference,
|
|
651
745
|
and [`test/fixtures/factory.config.json`](test/fixtures/factory.config.json) for a
|
|
652
746
|
worked example (including offline fixture mode).
|
|
653
747
|
|
|
654
|
-
Factory
|
|
748
|
+
Factory GitHub write attribution is controlled explicitly with `github.identity`:
|
|
655
749
|
|
|
656
750
|
```jsonc
|
|
657
751
|
{
|
|
@@ -661,19 +755,27 @@ Factory PR authorship is controlled explicitly with `github.identity`:
|
|
|
661
755
|
}
|
|
662
756
|
```
|
|
663
757
|
|
|
664
|
-
- `"app"`
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
758
|
+
- `"app"` publishes pull requests and performs GitHub issue lifecycle writes
|
|
759
|
+
through the connected workspace GitHub App. Status transitions provision the
|
|
760
|
+
target Factory label, add only that label, and remove only the prior Factory
|
|
761
|
+
label, so labels applied by people are never replaced from a stale mount
|
|
762
|
+
projection. If any required write capability is unavailable, Factory fails
|
|
763
|
+
loudly and never falls back to a personal account.
|
|
764
|
+
- `"user"` publishes pull requests and performs issue lifecycle writes with the
|
|
765
|
+
account authenticated by the local `gh` CLI, even when the app path is
|
|
766
|
+
available.
|
|
767
|
+
- `"auto"` is the default and preserves compatibility: pull requests prefer the
|
|
768
|
+
App path and fall back to the local `gh` user, while issue comments, status
|
|
769
|
+
labels, and issue closure retain the local `gh` path.
|
|
671
770
|
|
|
672
771
|
Each successful publication log includes `identity` (`app` or `user`) and the
|
|
673
|
-
confirmed `author`.
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
772
|
+
confirmed `author`. App writes are not reported complete until the connected
|
|
773
|
+
mount acknowledges the provider mutation. Provider-authoritative issue reads
|
|
774
|
+
remain optional on the writeback interface; when unavailable, their existing
|
|
775
|
+
call sites keep their conservative fallback behavior.
|
|
776
|
+
|
|
777
|
+
This identity setting does not change Notion intake's separate GitHub issue
|
|
778
|
+
publisher, which still requires local `gh` authentication when enabled.
|
|
677
779
|
|
|
678
780
|
Authenticated Factory progress reporting is enabled by default for real CLI
|
|
679
781
|
sessions. Factory sends privacy-bounded lifecycle events, worker ownership,
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { TerminalDispatchLifecyclePhase } from '../ports/state.js';
|
|
2
|
+
import type { DispatchResult, IterationReport } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Process exit codes for the `factory` CLI.
|
|
5
|
+
*
|
|
6
|
+
* The contract is deliberately narrow: `OK` means *the requested action was
|
|
7
|
+
* performed*. Every other value means it was not. A supervising loop, cron
|
|
8
|
+
* entry, or CI step that only reads `$?` must be able to tell a refusal from a
|
|
9
|
+
* completed run — printing a good diagnostic to stderr does not help a caller
|
|
10
|
+
* that never reads stderr.
|
|
11
|
+
*
|
|
12
|
+
* `REFUSED` and `RETRYABLE` split the refusals along the one axis a caller can
|
|
13
|
+
* act on: whether repeating the identical command could ever succeed.
|
|
14
|
+
*/
|
|
15
|
+
export declare const FACTORY_EXIT: {
|
|
16
|
+
/** The requested action was performed. */
|
|
17
|
+
readonly OK: 0;
|
|
18
|
+
/** The command failed. The default for a thrown error with no finer classification. */
|
|
19
|
+
readonly FAILED: 1;
|
|
20
|
+
/**
|
|
21
|
+
* Deliberately refused. Repeating the identical command will refuse again
|
|
22
|
+
* until an input, a config value, or a credential changes.
|
|
23
|
+
*/
|
|
24
|
+
readonly REFUSED: 2;
|
|
25
|
+
/**
|
|
26
|
+
* Not performed this time, but the same command may succeed later — a lost
|
|
27
|
+
* writeback race, or a capacity/dependency hold that clears on its own.
|
|
28
|
+
*/
|
|
29
|
+
readonly RETRYABLE: 3;
|
|
30
|
+
};
|
|
31
|
+
export type FactoryExitCode = (typeof FACTORY_EXIT)[keyof typeof FACTORY_EXIT];
|
|
32
|
+
/**
|
|
33
|
+
* Classify a thrown command failure.
|
|
34
|
+
*
|
|
35
|
+
* A mount scope shortfall is terminal until the operator re-authenticates with
|
|
36
|
+
* a session that can mint the filesystem scopes, so it is `REFUSED`. A live
|
|
37
|
+
* dispatch state change means another writer won the race for the same issue;
|
|
38
|
+
* the work unit is still there and the next attempt may win, so it is
|
|
39
|
+
* `RETRYABLE`. Everything else is an unclassified failure.
|
|
40
|
+
*/
|
|
41
|
+
export declare function exitCodeForError(error: unknown): FactoryExitCode;
|
|
42
|
+
/**
|
|
43
|
+
* Classify the outcome of a single-issue `factory dispatch`.
|
|
44
|
+
*
|
|
45
|
+
* A dry run's requested action is the dry run itself, so it is always `OK`. For
|
|
46
|
+
* a real dispatch the only success is at least one spawned agent: a hold, a
|
|
47
|
+
* queue, or an escalation all leave the issue exactly where it was.
|
|
48
|
+
*/
|
|
49
|
+
export declare function exitCodeForDispatchResult(result: DispatchResult): FactoryExitCode;
|
|
50
|
+
/**
|
|
51
|
+
* Classify a relay-backend dispatch, which stays attached from placement
|
|
52
|
+
* through takeover, publication, writeback and release.
|
|
53
|
+
*
|
|
54
|
+
* The pre-wait result cannot classify such a run. A dispatch that hits capacity
|
|
55
|
+
* returns an empty capacity-hold result *and* schedules a durable retry, and
|
|
56
|
+
* the wait then runs on until that retry reaches terminal. Classifying the
|
|
57
|
+
* stale result would report failure for a run that ultimately did dispatch —
|
|
58
|
+
* the same false signal as exiting 0 on a refusal, pointed the other way. The
|
|
59
|
+
* terminal phase is the outcome.
|
|
60
|
+
*/
|
|
61
|
+
export declare function exitCodeForRelayDispatch(result: DispatchResult, terminalPhase: TerminalDispatchLifecyclePhase | undefined): FactoryExitCode;
|
|
62
|
+
/**
|
|
63
|
+
* Classify the outcome of a `factory run-once` / `factory loop` iteration.
|
|
64
|
+
*
|
|
65
|
+
* `skipped` entries are ordinary: a sweep that examines issues and dispatches
|
|
66
|
+
* none of them still did what it was asked. A recorded `error` is a failed
|
|
67
|
+
* cycle, and a deferred discovery means the sweep never ran at all.
|
|
68
|
+
*/
|
|
69
|
+
export declare function exitCodeForIterationReport(report: IterationReport): FactoryExitCode;
|
|
70
|
+
/**
|
|
71
|
+
* Collapse a bounded loop's iteration reports into one exit code.
|
|
72
|
+
*
|
|
73
|
+
* A failed iteration means the loop did not complete cleanly and a caller
|
|
74
|
+
* reading only `$?` has to see that. A *deferred* iteration does not: the loop
|
|
75
|
+
* was asked to run several sweeps, and another owner holding the sweep for one
|
|
76
|
+
* of them is ordinary contention, not a refusal. Escalating that would make a
|
|
77
|
+
* healthy loop exit non-zero — the same defect as exiting 0 on a refusal, just
|
|
78
|
+
* pointed the other way.
|
|
79
|
+
*/
|
|
80
|
+
export declare function exitCodeForLoopReports(reports: readonly IterationReport[]): FactoryExitCode;
|
|
81
|
+
//# sourceMappingURL=exit-codes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exit-codes.d.ts","sourceRoot":"","sources":["../../src/cli/exit-codes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,gBAAgB,CAAA;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAE/D;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,YAAY;IACvB,0CAA0C;;IAE1C,uFAAuF;;IAEvF;;;OAGG;;IAEH;;;OAGG;;CAEK,CAAA;AAEV,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAA;AAE9E;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,CAIhE;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,cAAc,GAAG,eAAe,CAOjF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,cAAc,EACtB,aAAa,EAAE,8BAA8B,GAAG,SAAS,GACxD,eAAe,CAOjB;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,eAAe,GAAG,eAAe,CAInF;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,GAAG,eAAe,CAU3F"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { MountAuthScopeError } from '../mount/mount-auth-error.js';
|
|
2
|
+
import { isLiveDispatchStateChangedError } from '../orchestrator/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Process exit codes for the `factory` CLI.
|
|
5
|
+
*
|
|
6
|
+
* The contract is deliberately narrow: `OK` means *the requested action was
|
|
7
|
+
* performed*. Every other value means it was not. A supervising loop, cron
|
|
8
|
+
* entry, or CI step that only reads `$?` must be able to tell a refusal from a
|
|
9
|
+
* completed run — printing a good diagnostic to stderr does not help a caller
|
|
10
|
+
* that never reads stderr.
|
|
11
|
+
*
|
|
12
|
+
* `REFUSED` and `RETRYABLE` split the refusals along the one axis a caller can
|
|
13
|
+
* act on: whether repeating the identical command could ever succeed.
|
|
14
|
+
*/
|
|
15
|
+
export const FACTORY_EXIT = {
|
|
16
|
+
/** The requested action was performed. */
|
|
17
|
+
OK: 0,
|
|
18
|
+
/** The command failed. The default for a thrown error with no finer classification. */
|
|
19
|
+
FAILED: 1,
|
|
20
|
+
/**
|
|
21
|
+
* Deliberately refused. Repeating the identical command will refuse again
|
|
22
|
+
* until an input, a config value, or a credential changes.
|
|
23
|
+
*/
|
|
24
|
+
REFUSED: 2,
|
|
25
|
+
/**
|
|
26
|
+
* Not performed this time, but the same command may succeed later — a lost
|
|
27
|
+
* writeback race, or a capacity/dependency hold that clears on its own.
|
|
28
|
+
*/
|
|
29
|
+
RETRYABLE: 3,
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Classify a thrown command failure.
|
|
33
|
+
*
|
|
34
|
+
* A mount scope shortfall is terminal until the operator re-authenticates with
|
|
35
|
+
* a session that can mint the filesystem scopes, so it is `REFUSED`. A live
|
|
36
|
+
* dispatch state change means another writer won the race for the same issue;
|
|
37
|
+
* the work unit is still there and the next attempt may win, so it is
|
|
38
|
+
* `RETRYABLE`. Everything else is an unclassified failure.
|
|
39
|
+
*/
|
|
40
|
+
export function exitCodeForError(error) {
|
|
41
|
+
if (error instanceof MountAuthScopeError)
|
|
42
|
+
return FACTORY_EXIT.REFUSED;
|
|
43
|
+
if (isLiveDispatchStateChangedError(error))
|
|
44
|
+
return FACTORY_EXIT.RETRYABLE;
|
|
45
|
+
return FACTORY_EXIT.FAILED;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Classify the outcome of a single-issue `factory dispatch`.
|
|
49
|
+
*
|
|
50
|
+
* A dry run's requested action is the dry run itself, so it is always `OK`. For
|
|
51
|
+
* a real dispatch the only success is at least one spawned agent: a hold, a
|
|
52
|
+
* queue, or an escalation all leave the issue exactly where it was.
|
|
53
|
+
*/
|
|
54
|
+
export function exitCodeForDispatchResult(result) {
|
|
55
|
+
if (result.dryRun)
|
|
56
|
+
return FACTORY_EXIT.OK;
|
|
57
|
+
if (result.agents.length > 0)
|
|
58
|
+
return FACTORY_EXIT.OK;
|
|
59
|
+
// A capacity or dependency hold clears without anyone changing the request.
|
|
60
|
+
// A dependency *cycle* does not — it needs a human to break the cycle.
|
|
61
|
+
if (result.hold?.kind === 'capacity' || result.hold?.kind === 'dependency')
|
|
62
|
+
return FACTORY_EXIT.RETRYABLE;
|
|
63
|
+
return FACTORY_EXIT.REFUSED;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Classify a relay-backend dispatch, which stays attached from placement
|
|
67
|
+
* through takeover, publication, writeback and release.
|
|
68
|
+
*
|
|
69
|
+
* The pre-wait result cannot classify such a run. A dispatch that hits capacity
|
|
70
|
+
* returns an empty capacity-hold result *and* schedules a durable retry, and
|
|
71
|
+
* the wait then runs on until that retry reaches terminal. Classifying the
|
|
72
|
+
* stale result would report failure for a run that ultimately did dispatch —
|
|
73
|
+
* the same false signal as exiting 0 on a refusal, pointed the other way. The
|
|
74
|
+
* terminal phase is the outcome.
|
|
75
|
+
*/
|
|
76
|
+
export function exitCodeForRelayDispatch(result, terminalPhase) {
|
|
77
|
+
if (terminalPhase === 'complete')
|
|
78
|
+
return FACTORY_EXIT.OK;
|
|
79
|
+
if (terminalPhase === 'abandoned')
|
|
80
|
+
return FACTORY_EXIT.FAILED;
|
|
81
|
+
// No terminal phase was observed: either this dispatch never created a
|
|
82
|
+
// lifecycle row, or the wait ended because Factory is stopping. Nothing
|
|
83
|
+
// better is known than what the dispatch itself reported.
|
|
84
|
+
return exitCodeForDispatchResult(result);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Classify the outcome of a `factory run-once` / `factory loop` iteration.
|
|
88
|
+
*
|
|
89
|
+
* `skipped` entries are ordinary: a sweep that examines issues and dispatches
|
|
90
|
+
* none of them still did what it was asked. A recorded `error` is a failed
|
|
91
|
+
* cycle, and a deferred discovery means the sweep never ran at all.
|
|
92
|
+
*/
|
|
93
|
+
export function exitCodeForIterationReport(report) {
|
|
94
|
+
if (report.error)
|
|
95
|
+
return FACTORY_EXIT.FAILED;
|
|
96
|
+
if (report.discoveryDeferred)
|
|
97
|
+
return FACTORY_EXIT.RETRYABLE;
|
|
98
|
+
return FACTORY_EXIT.OK;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Collapse a bounded loop's iteration reports into one exit code.
|
|
102
|
+
*
|
|
103
|
+
* A failed iteration means the loop did not complete cleanly and a caller
|
|
104
|
+
* reading only `$?` has to see that. A *deferred* iteration does not: the loop
|
|
105
|
+
* was asked to run several sweeps, and another owner holding the sweep for one
|
|
106
|
+
* of them is ordinary contention, not a refusal. Escalating that would make a
|
|
107
|
+
* healthy loop exit non-zero — the same defect as exiting 0 on a refusal, just
|
|
108
|
+
* pointed the other way.
|
|
109
|
+
*/
|
|
110
|
+
export function exitCodeForLoopReports(reports) {
|
|
111
|
+
if (reports.some((report) => report.error))
|
|
112
|
+
return FACTORY_EXIT.FAILED;
|
|
113
|
+
// Losing ONE sweep to another owner is ordinary contention. Losing EVERY
|
|
114
|
+
// sweep means the loop performed nothing at all — a shared daemon can hold
|
|
115
|
+
// the workspace sweep lease for the loop's whole duration — and reporting
|
|
116
|
+
// that as success is the exact false signal this contract exists to remove.
|
|
117
|
+
if (reports.length > 0 && reports.every((report) => report.discoveryDeferred)) {
|
|
118
|
+
return FACTORY_EXIT.RETRYABLE;
|
|
119
|
+
}
|
|
120
|
+
return FACTORY_EXIT.OK;
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=exit-codes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exit-codes.js","sourceRoot":"","sources":["../../src/cli/exit-codes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAC/D,OAAO,EAAE,+BAA+B,EAAE,MAAM,iBAAiB,CAAA;AAIjE;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,0CAA0C;IAC1C,EAAE,EAAE,CAAC;IACL,uFAAuF;IACvF,MAAM,EAAE,CAAC;IACT;;;OAGG;IACH,OAAO,EAAE,CAAC;IACV;;;OAGG;IACH,SAAS,EAAE,CAAC;CACJ,CAAA;AAIV;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,IAAI,KAAK,YAAY,mBAAmB;QAAE,OAAO,YAAY,CAAC,OAAO,CAAA;IACrE,IAAI,+BAA+B,CAAC,KAAK,CAAC;QAAE,OAAO,YAAY,CAAC,SAAS,CAAA;IACzE,OAAO,YAAY,CAAC,MAAM,CAAA;AAC5B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,yBAAyB,CAAC,MAAsB;IAC9D,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,YAAY,CAAC,EAAE,CAAA;IACzC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,YAAY,CAAC,EAAE,CAAA;IACpD,4EAA4E;IAC5E,uEAAuE;IACvE,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,KAAK,UAAU,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,KAAK,YAAY;QAAE,OAAO,YAAY,CAAC,SAAS,CAAA;IACzG,OAAO,YAAY,CAAC,OAAO,CAAA;AAC7B,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,wBAAwB,CACtC,MAAsB,EACtB,aAAyD;IAEzD,IAAI,aAAa,KAAK,UAAU;QAAE,OAAO,YAAY,CAAC,EAAE,CAAA;IACxD,IAAI,aAAa,KAAK,WAAW;QAAE,OAAO,YAAY,CAAC,MAAM,CAAA;IAC7D,uEAAuE;IACvE,wEAAwE;IACxE,0DAA0D;IAC1D,OAAO,yBAAyB,CAAC,MAAM,CAAC,CAAA;AAC1C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,0BAA0B,CAAC,MAAuB;IAChE,IAAI,MAAM,CAAC,KAAK;QAAE,OAAO,YAAY,CAAC,MAAM,CAAA;IAC5C,IAAI,MAAM,CAAC,iBAAiB;QAAE,OAAO,YAAY,CAAC,SAAS,CAAA;IAC3D,OAAO,YAAY,CAAC,EAAE,CAAA;AACxB,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAmC;IACxE,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC;QAAE,OAAO,YAAY,CAAC,MAAM,CAAA;IACtE,yEAAyE;IACzE,2EAA2E;IAC3E,0EAA0E;IAC1E,4EAA4E;IAC5E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC9E,OAAO,YAAY,CAAC,SAAS,CAAA;IAC/B,CAAC;IACD,OAAO,YAAY,CAAC,EAAE,CAAA;AACxB,CAAC"}
|
package/dist/cli/fleet.d.ts
CHANGED
|
@@ -3,12 +3,22 @@ import { type LocalClonePathOptions } from '../config/local-clone-paths.js';
|
|
|
3
3
|
import { createFactory, createFleet, ensureRelayBroker, reapFactoryEnvironmentsOnce, type Capability, type Factory, type FactoryEventReporter, type FactoryConfig, type FleetBackend, type FleetClient, type GhRunner, type FactoryStateResolution, type Logger, type LocalMountOptions, type MountClient, type ProbeCloser, type RelayfileCloudMountClientConfig, type ResolvedFactoryWorkspace } from '../index.js';
|
|
4
4
|
import { type CheckFeatureMapOptions, type FeatureMapCheckReport } from '../featuremap/index.js';
|
|
5
5
|
import type { FactoryIntegrationProvider } from '../ports/index.js';
|
|
6
|
+
import type { StateStore } from '../ports/state.js';
|
|
6
7
|
import { type FactoryVersionInfo, type FactoryVersionInfoOptions } from '../version-info.js';
|
|
7
|
-
import { type NotionIntakeClaimStore, type NotionContractPublisher } from '../intake/index.js';
|
|
8
|
-
|
|
8
|
+
import { type FactoryTasksNotionClient, type NotionIntakeClaimStore, type NotionContractPublisher } from '../intake/index.js';
|
|
9
|
+
export type CliStateStore = StateStore & {
|
|
10
|
+
/** Host readiness gate. The CLI invokes it before constructing Factory. */
|
|
11
|
+
assertReady(): Promise<void>;
|
|
12
|
+
/** Optional host-defined identifier included in status output. */
|
|
13
|
+
readonly backend?: string;
|
|
14
|
+
};
|
|
15
|
+
export type CliStateStoreFactory = (config: FactoryConfig) => Promise<CliStateStore> | CliStateStore;
|
|
16
|
+
export interface FleetCliDeps {
|
|
9
17
|
fleet?: FleetClient;
|
|
10
18
|
/** Hermetic credential environment for the relay backend (tests). */
|
|
11
19
|
env?: NodeJS.ProcessEnv;
|
|
20
|
+
/** Host-supplied durable state adapter; the file implementation remains the default. */
|
|
21
|
+
stateStoreFactory?: CliStateStoreFactory;
|
|
12
22
|
mount?: MountClient;
|
|
13
23
|
createFactory?: typeof createFactory;
|
|
14
24
|
createFleet?: typeof createFleet;
|
|
@@ -31,6 +41,10 @@ interface FleetCliDeps {
|
|
|
31
41
|
localClonePathOptions?: LocalClonePathOptions;
|
|
32
42
|
reporter?: FactoryEventReporter;
|
|
33
43
|
cloudSessionProvider?: (options?: Parameters<typeof ensureCloudSession>[0]) => Promise<CloudSession>;
|
|
44
|
+
/** Hermetic private hosted-token endpoint transport for CLI integration tests. */
|
|
45
|
+
cloudAccessTokenFetch?: typeof fetch;
|
|
46
|
+
/** Hermetic Cloud telemetry transport for CLI integration tests. */
|
|
47
|
+
cloudReporterFetch?: typeof fetch;
|
|
34
48
|
isInteractive?: () => boolean;
|
|
35
49
|
confirmIntegrationConnect?: (provider: FactoryIntegrationProvider) => Promise<boolean>;
|
|
36
50
|
openIntegrationUrl?: (url: string) => void | Promise<void>;
|
|
@@ -39,6 +53,8 @@ interface FleetCliDeps {
|
|
|
39
53
|
notionContracts?: NotionContractPublisher;
|
|
40
54
|
/** Hermetic workspace-global Notion claim store for tests and alternate runtimes. */
|
|
41
55
|
notionClaims?: NotionIntakeClaimStore;
|
|
56
|
+
/** Hermetic Factory Tasks reader for manifest-generation tests and alternate runtimes. */
|
|
57
|
+
notionFactoryTasks?: FactoryTasksNotionClient;
|
|
42
58
|
/** Hermetic verification-environment sweep for CLI tests and alternate runtimes. */
|
|
43
59
|
reapEnvironments?: typeof reapFactoryEnvironmentsOnce;
|
|
44
60
|
/** Hermetic package/registry metadata for CLI tests and alternate runtimes. */
|
|
@@ -108,6 +124,13 @@ type ParsedCommand = {
|
|
|
108
124
|
} | {
|
|
109
125
|
kind: 'notion-intake';
|
|
110
126
|
manifestPath: string;
|
|
127
|
+
} | {
|
|
128
|
+
kind: 'notion-manifest';
|
|
129
|
+
dataSourceId?: string;
|
|
130
|
+
mountRoot?: string;
|
|
131
|
+
workerMountRoot?: string;
|
|
132
|
+
workerMountTransport?: 'local' | 'relay-channel';
|
|
133
|
+
statePath?: string;
|
|
111
134
|
};
|
|
112
135
|
export declare function runFleetCli(argv: string[], deps?: FleetCliDeps): Promise<number>;
|
|
113
136
|
export declare function parseFleetCommand(args: string[]): ParsedCommand;
|
|
@@ -118,6 +141,7 @@ export declare function parseGlobalOptions(argv: string[]): {
|
|
|
118
141
|
export declare function reportFactoryVersionDrift(provider: FleetCliDeps['versionInfo'], logger: Logger): Promise<void>;
|
|
119
142
|
export declare function formatLogArgs(args: unknown[]): string;
|
|
120
143
|
export declare function resolveBrokerConnectionPath(startCwd?: string, env?: NodeJS.ProcessEnv): string | undefined;
|
|
144
|
+
export declare function resolveFactoryBrokerConnectionPath(startCwd?: string, env?: NodeJS.ProcessEnv, requireDedicatedBroker?: boolean): string | undefined;
|
|
121
145
|
export type GithubIssueSelector = {
|
|
122
146
|
number: number;
|
|
123
147
|
repo?: string;
|
package/dist/cli/fleet.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fleet.d.ts","sourceRoot":"","sources":["../../src/cli/fleet.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,kBAAkB,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAG1E,OAAO,EAA6B,KAAK,qBAAqB,EAAE,MAAM,6BAA6B,CAAA;
|
|
1
|
+
{"version":3,"file":"fleet.d.ts","sourceRoot":"","sources":["../../src/cli/fleet.ts"],"names":[],"mappings":"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"}
|