@openrig/cli 0.4.3 → 0.4.4
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/daemon/assets/guidance/openrig-start.md +6 -0
- package/daemon/assets/plugins/openrig-core/skills/mission-slice-sop/SKILL.md +49 -21
- package/daemon/assets/plugins/openrig-core/skills/openrig-user/SKILL.md +12 -12
- package/daemon/dist/build-info.d.ts +12 -0
- package/daemon/dist/build-info.d.ts.map +1 -0
- package/daemon/dist/build-info.js +11 -0
- package/daemon/dist/build-info.js.map +1 -0
- package/daemon/dist/db/migrations/048_queue_item_evidence_ref.d.ts +18 -0
- package/daemon/dist/db/migrations/048_queue_item_evidence_ref.d.ts.map +1 -0
- package/daemon/dist/db/migrations/048_queue_item_evidence_ref.js +22 -0
- package/daemon/dist/db/migrations/048_queue_item_evidence_ref.js.map +1 -0
- package/daemon/dist/domain/feed/attention-aggregator.d.ts +31 -0
- package/daemon/dist/domain/feed/attention-aggregator.d.ts.map +1 -0
- package/daemon/dist/domain/feed/attention-aggregator.js +119 -0
- package/daemon/dist/domain/feed/attention-aggregator.js.map +1 -0
- package/daemon/dist/domain/files/file-write-service.d.ts +11 -2
- package/daemon/dist/domain/files/file-write-service.d.ts.map +1 -1
- package/daemon/dist/domain/files/file-write-service.js +77 -0
- package/daemon/dist/domain/files/file-write-service.js.map +1 -1
- package/daemon/dist/domain/hosts/fanout-contract.d.ts +33 -0
- package/daemon/dist/domain/hosts/fanout-contract.d.ts.map +1 -0
- package/daemon/dist/domain/hosts/fanout-contract.js +23 -0
- package/daemon/dist/domain/hosts/fanout-contract.js.map +1 -0
- package/daemon/dist/domain/hosts/hosts-registry-reader.d.ts +49 -0
- package/daemon/dist/domain/hosts/hosts-registry-reader.d.ts.map +1 -0
- package/daemon/dist/domain/hosts/hosts-registry-reader.js +165 -0
- package/daemon/dist/domain/hosts/hosts-registry-reader.js.map +1 -0
- package/daemon/dist/domain/hosts/remote-daemon-http.d.ts +35 -0
- package/daemon/dist/domain/hosts/remote-daemon-http.d.ts.map +1 -0
- package/daemon/dist/domain/hosts/remote-daemon-http.js +105 -0
- package/daemon/dist/domain/hosts/remote-daemon-http.js.map +1 -0
- package/daemon/dist/domain/human-route-enforcer.d.ts +71 -0
- package/daemon/dist/domain/human-route-enforcer.d.ts.map +1 -0
- package/daemon/dist/domain/human-route-enforcer.js +80 -0
- package/daemon/dist/domain/human-route-enforcer.js.map +1 -0
- package/daemon/dist/domain/mission-control/audit-browse.d.ts +8 -0
- package/daemon/dist/domain/mission-control/audit-browse.d.ts.map +1 -1
- package/daemon/dist/domain/mission-control/audit-browse.js +19 -0
- package/daemon/dist/domain/mission-control/audit-browse.js.map +1 -1
- package/daemon/dist/domain/mission-control/mission-control-action-log.d.ts +1 -1
- package/daemon/dist/domain/mission-control/mission-control-action-log.d.ts.map +1 -1
- package/daemon/dist/domain/mission-control/mission-control-action-log.js +4 -0
- package/daemon/dist/domain/mission-control/mission-control-action-log.js.map +1 -1
- package/daemon/dist/domain/mission-control/mission-control-fleet-cli-capability.js +1 -1
- package/daemon/dist/domain/mission-control/mission-control-fleet-cli-capability.js.map +1 -1
- package/daemon/dist/domain/mission-control/mission-control-read-layer.js +1 -1
- package/daemon/dist/domain/mission-control/mission-control-read-layer.js.map +1 -1
- package/daemon/dist/domain/mission-control/mission-control-write-contract.d.ts +28 -0
- package/daemon/dist/domain/mission-control/mission-control-write-contract.d.ts.map +1 -1
- package/daemon/dist/domain/mission-control/mission-control-write-contract.js +125 -0
- package/daemon/dist/domain/mission-control/mission-control-write-contract.js.map +1 -1
- package/daemon/dist/domain/ps-projection.d.ts +28 -1
- package/daemon/dist/domain/ps-projection.d.ts.map +1 -1
- package/daemon/dist/domain/ps-projection.js +39 -0
- package/daemon/dist/domain/ps-projection.js.map +1 -1
- package/daemon/dist/domain/queue-repository.d.ts +25 -1
- package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
- package/daemon/dist/domain/queue-repository.js +111 -7
- package/daemon/dist/domain/queue-repository.js.map +1 -1
- package/daemon/dist/domain/review/brief-spine.d.ts +19 -0
- package/daemon/dist/domain/review/brief-spine.d.ts.map +1 -0
- package/daemon/dist/domain/review/brief-spine.js +86 -0
- package/daemon/dist/domain/review/brief-spine.js.map +1 -0
- package/daemon/dist/domain/review/compose.d.ts +228 -0
- package/daemon/dist/domain/review/compose.d.ts.map +1 -0
- package/daemon/dist/domain/review/compose.js +773 -0
- package/daemon/dist/domain/review/compose.js.map +1 -0
- package/daemon/dist/domain/review/freeze.d.ts +31 -0
- package/daemon/dist/domain/review/freeze.d.ts.map +1 -0
- package/daemon/dist/domain/review/freeze.js +257 -0
- package/daemon/dist/domain/review/freeze.js.map +1 -0
- package/daemon/dist/domain/review/gather.d.ts +100 -0
- package/daemon/dist/domain/review/gather.d.ts.map +1 -0
- package/daemon/dist/domain/review/gather.js +676 -0
- package/daemon/dist/domain/review/gather.js.map +1 -0
- package/daemon/dist/domain/review/types.d.ts +258 -0
- package/daemon/dist/domain/review/types.d.ts.map +1 -0
- package/daemon/dist/domain/review/types.js +35 -0
- package/daemon/dist/domain/review/types.js.map +1 -0
- package/daemon/dist/domain/scope/scope-approve.d.ts +64 -0
- package/daemon/dist/domain/scope/scope-approve.d.ts.map +1 -0
- package/daemon/dist/domain/scope/scope-approve.js +153 -0
- package/daemon/dist/domain/scope/scope-approve.js.map +1 -0
- package/daemon/dist/domain/scope/scope-audit.d.ts +9 -1
- package/daemon/dist/domain/scope/scope-audit.d.ts.map +1 -1
- package/daemon/dist/domain/scope/scope-audit.js +173 -1
- package/daemon/dist/domain/scope/scope-audit.js.map +1 -1
- package/daemon/dist/domain/topology/multi-rig-launcher.d.ts +49 -0
- package/daemon/dist/domain/topology/multi-rig-launcher.d.ts.map +1 -0
- package/daemon/dist/domain/topology/multi-rig-launcher.js +132 -0
- package/daemon/dist/domain/topology/multi-rig-launcher.js.map +1 -0
- package/daemon/dist/domain/topology/remote-up-leaf.d.ts +29 -0
- package/daemon/dist/domain/topology/remote-up-leaf.d.ts.map +1 -0
- package/daemon/dist/domain/topology/remote-up-leaf.js +60 -0
- package/daemon/dist/domain/topology/remote-up-leaf.js.map +1 -0
- package/daemon/dist/domain/topology/topology-manifest.d.ts +34 -0
- package/daemon/dist/domain/topology/topology-manifest.d.ts.map +1 -0
- package/daemon/dist/domain/topology/topology-manifest.js +195 -0
- package/daemon/dist/domain/topology/topology-manifest.js.map +1 -0
- package/daemon/dist/domain/types.d.ts +5 -0
- package/daemon/dist/domain/types.d.ts.map +1 -1
- package/daemon/dist/domain/types.js.map +1 -1
- package/daemon/dist/domain/up-command-router.d.ts +1 -1
- package/daemon/dist/domain/up-command-router.d.ts.map +1 -1
- package/daemon/dist/domain/up-command-router.js +34 -2
- package/daemon/dist/domain/up-command-router.js.map +1 -1
- package/daemon/dist/domain/user-settings/settings-store.d.ts +17 -0
- package/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -1
- package/daemon/dist/domain/user-settings/settings-store.js +109 -0
- package/daemon/dist/domain/user-settings/settings-store.js.map +1 -1
- package/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts.map +1 -1
- package/daemon/dist/domain/workspace/default-workspace-scaffold.js +51 -6
- package/daemon/dist/domain/workspace/default-workspace-scaffold.js.map +1 -1
- package/daemon/dist/domain/workspace/workspace-doctor.d.ts +11 -0
- package/daemon/dist/domain/workspace/workspace-doctor.d.ts.map +1 -1
- package/daemon/dist/domain/workspace/workspace-doctor.js +82 -0
- package/daemon/dist/domain/workspace/workspace-doctor.js.map +1 -1
- package/daemon/dist/routes/config.d.ts.map +1 -1
- package/daemon/dist/routes/config.js +15 -6
- package/daemon/dist/routes/config.js.map +1 -1
- package/daemon/dist/routes/files.d.ts.map +1 -1
- package/daemon/dist/routes/files.js +45 -1
- package/daemon/dist/routes/files.js.map +1 -1
- package/daemon/dist/routes/mission-control.d.ts.map +1 -1
- package/daemon/dist/routes/mission-control.js +67 -2
- package/daemon/dist/routes/mission-control.js.map +1 -1
- package/daemon/dist/routes/queue.d.ts +8 -2
- package/daemon/dist/routes/queue.d.ts.map +1 -1
- package/daemon/dist/routes/queue.js +44 -4
- package/daemon/dist/routes/queue.js.map +1 -1
- package/daemon/dist/routes/review.d.ts +3 -0
- package/daemon/dist/routes/review.d.ts.map +1 -0
- package/daemon/dist/routes/review.js +169 -0
- package/daemon/dist/routes/review.js.map +1 -0
- package/daemon/dist/routes/scope-approve.d.ts +3 -0
- package/daemon/dist/routes/scope-approve.d.ts.map +1 -0
- package/daemon/dist/routes/scope-approve.js +55 -0
- package/daemon/dist/routes/scope-approve.js.map +1 -0
- package/daemon/dist/routes/scope-audit.d.ts.map +1 -1
- package/daemon/dist/routes/scope-audit.js +28 -1
- package/daemon/dist/routes/scope-audit.js.map +1 -1
- package/daemon/dist/routes/slices.d.ts.map +1 -1
- package/daemon/dist/routes/slices.js +49 -9
- package/daemon/dist/routes/slices.js.map +1 -1
- package/daemon/dist/routes/terminal-ws.d.ts.map +1 -1
- package/daemon/dist/routes/terminal-ws.js +58 -21
- package/daemon/dist/routes/terminal-ws.js.map +1 -1
- package/daemon/dist/routes/up.d.ts.map +1 -1
- package/daemon/dist/routes/up.js +84 -0
- package/daemon/dist/routes/up.js.map +1 -1
- package/daemon/dist/routes/workspace.js +2 -2
- package/daemon/dist/server.d.ts +1 -0
- package/daemon/dist/server.d.ts.map +1 -1
- package/daemon/dist/server.js +14 -1
- package/daemon/dist/server.js.map +1 -1
- package/daemon/dist/startup.d.ts.map +1 -1
- package/daemon/dist/startup.js +18 -3
- package/daemon/dist/startup.js.map +1 -1
- package/daemon/docs/reference/agent-startup-guide.md +1 -1
- package/daemon/docs/reference/product-factory-vps-runbook.md +132 -0
- package/daemon/docs/reference/sdlc-conventions.md +187 -0
- package/daemon/specs/agents/conveyor/builder/agent.yaml +1 -1
- package/daemon/specs/agents/conveyor/builder/guidance/role.md +1 -0
- package/daemon/specs/agents/conveyor/lead/agent.yaml +1 -1
- package/daemon/specs/agents/conveyor/lead/guidance/role.md +1 -0
- package/daemon/specs/agents/conveyor/planner/agent.yaml +1 -1
- package/daemon/specs/agents/conveyor/planner/guidance/role.md +1 -0
- package/daemon/specs/agents/conveyor/reviewer/agent.yaml +1 -1
- package/daemon/specs/agents/conveyor/reviewer/guidance/role.md +1 -0
- package/daemon/specs/agents/design/product-designer/agent.yaml +1 -1
- package/daemon/specs/agents/design/product-designer/guidance/role.md +1 -0
- package/daemon/specs/agents/development/implementer/agent.yaml +1 -1
- package/daemon/specs/agents/development/implementer/guidance/role.md +1 -0
- package/daemon/specs/agents/development/qa/agent.yaml +1 -1
- package/daemon/specs/agents/development/qa/guidance/role.md +1 -0
- package/daemon/specs/agents/orchestration/orchestrator/agent.yaml +1 -1
- package/daemon/specs/agents/orchestration/orchestrator/guidance/role.md +1 -0
- package/daemon/specs/agents/product-management/pm/agent.yaml +1 -0
- package/daemon/specs/agents/product-management/pm/guidance/role.md +13 -0
- package/daemon/specs/agents/review/independent-reviewer/agent.yaml +1 -1
- package/daemon/specs/agents/review/independent-reviewer/guidance/role.md +1 -0
- package/daemon/specs/agents/shared/agent.yaml +2 -0
- package/daemon/specs/agents/shared/skills/core/mission-slice-sop/SKILL.md +115 -0
- package/daemon/specs/agents/shared/skills/core/openrig-operator/SKILL.md +4 -4
- package/daemon/specs/agents/shared/skills/core/openrig-user/SKILL.md +69 -23
- package/daemon/specs/agents/shared/skills/pods/orchestration-team/SKILL.md +2 -2
- package/daemon/specs/rigs/focused/pm-team/CULTURE.md +4 -0
- package/daemon/specs/rigs/launch/kernel/agents/operator/agent/guidance/role.md +1 -1
- package/daemon/specs/rigs/launch/kernel/agents/operator/agent/startup/context.md +1 -1
- package/daemon/specs/rigs/preview/product-team/CULTURE.md +4 -0
- package/dist/build-info.d.ts +8 -0
- package/dist/build-info.d.ts.map +1 -0
- package/dist/build-info.js +11 -0
- package/dist/build-info.js.map +1 -0
- package/dist/commands/config-init-workspace.d.ts.map +1 -1
- package/dist/commands/config-init-workspace.js +20 -4
- package/dist/commands/config-init-workspace.js.map +1 -1
- package/dist/commands/doctor.js +2 -2
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/expand.js +1 -1
- package/dist/commands/expand.js.map +1 -1
- package/dist/commands/file.d.ts +7 -0
- package/dist/commands/file.d.ts.map +1 -0
- package/dist/commands/file.js +77 -0
- package/dist/commands/file.js.map +1 -0
- package/dist/commands/host.d.ts +34 -0
- package/dist/commands/host.d.ts.map +1 -0
- package/dist/commands/host.js +448 -0
- package/dist/commands/host.js.map +1 -0
- package/dist/commands/proof.d.ts +54 -0
- package/dist/commands/proof.d.ts.map +1 -0
- package/dist/commands/proof.js +311 -0
- package/dist/commands/proof.js.map +1 -0
- package/dist/commands/ps.d.ts +41 -7
- package/dist/commands/ps.d.ts.map +1 -1
- package/dist/commands/ps.js +343 -131
- package/dist/commands/ps.js.map +1 -1
- package/dist/commands/queue.d.ts.map +1 -1
- package/dist/commands/queue.js +76 -0
- package/dist/commands/queue.js.map +1 -1
- package/dist/commands/scope.d.ts.map +1 -1
- package/dist/commands/scope.js +140 -3
- package/dist/commands/scope.js.map +1 -1
- package/dist/commands/send.js +13 -4
- package/dist/commands/send.js.map +1 -1
- package/dist/commands/up.d.ts +2 -0
- package/dist/commands/up.d.ts.map +1 -1
- package/dist/commands/up.js +69 -2
- package/dist/commands/up.js.map +1 -1
- package/dist/commands/workspace.js +6 -6
- package/dist/commands/workspace.js.map +1 -1
- package/dist/config-store.d.ts +4 -0
- package/dist/config-store.d.ts.map +1 -1
- package/dist/config-store.js +68 -0
- package/dist/config-store.js.map +1 -1
- package/dist/cross-host-executor.d.ts +1 -0
- package/dist/cross-host-executor.d.ts.map +1 -1
- package/dist/cross-host-executor.js +4 -1
- package/dist/cross-host-executor.js.map +1 -1
- package/dist/daemon-lifecycle.d.ts.map +1 -1
- package/dist/daemon-lifecycle.js +4 -1
- package/dist/daemon-lifecycle.js.map +1 -1
- package/dist/host-registry.d.ts +9 -0
- package/dist/host-registry.d.ts.map +1 -1
- package/dist/host-registry.js +32 -2
- package/dist/host-registry.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/file-transfer.d.ts +89 -0
- package/dist/lib/file-transfer.d.ts.map +1 -0
- package/dist/lib/file-transfer.js +300 -0
- package/dist/lib/file-transfer.js.map +1 -0
- package/dist/lib/hosts/fanout-contract.d.ts +33 -0
- package/dist/lib/hosts/fanout-contract.d.ts.map +1 -0
- package/dist/lib/hosts/fanout-contract.js +23 -0
- package/dist/lib/hosts/fanout-contract.js.map +1 -0
- package/dist/lib/scope/scope-audit.d.ts +9 -1
- package/dist/lib/scope/scope-audit.d.ts.map +1 -1
- package/dist/lib/scope/scope-audit.js +173 -1
- package/dist/lib/scope/scope-audit.js.map +1 -1
- package/dist/lib/scope/templates.d.ts +1 -0
- package/dist/lib/scope/templates.d.ts.map +1 -1
- package/dist/lib/scope/templates.js +9 -0
- package/dist/lib/scope/templates.js.map +1 -1
- package/dist/lib/scope-templates/backlog-deprecation.md +16 -0
- package/dist/lib/scope-templates/backlog-tech-debt.md +16 -0
- package/dist/lib/scope-templates/bug-fix.md +16 -0
- package/dist/lib/scope-templates/implementation-prd.md +33 -0
- package/dist/lib/scope-templates/mission-placeholder.md +1 -1
- package/dist/lib/scope-templates/mission-progress.md +1 -1
- package/dist/lib/scope-templates/mission-release.md +1 -1
- package/dist/lib/scope-templates/placeholder.md +11 -7
- package/dist/lib/scope-templates/proof.md +5 -1
- package/dist/lib/scope-templates/release-feature.md +14 -6
- package/dist/lib/scope-templates/research.md +16 -0
- package/dist/lib/scope-templates/slice-progress.md +1 -1
- package/dist/version.d.ts +5 -0
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +11 -1
- package/dist/version.js.map +1 -1
- package/package.json +1 -1
- package/ui/dist/assets/index-D69ZhNIr.js +598 -0
- package/ui/dist/assets/index-DJYun-8d.css +32 -0
- package/ui/dist/index.html +2 -2
- package/ui/dist/assets/index-DYZniQcc.js +0 -597
- package/ui/dist/assets/index-trcb4Yf_.css +0 -32
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-write-service.js","sourceRoot":"","sources":["../../../src/domain/files/file-write-service.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,EAAE;AACF,8DAA8D;AAC9D,uEAAuE;AACvE,qEAAqE;AACrE,iEAAiE;AACjE,sEAAsE;AACtE,EAAE;AACF,0BAA0B;AAC1B,kEAAkE;AAClE,2BAA2B;AAC3B,iEAAiE;AACjE,oEAAoE;AACpE,8DAA8D;AAC9D,2DAA2D;AAC3D,sEAAsE;AACtE,qEAAqE;AACrE,mEAAmE;AACnE,yCAAyC;AACzC,iEAAiE;AACjE,+CAA+C;AAC/C,EAAE;AACF,kEAAkE;AAClE,mEAAmE;AACnE,mDAAmD;AAEnD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAsB,MAAM,kBAAkB,CAAC;AA0B1E,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAEzB;IACA;IACA;IAHlB,YACkB,YAAoB,EACpB,kBAA0B,EAC1B,OAAgC;QAEhD,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAJlD,iBAAY,GAAZ,YAAY,CAAQ;QACpB,uBAAkB,GAAlB,kBAAkB,CAAQ;QAC1B,YAAO,GAAP,OAAO,CAAyB;QAGhD,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,KAAK;IAErB;IAEA;IAHlB,YACkB,
|
|
1
|
+
{"version":3,"file":"file-write-service.js","sourceRoot":"","sources":["../../../src/domain/files/file-write-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/** The local host's id literal in every P3/P4 payload (arch pin: defined
|
|
2
|
+
* ONCE here, imported everywhere, never retyped). Matches slice 11's
|
|
3
|
+
* topology aggregate literal. */
|
|
4
|
+
export declare const LOCAL_HOST_ID = "local";
|
|
5
|
+
/** CLOSED enum (arch pin A). `unsupported-transport` is R15-2's explicit
|
|
6
|
+
* class (an SSH-declared host is never a silently thinner payload);
|
|
7
|
+
* `auth-failed` is distinct from `unreachable` because the operator fix
|
|
8
|
+
* differs (rotate/set the bearer vs check the host). Extending this set =
|
|
9
|
+
* a cross-PRD contract change (slices 15 AND 21 re-review). */
|
|
10
|
+
export type PerHostStatusKind = "ok" | "unreachable" | "unsupported-transport" | "auth-failed";
|
|
11
|
+
export interface PerHostStatus {
|
|
12
|
+
hostId: string;
|
|
13
|
+
status: PerHostStatusKind;
|
|
14
|
+
/** Honest failure detail, rendered muted next to the host chip/row. */
|
|
15
|
+
error?: string;
|
|
16
|
+
/** ADDITIVE OPTIONAL detail (arch adjudication): the shipped CLI
|
|
17
|
+
* FailedStep vocabulary when a transport-level step classified the
|
|
18
|
+
* failure. Never load-bearing — `status` is the contract. */
|
|
19
|
+
failedStep?: string;
|
|
20
|
+
}
|
|
21
|
+
/** items + per-host status: EVERY subscribed host appears in `hosts` on
|
|
22
|
+
* EVERY payload — ok, unreachable, auth-failed, or unsupported-transport.
|
|
23
|
+
* Absence is a contract violation (omission-proof; never all-or-nothing,
|
|
24
|
+
* never silent thinning). */
|
|
25
|
+
export interface AggregatedPayload<T> {
|
|
26
|
+
items: T[];
|
|
27
|
+
hosts: PerHostStatus[];
|
|
28
|
+
}
|
|
29
|
+
/** Contract-level completeness predicate (arch pin B: asserted as near to
|
|
30
|
+
* the contract as tests allow): true iff every expected host id appears
|
|
31
|
+
* exactly once in the payload's hosts array. */
|
|
32
|
+
export declare function hostsCovered(payload: AggregatedPayload<unknown>, expectedHostIds: string[]): boolean;
|
|
33
|
+
//# sourceMappingURL=fanout-contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fanout-contract.d.ts","sourceRoot":"","sources":["../../../src/domain/hosts/fanout-contract.ts"],"names":[],"mappings":"AAUA;;kCAEkC;AAClC,eAAO,MAAM,aAAa,UAAU,CAAC;AAErC;;;;gEAIgE;AAChE,MAAM,MAAM,iBAAiB,GAAG,IAAI,GAAG,aAAa,GAAG,uBAAuB,GAAG,aAAa,CAAC;AAE/F,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,iBAAiB,CAAC;IAC1B,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;kEAE8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;8BAG8B;AAC9B,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB;AAED;;iDAEiD;AACjD,wBAAgB,YAAY,CAAC,OAAO,EAAE,iBAAiB,CAAC,OAAO,CAAC,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,OAAO,CAIpG"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// OPR.0.4.4.15 — THE shared intra-P4 fan-out payload contract.
|
|
2
|
+
//
|
|
3
|
+
// ONE contract for the whole P4 packet (arch adjudication 2026-07-05,
|
|
4
|
+
// cross-PRD interface cell): slice 15's aggregated For-You attention feed
|
|
5
|
+
// AND slice 21's `rig ps --all-hosts` rollup both speak AggregatedPayload —
|
|
6
|
+
// items plus a per-host structured status array. Slice 15 defines this
|
|
7
|
+
// module (first lander, per the whichever-builds-first rule named in both
|
|
8
|
+
// PRDs); slice 21 IMPORTS it. Any change here is a CROSS-PRD contract
|
|
9
|
+
// change requiring re-review of BOTH slices — never driver discretion.
|
|
10
|
+
/** The local host's id literal in every P3/P4 payload (arch pin: defined
|
|
11
|
+
* ONCE here, imported everywhere, never retyped). Matches slice 11's
|
|
12
|
+
* topology aggregate literal. */
|
|
13
|
+
export const LOCAL_HOST_ID = "local";
|
|
14
|
+
/** Contract-level completeness predicate (arch pin B: asserted as near to
|
|
15
|
+
* the contract as tests allow): true iff every expected host id appears
|
|
16
|
+
* exactly once in the payload's hosts array. */
|
|
17
|
+
export function hostsCovered(payload, expectedHostIds) {
|
|
18
|
+
const seen = new Map();
|
|
19
|
+
for (const h of payload.hosts)
|
|
20
|
+
seen.set(h.hostId, (seen.get(h.hostId) ?? 0) + 1);
|
|
21
|
+
return expectedHostIds.every((id) => seen.get(id) === 1) && payload.hosts.length === expectedHostIds.length;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=fanout-contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fanout-contract.js","sourceRoot":"","sources":["../../../src/domain/hosts/fanout-contract.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,EAAE;AACF,sEAAsE;AACtE,0EAA0E;AAC1E,4EAA4E;AAC5E,uEAAuE;AACvE,0EAA0E;AAC1E,sEAAsE;AACtE,uEAAuE;AAEvE;;kCAEkC;AAClC,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC;AA6BrC;;iDAEiD;AACjD,MAAM,UAAU,YAAY,CAAC,OAAmC,EAAE,eAAyB;IACzF,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,KAAK;QAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACjF,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,eAAe,CAAC,MAAM,CAAC;AAC9G,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export interface SshHostEntry {
|
|
2
|
+
id: string;
|
|
3
|
+
transport: "ssh";
|
|
4
|
+
target: string;
|
|
5
|
+
user?: string;
|
|
6
|
+
notes?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface HttpHostEntry {
|
|
9
|
+
id: string;
|
|
10
|
+
transport: "http";
|
|
11
|
+
url: string;
|
|
12
|
+
bearer_env?: string;
|
|
13
|
+
bearer_file?: string;
|
|
14
|
+
notes?: string;
|
|
15
|
+
}
|
|
16
|
+
export type HostEntry = SshHostEntry | HttpHostEntry;
|
|
17
|
+
export interface HostRegistry {
|
|
18
|
+
hosts: HostEntry[];
|
|
19
|
+
}
|
|
20
|
+
export type HostRegistryLoadResult = {
|
|
21
|
+
ok: true;
|
|
22
|
+
registry: HostRegistry;
|
|
23
|
+
} | {
|
|
24
|
+
ok: false;
|
|
25
|
+
error: string;
|
|
26
|
+
};
|
|
27
|
+
export type HostResolution = {
|
|
28
|
+
ok: true;
|
|
29
|
+
host: HostEntry;
|
|
30
|
+
} | {
|
|
31
|
+
ok: false;
|
|
32
|
+
error: string;
|
|
33
|
+
};
|
|
34
|
+
export declare function defaultHostRegistryPath(): string;
|
|
35
|
+
/** Load + validate the operator's hosts registry (read-only). Mirrors the CLI
|
|
36
|
+
* loader's error surfaces so operators see one vocabulary everywhere. */
|
|
37
|
+
export declare function loadHostRegistry(path?: string): HostRegistryLoadResult;
|
|
38
|
+
export declare function validateHostRegistry(parsed: unknown, sourcePath: string): HostRegistryLoadResult;
|
|
39
|
+
/** Resolve a host id for placement. Unknown id names the requested id and
|
|
40
|
+
* lists up to 10 known ids — the FR-4 per-entry validation message rides
|
|
41
|
+
* this (what/why/fix, before any launch attempt). */
|
|
42
|
+
export declare function resolveHost(registry: HostRegistry, id: string): HostResolution;
|
|
43
|
+
/** FR-4: placement requires a transport that can carry remote-up. v0 that is
|
|
44
|
+
* the http transport (the shipped remote single-rig leaf is POST /api/up
|
|
45
|
+
* over runRemoteHttpOp); ssh-transport hosts are reachable for send/capture
|
|
46
|
+
* but cannot carry remote-up — a structured per-entry error, not a launch
|
|
47
|
+
* attempt. */
|
|
48
|
+
export declare function resolvePlacementHost(registry: HostRegistry, id: string): HostResolution;
|
|
49
|
+
//# sourceMappingURL=hosts-registry-reader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hosts-registry-reader.d.ts","sourceRoot":"","sources":["../../../src/domain/hosts/hosts-registry-reader.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,KAAK,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,SAAS,GAAG,YAAY,GAAG,aAAa,CAAC;AAErD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAED,MAAM,MAAM,sBAAsB,GAC9B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,YAAY,CAAA;CAAE,GACpC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjC,MAAM,MAAM,cAAc,GACtB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAC7B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAIjC,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED;0EAC0E;AAC1E,wBAAgB,gBAAgB,CAAC,IAAI,GAAE,MAAkC,GAAG,sBAAsB,CAoBjG;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,sBAAsB,CAuFhG;AAED;;sDAEsD;AACtD,wBAAgB,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,GAAG,cAAc,CAW9E;AAED;;;;eAIe;AACf,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,GAAG,cAAc,CAUvF"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
// OPR.0.4.4.11 — the SHARED daemon-side hosts-registry read module (the P3/P4
|
|
2
|
+
// interface cell, pm-lead ruling c): P3 uses it for topology placement
|
|
3
|
+
// resolution + validation messages; P4's fan-out aggregation consumes the
|
|
4
|
+
// SAME module. Land once, here; P4 must not re-implement it.
|
|
5
|
+
//
|
|
6
|
+
// READ-ONLY FOREVER (arch ruling 3): the registry is operator-managed YAML at
|
|
7
|
+
// ~/.openrig/hosts.yaml; nothing in the daemon ever writes it. This module
|
|
8
|
+
// MIRRORS the CLI's packages/cli/src/host-registry.ts schema + validation
|
|
9
|
+
// (incl. the exactly-one-bearer rule) — the CLI copy is deliberately
|
|
10
|
+
// untouched this slice (no-unification boundary); the twin is held in sync by
|
|
11
|
+
// packages/daemon/test/hosts-registry-parity.test.ts, the same discipline as
|
|
12
|
+
// the scope-audit CLI/daemon twins.
|
|
13
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
14
|
+
import { parse as parseYaml } from "yaml";
|
|
15
|
+
import { getDefaultOpenRigPath } from "../../openrig-compat.js";
|
|
16
|
+
const KNOWN_TRANSPORTS = new Set(["ssh", "http"]);
|
|
17
|
+
export function defaultHostRegistryPath() {
|
|
18
|
+
return getDefaultOpenRigPath("hosts.yaml");
|
|
19
|
+
}
|
|
20
|
+
/** Load + validate the operator's hosts registry (read-only). Mirrors the CLI
|
|
21
|
+
* loader's error surfaces so operators see one vocabulary everywhere. */
|
|
22
|
+
export function loadHostRegistry(path = defaultHostRegistryPath()) {
|
|
23
|
+
if (!existsSync(path)) {
|
|
24
|
+
return {
|
|
25
|
+
ok: false,
|
|
26
|
+
error: `host registry not found at ${path}. Create it with a 'hosts:' array; transport: ssh (target + user) or http (url + bearer_env/bearer_file).`,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
let raw;
|
|
30
|
+
try {
|
|
31
|
+
raw = readFileSync(path, "utf-8");
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
return { ok: false, error: `failed to read host registry at ${path}: ${err.message}` };
|
|
35
|
+
}
|
|
36
|
+
let parsed;
|
|
37
|
+
try {
|
|
38
|
+
parsed = parseYaml(raw);
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
return { ok: false, error: `failed to parse host registry YAML at ${path}: ${err.message}` };
|
|
42
|
+
}
|
|
43
|
+
return validateHostRegistry(parsed, path);
|
|
44
|
+
}
|
|
45
|
+
export function validateHostRegistry(parsed, sourcePath) {
|
|
46
|
+
if (parsed === null || typeof parsed !== "object") {
|
|
47
|
+
return { ok: false, error: `host registry at ${sourcePath} must be a YAML object with a 'hosts' array` };
|
|
48
|
+
}
|
|
49
|
+
const obj = parsed;
|
|
50
|
+
const hosts = obj["hosts"];
|
|
51
|
+
if (!Array.isArray(hosts)) {
|
|
52
|
+
return { ok: false, error: `host registry at ${sourcePath}: 'hosts' must be an array` };
|
|
53
|
+
}
|
|
54
|
+
const seenIds = new Set();
|
|
55
|
+
const validated = [];
|
|
56
|
+
for (let i = 0; i < hosts.length; i++) {
|
|
57
|
+
const raw = hosts[i];
|
|
58
|
+
const prefix = `host registry at ${sourcePath}: hosts[${i}]`;
|
|
59
|
+
if (raw === null || typeof raw !== "object") {
|
|
60
|
+
return { ok: false, error: `${prefix}: must be an object with id/transport/target` };
|
|
61
|
+
}
|
|
62
|
+
const entry = raw;
|
|
63
|
+
const id = entry["id"];
|
|
64
|
+
if (typeof id !== "string" || id.trim() === "") {
|
|
65
|
+
return { ok: false, error: `${prefix}.id: required non-empty string` };
|
|
66
|
+
}
|
|
67
|
+
if (seenIds.has(id)) {
|
|
68
|
+
return { ok: false, error: `${prefix}.id: duplicate host id '${id}' (each host id must be unique within the registry)` };
|
|
69
|
+
}
|
|
70
|
+
seenIds.add(id);
|
|
71
|
+
const transport = entry["transport"];
|
|
72
|
+
if (typeof transport !== "string" || !KNOWN_TRANSPORTS.has(transport)) {
|
|
73
|
+
return {
|
|
74
|
+
ok: false,
|
|
75
|
+
error: `${prefix}.transport: must be one of ${[...KNOWN_TRANSPORTS].sort().join(", ")} (got ${JSON.stringify(transport)})`,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
const notes = entry["notes"];
|
|
79
|
+
if (notes !== undefined && typeof notes !== "string") {
|
|
80
|
+
return { ok: false, error: `${prefix}.notes: optional, but if present must be a string` };
|
|
81
|
+
}
|
|
82
|
+
if (transport === "ssh") {
|
|
83
|
+
const target = entry["target"];
|
|
84
|
+
if (typeof target !== "string" || target.trim() === "") {
|
|
85
|
+
return { ok: false, error: `${prefix}.target: required non-empty string (an ssh target)` };
|
|
86
|
+
}
|
|
87
|
+
const user = entry["user"];
|
|
88
|
+
if (user !== undefined && (typeof user !== "string" || user.trim() === "")) {
|
|
89
|
+
return { ok: false, error: `${prefix}.user: optional, but if present must be a non-empty string` };
|
|
90
|
+
}
|
|
91
|
+
validated.push({
|
|
92
|
+
id,
|
|
93
|
+
transport: "ssh",
|
|
94
|
+
target,
|
|
95
|
+
...(user !== undefined ? { user: user } : {}),
|
|
96
|
+
...(notes !== undefined ? { notes: notes } : {}),
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
else if (transport === "http") {
|
|
100
|
+
const url = entry["url"];
|
|
101
|
+
if (typeof url !== "string" || url.trim() === "") {
|
|
102
|
+
return { ok: false, error: `${prefix}.url: required non-empty string (the remote daemon's base URL)` };
|
|
103
|
+
}
|
|
104
|
+
const bearerEnv = entry["bearer_env"];
|
|
105
|
+
const bearerFile = entry["bearer_file"];
|
|
106
|
+
const hasEnv = bearerEnv !== undefined;
|
|
107
|
+
const hasFile = bearerFile !== undefined;
|
|
108
|
+
if (!hasEnv && !hasFile) {
|
|
109
|
+
return { ok: false, error: `${prefix}: http transport requires exactly one of bearer_env or bearer_file` };
|
|
110
|
+
}
|
|
111
|
+
if (hasEnv && hasFile) {
|
|
112
|
+
return { ok: false, error: `${prefix}: specify exactly one of bearer_env or bearer_file, not both` };
|
|
113
|
+
}
|
|
114
|
+
if (hasEnv && (typeof bearerEnv !== "string" || bearerEnv.trim() === "")) {
|
|
115
|
+
return { ok: false, error: `${prefix}.bearer_env: must be a non-empty env var name` };
|
|
116
|
+
}
|
|
117
|
+
if (hasFile && (typeof bearerFile !== "string" || bearerFile.trim() === "")) {
|
|
118
|
+
return { ok: false, error: `${prefix}.bearer_file: must be a non-empty file path` };
|
|
119
|
+
}
|
|
120
|
+
validated.push({
|
|
121
|
+
id,
|
|
122
|
+
transport: "http",
|
|
123
|
+
url: url,
|
|
124
|
+
...(hasEnv ? { bearer_env: bearerEnv } : {}),
|
|
125
|
+
...(hasFile ? { bearer_file: bearerFile } : {}),
|
|
126
|
+
...(notes !== undefined ? { notes: notes } : {}),
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return { ok: true, registry: { hosts: validated } };
|
|
131
|
+
}
|
|
132
|
+
/** Resolve a host id for placement. Unknown id names the requested id and
|
|
133
|
+
* lists up to 10 known ids — the FR-4 per-entry validation message rides
|
|
134
|
+
* this (what/why/fix, before any launch attempt). */
|
|
135
|
+
export function resolveHost(registry, id) {
|
|
136
|
+
const match = registry.hosts.find((h) => h.id === id);
|
|
137
|
+
if (match)
|
|
138
|
+
return { ok: true, host: match };
|
|
139
|
+
const knownIds = registry.hosts.map((h) => h.id).slice(0, 10);
|
|
140
|
+
const idsHint = knownIds.length > 0
|
|
141
|
+
? ` Known host ids: ${knownIds.join(", ")}${registry.hosts.length > knownIds.length ? ` (+${registry.hosts.length - knownIds.length} more)` : ""}.`
|
|
142
|
+
: " (registry is empty)";
|
|
143
|
+
return {
|
|
144
|
+
ok: false,
|
|
145
|
+
error: `unknown host id '${id}'.${idsHint}`,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
/** FR-4: placement requires a transport that can carry remote-up. v0 that is
|
|
149
|
+
* the http transport (the shipped remote single-rig leaf is POST /api/up
|
|
150
|
+
* over runRemoteHttpOp); ssh-transport hosts are reachable for send/capture
|
|
151
|
+
* but cannot carry remote-up — a structured per-entry error, not a launch
|
|
152
|
+
* attempt. */
|
|
153
|
+
export function resolvePlacementHost(registry, id) {
|
|
154
|
+
const res = resolveHost(registry, id);
|
|
155
|
+
if (!res.ok)
|
|
156
|
+
return res;
|
|
157
|
+
if (res.host.transport !== "http") {
|
|
158
|
+
return {
|
|
159
|
+
ok: false,
|
|
160
|
+
error: `host '${id}' uses transport '${res.host.transport}', which cannot carry remote rig-up. Placement requires an http-transport host (url + bearer_env/bearer_file) — update the registry entry or launch that rig locally.`,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
return res;
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=hosts-registry-reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hosts-registry-reader.js","sourceRoot":"","sources":["../../../src/domain/hosts/hosts-registry-reader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { HttpHostEntry } from "./hosts-registry-reader.js";
|
|
2
|
+
export interface RemoteJsonDeps {
|
|
3
|
+
/** Injected for tests; defaults to global fetch. */
|
|
4
|
+
fetchImpl?: typeof fetch;
|
|
5
|
+
env?: Record<string, string | undefined>;
|
|
6
|
+
readFile?: (path: string) => string;
|
|
7
|
+
}
|
|
8
|
+
export interface RemoteJsonOptions extends RemoteJsonDeps {
|
|
9
|
+
method: "GET" | "POST";
|
|
10
|
+
body?: unknown;
|
|
11
|
+
/** REQUIRED — the caller names its deadline class explicitly. */
|
|
12
|
+
timeoutMs: number;
|
|
13
|
+
}
|
|
14
|
+
export type RemoteJsonFailureKind = "bearer" | "timeout" | "network" | "http";
|
|
15
|
+
export interface RemoteJsonFailure {
|
|
16
|
+
ok: false;
|
|
17
|
+
kind: RemoteJsonFailureKind;
|
|
18
|
+
/** For kind=timeout: whether the deadline fired before headers
|
|
19
|
+
* ("request") or while reading the body ("body"). */
|
|
20
|
+
phase?: "request" | "body";
|
|
21
|
+
/** HTTP status when headers arrived (kind=http, or kind=timeout/phase=body). */
|
|
22
|
+
status?: number;
|
|
23
|
+
/** Bearer message / network error message / remote error text (may be ""). */
|
|
24
|
+
detail: string;
|
|
25
|
+
}
|
|
26
|
+
export type RemoteJsonResult = {
|
|
27
|
+
ok: true;
|
|
28
|
+
status: number;
|
|
29
|
+
payload: unknown;
|
|
30
|
+
} | RemoteJsonFailure;
|
|
31
|
+
/** One bounded daemon→daemon JSON exchange. The single deadline covers
|
|
32
|
+
* request + body; every outcome is structured — this function never hangs
|
|
33
|
+
* and never throws. */
|
|
34
|
+
export declare function remoteJsonRequest(host: HttpHostEntry, path: string, opts: RemoteJsonOptions): Promise<RemoteJsonResult>;
|
|
35
|
+
//# sourceMappingURL=remote-daemon-http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-daemon-http.d.ts","sourceRoot":"","sources":["../../../src/domain/hosts/remote-daemon-http.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAEhE,MAAM,WAAW,cAAc;IAC7B,oDAAoD;IACpD,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACvD,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,iEAAiE;IACjE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,qBAAqB,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;AAE9E,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,KAAK,CAAC;IACV,IAAI,EAAE,qBAAqB,CAAC;IAC5B;0DACsD;IACtD,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC3B,gFAAgF;IAChF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,gBAAgB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,iBAAiB,CAAC;AAwBlG;;wBAEwB;AACxB,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAmD7H"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
// OPR.0.4.4.15 — the SHARED daemon→daemon HTTP core (arch cell 1, RATIFIED).
|
|
2
|
+
//
|
|
3
|
+
// Extracted from topology/remote-up-leaf.ts so the P4 aggregation fan-out
|
|
4
|
+
// does not mint a second copy of security-adjacent transport code (bearer
|
|
5
|
+
// resolution + bounded-abort discipline + status classification). The
|
|
6
|
+
// up-leaf is now a thin consumer that FORMATS this module's structured
|
|
7
|
+
// result into its shipped error strings (its tests byte-preserved).
|
|
8
|
+
//
|
|
9
|
+
// DEADLINE IS A REQUIRED ARGUMENT (arch sharpening, no module default):
|
|
10
|
+
// the up-leaf passes its 120s long-running rig-up budget at ITS call-site;
|
|
11
|
+
// the attention aggregator passes its 5s read-class deadline at ITS
|
|
12
|
+
// call-site. A buried default would invite the next consumer to silently
|
|
13
|
+
// inherit the wrong class.
|
|
14
|
+
//
|
|
15
|
+
// The G-R2B1-1 discipline is structural here: ONE deadline armed through
|
|
16
|
+
// the WHOLE exchange — request AND body parse (2xx or error body). A host
|
|
17
|
+
// that sends headers and never finishes the body yields a structured
|
|
18
|
+
// timeout, never a hung caller. The body race is explicit against the
|
|
19
|
+
// signal (a hand-built/proxied Response is not necessarily wired to the
|
|
20
|
+
// controller — no trust in fetch internals).
|
|
21
|
+
import { readFileSync } from "node:fs";
|
|
22
|
+
/** Mirrors the CLI's resolveRemoteBearer (host-registry.ts): exactly-one of
|
|
23
|
+
* bearer_env / bearer_file, resolved at call time. */
|
|
24
|
+
function resolveBearer(host, deps) {
|
|
25
|
+
const env = deps.env ?? process.env;
|
|
26
|
+
const readFile = deps.readFile ?? ((p) => readFileSync(p, "utf-8"));
|
|
27
|
+
if (host.bearer_env) {
|
|
28
|
+
const token = env[host.bearer_env]?.trim();
|
|
29
|
+
if (token)
|
|
30
|
+
return { ok: true, token };
|
|
31
|
+
return { ok: false, detail: `bearer env var ${host.bearer_env} is not set or empty for host ${host.id}` };
|
|
32
|
+
}
|
|
33
|
+
if (host.bearer_file) {
|
|
34
|
+
try {
|
|
35
|
+
const token = readFile(host.bearer_file).trim();
|
|
36
|
+
if (token)
|
|
37
|
+
return { ok: true, token };
|
|
38
|
+
return { ok: false, detail: `bearer file ${host.bearer_file} is empty for host ${host.id}` };
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return { ok: false, detail: `bearer file ${host.bearer_file} not readable for host ${host.id}` };
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return { ok: false, detail: `host ${host.id} has no bearer_env or bearer_file configured` };
|
|
45
|
+
}
|
|
46
|
+
/** One bounded daemon→daemon JSON exchange. The single deadline covers
|
|
47
|
+
* request + body; every outcome is structured — this function never hangs
|
|
48
|
+
* and never throws. */
|
|
49
|
+
export async function remoteJsonRequest(host, path, opts) {
|
|
50
|
+
const bearer = resolveBearer(host, opts);
|
|
51
|
+
if (!bearer.ok)
|
|
52
|
+
return { ok: false, kind: "bearer", detail: bearer.detail };
|
|
53
|
+
const fetchImpl = opts.fetchImpl ?? fetch;
|
|
54
|
+
const url = `${host.url.replace(/\/$/, "")}${path}`;
|
|
55
|
+
const controller = new AbortController();
|
|
56
|
+
const timer = setTimeout(() => controller.abort(), opts.timeoutMs);
|
|
57
|
+
let res;
|
|
58
|
+
try {
|
|
59
|
+
res = await fetchImpl(url, {
|
|
60
|
+
method: opts.method,
|
|
61
|
+
headers: {
|
|
62
|
+
...(opts.body !== undefined ? { "Content-Type": "application/json" } : {}),
|
|
63
|
+
Authorization: `Bearer ${bearer.token}`,
|
|
64
|
+
},
|
|
65
|
+
...(opts.body !== undefined ? { body: JSON.stringify(opts.body) } : {}),
|
|
66
|
+
signal: controller.signal,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
clearTimeout(timer);
|
|
71
|
+
if (controller.signal.aborted)
|
|
72
|
+
return { ok: false, kind: "timeout", phase: "request", detail: "" };
|
|
73
|
+
return { ok: false, kind: "network", detail: err.message };
|
|
74
|
+
}
|
|
75
|
+
// Body parse under the SAME still-armed deadline, raced explicitly.
|
|
76
|
+
const abortRace = new Promise((_resolve, reject) => {
|
|
77
|
+
const onAbort = () => reject(new Error("body read aborted"));
|
|
78
|
+
if (controller.signal.aborted)
|
|
79
|
+
onAbort();
|
|
80
|
+
else
|
|
81
|
+
controller.signal.addEventListener("abort", onAbort, { once: true });
|
|
82
|
+
});
|
|
83
|
+
let payload;
|
|
84
|
+
let bodyTimedOut = false;
|
|
85
|
+
try {
|
|
86
|
+
payload = await Promise.race([res.json(), abortRace]);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
if (controller.signal.aborted)
|
|
90
|
+
bodyTimedOut = true;
|
|
91
|
+
// else: non-JSON body — payload stays undefined; status is the honest detail
|
|
92
|
+
}
|
|
93
|
+
finally {
|
|
94
|
+
clearTimeout(timer);
|
|
95
|
+
}
|
|
96
|
+
if (bodyTimedOut)
|
|
97
|
+
return { ok: false, kind: "timeout", phase: "body", status: res.status, detail: "" };
|
|
98
|
+
if (res.status >= 200 && res.status < 300)
|
|
99
|
+
return { ok: true, status: res.status, payload };
|
|
100
|
+
const remoteError = payload && typeof payload === "object" && typeof payload.error === "string"
|
|
101
|
+
? payload.error
|
|
102
|
+
: "";
|
|
103
|
+
return { ok: false, kind: "http", status: res.status, detail: remoteError };
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=remote-daemon-http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-daemon-http.js","sourceRoot":"","sources":["../../../src/domain/hosts/remote-daemon-http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Human-route enforcement (OPR.0.4.4.19 FR-4 + FR-5; conventions C6 + C3).
|
|
3
|
+
*
|
|
4
|
+
* Sibling of hot-potato-enforcer.ts: a pure domain validator wired at the
|
|
5
|
+
* QueueRepository write paths (create / handoff / handoff-and-complete, and
|
|
6
|
+
* the FR-6 park transition) so every surface — CLI, HTTP, future UI —
|
|
7
|
+
* inherits the same guarantee. NOT enforced at the route, NOT at the CLI.
|
|
8
|
+
*
|
|
9
|
+
* THE scoping predicate (PRD §5 — the complete trigger list, BR-1):
|
|
10
|
+
*
|
|
11
|
+
* tier = 'human-gate'
|
|
12
|
+
* OR is_human_seat_session(destination_session)
|
|
13
|
+
* OR (state = 'blocked' AND is_human_seat_session(blocked_on)) [FR-6]
|
|
14
|
+
*
|
|
15
|
+
* When the predicate is FALSE, this module validates NOTHING: ordinary
|
|
16
|
+
* agent-to-agent queue traffic gains zero new required fields, zero new
|
|
17
|
+
* rejection paths, zero new warns (BR-1 zero-friction boundary). Do not
|
|
18
|
+
* broaden the trigger by destination tag, body text, or state alone.
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* The EXACT human-seat regex. Single TS source of truth — the same pattern
|
|
22
|
+
* QueueRepository registers as the SQLite `is_human_seat_session` function
|
|
23
|
+
* (queue-repository.ts constructor) so SQL-side and TS-side checks cannot
|
|
24
|
+
* drift. Mirrors the UI's feed-classifier isHumanSeat.
|
|
25
|
+
*/
|
|
26
|
+
export declare const HUMAN_SEAT_SESSION_PATTERN: RegExp;
|
|
27
|
+
export declare function isHumanSeatSession(value: unknown): boolean;
|
|
28
|
+
export interface HumanRouteRequest {
|
|
29
|
+
tier: string | null | undefined;
|
|
30
|
+
destinationSession: string;
|
|
31
|
+
summary: string | null | undefined;
|
|
32
|
+
evidenceRef: string | null | undefined;
|
|
33
|
+
}
|
|
34
|
+
export interface HumanRouteValidationOk {
|
|
35
|
+
ok: true;
|
|
36
|
+
/** True when the §5 predicate matched (the item is human-routed). */
|
|
37
|
+
humanRouted: boolean;
|
|
38
|
+
}
|
|
39
|
+
export interface HumanRouteValidationErr {
|
|
40
|
+
ok: false;
|
|
41
|
+
code: "human_route_fields_required";
|
|
42
|
+
message: string;
|
|
43
|
+
missingFields: string[];
|
|
44
|
+
}
|
|
45
|
+
export type HumanRouteValidation = HumanRouteValidationOk | HumanRouteValidationErr;
|
|
46
|
+
/**
|
|
47
|
+
* Validate the C6/C3 structure of a NEW qitem (create / the created half of a
|
|
48
|
+
* handoff). Fires ONLY when the item is human-routed via legs 1–2 of the §5
|
|
49
|
+
* predicate (human-gate tier, human-seat destination). The park leg
|
|
50
|
+
* (blocked_on a human seat) is validated by {@link validateHumanPark} at the
|
|
51
|
+
* blocked-transition write path.
|
|
52
|
+
*/
|
|
53
|
+
export declare function validateHumanRoute(req: HumanRouteRequest): HumanRouteValidation;
|
|
54
|
+
export interface HumanParkRequest {
|
|
55
|
+
/** The blocker the item is being parked on (qitem id OR human-seat session). */
|
|
56
|
+
blockedOn: string | null | undefined;
|
|
57
|
+
/** Effective values at park time: the value provided on the park call,
|
|
58
|
+
* falling back to what the item already carries. */
|
|
59
|
+
summary: string | null | undefined;
|
|
60
|
+
evidenceRef: string | null | undefined;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* OPR.0.4.4.19 FR-6 — leg-1 park enforcement (§5 predicate leg 3). Fires
|
|
64
|
+
* ONLY when the blocker is a human seat; blocking on another qitem (today's
|
|
65
|
+
* shipped usage) requires nothing new. The parked qitem itself — id, slice
|
|
66
|
+
* tag, summary — IS the what-it-unblocks (arch-ruled: no decision_descriptor
|
|
67
|
+
* field). Enforcement symmetry: park requires summary + evidence_ref like
|
|
68
|
+
* FR-7's resolve requires non-empty decision text.
|
|
69
|
+
*/
|
|
70
|
+
export declare function validateHumanPark(req: HumanParkRequest): HumanRouteValidation;
|
|
71
|
+
//# sourceMappingURL=human-route-enforcer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"human-route-enforcer.d.ts","sourceRoot":"","sources":["../../src/domain/human-route-enforcer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,QAA+C,CAAC;AAEvF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE1D;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAChC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACnC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CACxC;AAED,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,IAAI,CAAC;IACT,qEAAqE;IACrE,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,KAAK,CAAC;IACV,IAAI,EAAE,6BAA6B,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,MAAM,oBAAoB,GAAG,sBAAsB,GAAG,uBAAuB,CAAC;AAMpF;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,iBAAiB,GAAG,oBAAoB,CAQ/E;AAED,MAAM,WAAW,gBAAgB;IAC/B,gFAAgF;IAChF,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACrC;yDACqD;IACrD,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACnC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CACxC;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,gBAAgB,GAAG,oBAAoB,CAQ7E"}
|