@phyzess/pappra 0.1.0-beta.13 → 0.1.0-beta.18
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 +134 -15
- package/assets/integrations/skills/pappra/SKILL.md +28 -7
- package/assets/integrations/skills/pappra/references/collaboration.md +633 -0
- package/assets/integrations/skills/pappra/references/environment.md +360 -0
- package/assets/integrations/skills/pappra/references/hosts.md +20 -0
- package/assets/integrations/skills/pappra/references/operations.md +36 -5
- package/dist/adapters/pi/recovery-extension.d.ts +65 -0
- package/dist/adapters/pi/recovery-extension.js +238 -0
- package/dist/adapters/pi/session-transition-extension.d.ts +30 -0
- package/dist/adapters/pi/session-transition-extension.js +265 -0
- package/dist/app/automatic-handoff-events.d.ts +26 -0
- package/dist/app/automatic-handoff-events.js +134 -0
- package/dist/app/bounded-file.d.ts +2 -0
- package/dist/app/bounded-file.js +2 -0
- package/dist/app/capability-evidence/claude.d.ts +37 -0
- package/dist/app/capability-evidence/claude.js +206 -0
- package/dist/app/capability-evidence/codex.d.ts +35 -0
- package/dist/app/capability-evidence/codex.js +193 -0
- package/dist/app/capability-evidence/index.d.ts +33 -0
- package/dist/app/capability-evidence/index.js +117 -0
- package/dist/app/capability-evidence/pi.d.ts +73 -0
- package/dist/app/capability-evidence/pi.js +669 -0
- package/dist/app/capability-evidence/shared.d.ts +69 -0
- package/dist/app/capability-evidence/shared.js +195 -0
- package/dist/app/collab-auto-handoff.d.ts +55 -0
- package/dist/app/collab-auto-handoff.js +384 -0
- package/dist/app/collab-bindings.d.ts +57 -0
- package/dist/app/collab-bindings.js +1006 -0
- package/dist/app/collab-bootstrap-transport.d.ts +163 -0
- package/dist/app/collab-bootstrap-transport.js +769 -0
- package/dist/app/collab-bootstrap.d.ts +137 -0
- package/dist/app/collab-bootstrap.js +3455 -0
- package/dist/app/collab-handoff.d.ts +12 -0
- package/dist/app/collab-handoff.js +511 -0
- package/dist/app/collab-messages.d.ts +2 -0
- package/dist/app/collab-messages.js +2 -0
- package/dist/app/collab-notify.d.ts +156 -0
- package/dist/app/collab-notify.js +1208 -0
- package/dist/app/collab-preflight.d.ts +34 -0
- package/dist/app/collab-preflight.js +96 -0
- package/dist/app/collab-recovery-executor.d.ts +161 -0
- package/dist/app/collab-recovery-executor.js +1153 -0
- package/dist/app/collab-recovery-projection.d.ts +103 -0
- package/dist/app/collab-recovery-projection.js +659 -0
- package/dist/app/collab-recovery.d.ts +25 -0
- package/dist/app/collab-recovery.js +429 -0
- package/dist/app/collab-resources.d.ts +16 -0
- package/dist/app/collab-resources.js +278 -0
- package/dist/app/collab-role-events.d.ts +22 -0
- package/dist/app/collab-role-events.js +329 -0
- package/dist/app/collab-role-orchestration.d.ts +53 -0
- package/dist/app/collab-role-orchestration.js +601 -0
- package/dist/app/collab-role-plan.d.ts +81 -0
- package/dist/app/collab-role-plan.js +504 -0
- package/dist/app/collab-role-repair.d.ts +109 -0
- package/dist/app/collab-role-repair.js +821 -0
- package/dist/app/collab-rollover.d.ts +263 -0
- package/dist/app/collab-rollover.js +1112 -0
- package/dist/app/collab-route.d.ts +64 -0
- package/dist/app/collab-route.js +240 -0
- package/dist/app/collab-session-transition.d.ts +221 -0
- package/dist/app/collab-session-transition.js +3334 -0
- package/dist/app/collab-state.d.ts +7 -0
- package/dist/app/collab-state.js +162 -0
- package/dist/app/collab-task-store.d.ts +22 -0
- package/dist/app/collab-task-store.js +204 -0
- package/dist/app/collab-work-execution.d.ts +127 -0
- package/dist/app/collab-work-execution.js +1027 -0
- package/dist/app/collab-work-plan.d.ts +87 -0
- package/dist/app/collab-work-plan.js +437 -0
- package/dist/app/collaboration.d.ts +8 -2
- package/dist/app/collaboration.js +101 -12
- package/dist/app/doctor.js +108 -5
- package/dist/app/host-mcp.js +34 -8
- package/dist/app/host-probe.js +4 -4
- package/dist/app/init.d.ts +58 -4
- package/dist/app/init.js +768 -155
- package/dist/app/managed-pi-bootstrap-admission.d.ts +14 -0
- package/dist/app/managed-pi-bootstrap-admission.js +104 -0
- package/dist/app/managed-pi-bootstrap-refresh.d.ts +10 -0
- package/dist/app/managed-pi-bootstrap-refresh.js +78 -0
- package/dist/app/managed-pi-delivery.d.ts +8 -0
- package/dist/app/managed-pi-delivery.js +110 -0
- package/dist/app/managed-pi-handoff-receiver.d.ts +15 -0
- package/dist/app/managed-pi-handoff-receiver.js +263 -0
- package/dist/app/managed-pi-handoff-reference.d.ts +3 -0
- package/dist/app/managed-pi-handoff-reference.js +60 -0
- package/dist/app/managed-pi-herdr.d.ts +21 -0
- package/dist/app/managed-pi-herdr.js +185 -0
- package/dist/app/managed-pi-initial-admission.d.ts +28 -0
- package/dist/app/managed-pi-initial-admission.js +416 -0
- package/dist/app/managed-pi-initial-launch.d.ts +5 -0
- package/dist/app/managed-pi-initial-launch.js +61 -0
- package/dist/app/managed-pi-native-observation.d.ts +36 -0
- package/dist/app/managed-pi-native-observation.js +191 -0
- package/dist/app/managed-pi-readiness.d.ts +29 -0
- package/dist/app/managed-pi-readiness.js +288 -0
- package/dist/app/managed-pi-repair-stop.d.ts +21 -0
- package/dist/app/managed-pi-repair-stop.js +371 -0
- package/dist/app/managed-pi-resume-admission.d.ts +32 -0
- package/dist/app/managed-pi-resume-admission.js +618 -0
- package/dist/app/managed-pi-retirement.d.ts +28 -0
- package/dist/app/managed-pi-retirement.js +112 -0
- package/dist/app/managed-pi-sdk-control.d.ts +7 -0
- package/dist/app/managed-pi-sdk-control.js +169 -0
- package/dist/app/managed-pi-sdk-runtime.d.ts +3 -0
- package/dist/app/managed-pi-sdk-runtime.js +483 -0
- package/dist/app/managed-pi-source-admission.d.ts +14 -0
- package/dist/app/managed-pi-source-admission.js +323 -0
- package/dist/app/managed-pi-transition-host.d.ts +36 -0
- package/dist/app/managed-pi-transition-host.js +292 -0
- package/dist/app/managed-pi.d.ts +54 -0
- package/dist/app/managed-pi.js +248 -0
- package/dist/app/shell-readiness.d.ts +66 -0
- package/dist/app/shell-readiness.js +368 -0
- package/dist/app/task-pin.d.ts +2 -23
- package/dist/app/task-pin.js +2 -113
- package/dist/cli/commands/collaboration-binding.d.ts +13 -0
- package/dist/cli/commands/collaboration-binding.js +118 -0
- package/dist/cli/commands/collaboration-bootstrap.d.ts +10 -0
- package/dist/cli/commands/collaboration-bootstrap.js +84 -0
- package/dist/cli/commands/collaboration-capabilities.d.ts +13 -0
- package/dist/cli/commands/collaboration-capabilities.js +127 -0
- package/dist/cli/commands/collaboration-handoff.d.ts +13 -0
- package/dist/cli/commands/collaboration-handoff.js +102 -0
- package/dist/cli/commands/collaboration-message.d.ts +17 -0
- package/dist/cli/commands/collaboration-message.js +177 -0
- package/dist/cli/commands/collaboration-plan.d.ts +8 -0
- package/dist/cli/commands/collaboration-plan.js +108 -0
- package/dist/cli/commands/collaboration-preflight.d.ts +10 -0
- package/dist/cli/commands/collaboration-preflight.js +167 -0
- package/dist/cli/commands/collaboration-recovery-run.d.ts +46 -0
- package/dist/cli/commands/collaboration-recovery-run.js +224 -0
- package/dist/cli/commands/collaboration-recovery.d.ts +11 -0
- package/dist/cli/commands/collaboration-recovery.js +104 -0
- package/dist/cli/commands/collaboration-resources.d.ts +11 -0
- package/dist/cli/commands/collaboration-resources.js +96 -0
- package/dist/cli/commands/collaboration-role-plan.d.ts +9 -0
- package/dist/cli/commands/collaboration-role-plan.js +69 -0
- package/dist/cli/commands/collaboration-role-run.d.ts +11 -0
- package/dist/cli/commands/collaboration-role-run.js +128 -0
- package/dist/cli/commands/collaboration-rollover.d.ts +10 -0
- package/dist/cli/commands/collaboration-rollover.js +103 -0
- package/dist/cli/commands/collaboration-state.d.ts +10 -0
- package/dist/cli/commands/collaboration-state.js +96 -0
- package/dist/cli/commands/collaboration-transition.d.ts +10 -0
- package/dist/cli/commands/collaboration-transition.js +75 -0
- package/dist/cli/commands/collaboration-work-run.d.ts +34 -0
- package/dist/cli/commands/collaboration-work-run.js +178 -0
- package/dist/cli/commands/collaboration.d.ts +4 -0
- package/dist/cli/commands/collaboration.js +39 -4
- package/dist/cli/commands/continuity.js +2 -6
- package/dist/cli/commands/docs.d.ts +2 -0
- package/dist/cli/commands/docs.js +89 -15
- package/dist/cli/commands/host.d.ts +7 -1
- package/dist/cli/commands/host.js +122 -7
- package/dist/cli/commands/init.d.ts +20 -3
- package/dist/cli/commands/init.js +897 -232
- package/dist/cli/commands/mcp.d.ts +1 -0
- package/dist/cli/commands/mcp.js +11 -5
- package/dist/cli/commands/repair.d.ts +12 -0
- package/dist/cli/commands/repair.js +41 -0
- package/dist/cli/commands/runtime.d.ts +1 -1
- package/dist/cli/commands/runtime.js +139 -38
- package/dist/cli/commands/session.d.ts +7 -0
- package/dist/cli/commands/session.js +82 -0
- package/dist/cli/commands/task.js +19 -5
- package/dist/cli/run.js +866 -24
- package/dist/code/identity.d.ts +7 -0
- package/dist/code/identity.js +7 -3
- package/dist/code/registration.js +7 -0
- package/dist/code/service.d.ts +9 -0
- package/dist/code/service.js +16 -3
- package/dist/code/text.js +19 -7
- package/dist/collab/admission.d.ts +91 -66
- package/dist/collab/admission.js +21 -6
- package/dist/collab/canonical.d.ts +1 -1
- package/dist/collab/canonical.js +44 -3
- package/dist/collab/envelope.d.ts +2 -2
- package/dist/collab/envelope.js +12 -12
- package/dist/collab/first-work.d.ts +3 -0
- package/dist/collab/first-work.js +15 -0
- package/dist/collab/handoff.d.ts +16 -0
- package/dist/collab/handoff.js +39 -5
- package/dist/collab/index.d.ts +97 -1
- package/dist/collab/index.js +9 -1
- package/dist/collab/messages.js +126 -3
- package/dist/collab/persisted-messages.d.ts +123 -0
- package/dist/collab/persisted-messages.js +496 -0
- package/dist/collab/preflight.d.ts +1 -1
- package/dist/collab/resources.d.ts +13 -3
- package/dist/collab/resources.js +37 -6
- package/dist/collab/rollover.d.ts +311 -0
- package/dist/collab/rollover.js +1024 -0
- package/dist/collab/store.d.ts +1 -0
- package/dist/collab/store.js +1 -4
- package/dist/collab/types.d.ts +2 -354
- package/dist/collab/validation.d.ts +2 -10
- package/dist/collab/validation.js +2 -303
- package/dist/collab/work-plan.d.ts +105 -0
- package/dist/collab/work-plan.js +843 -0
- package/dist/continuity/context.d.ts +11 -2
- package/dist/continuity/context.js +100 -13
- package/dist/continuity/handoff-bundle.d.ts +296 -0
- package/dist/continuity/handoff-bundle.js +477 -0
- package/dist/continuity/index.d.ts +2 -0
- package/dist/continuity/index.js +1 -0
- package/dist/continuity/paths.js +10 -2
- package/dist/continuity/service.js +91 -15
- package/dist/continuity/task-pin.d.ts +24 -0
- package/dist/continuity/task-pin.js +590 -0
- package/dist/doctor.d.ts +1 -0
- package/dist/doctor.js +6 -0
- package/dist/experimental/index.d.ts +13 -0
- package/dist/experimental/index.js +25 -0
- package/dist/experimental/pi.d.ts +4 -0
- package/dist/experimental/pi.js +12 -0
- package/dist/hosts/claude/native.js +1 -1
- package/dist/hosts/codex/native.js +1 -1
- package/dist/hosts/codex/protocol.js +1 -1
- package/dist/hosts/integration/bootstrap-config.d.ts +58 -0
- package/dist/hosts/integration/bootstrap-config.js +254 -0
- package/dist/hosts/integration/bundle-export.d.ts +44 -0
- package/dist/hosts/integration/bundle-export.js +366 -3
- package/dist/hosts/integration/bundle.js +3 -0
- package/dist/hosts/integration/hook.js +36 -9
- package/dist/hosts/integration/pappra-bootstrap-extension.mjs +80 -0
- package/dist/hosts/integration/pappra-extension-runtime.mjs +59 -24631
- package/dist/hosts/integration/pappra-hook.mjs +61 -24749
- package/dist/hosts/integration/pappra-recovery-extension.mjs +259 -0
- package/dist/hosts/integration/pappra-session-transition-extension.mjs +276 -0
- package/dist/hosts/integration/pi-bootstrap-extension.d.ts +36 -0
- package/dist/hosts/integration/pi-bootstrap-extension.js +101 -0
- package/dist/hosts/integration/pi-bootstrap-guard.d.ts +125 -0
- package/dist/hosts/integration/pi-bootstrap-guard.js +438 -0
- package/dist/hosts/integration/pi-bootstrap-runtime.d.ts +63 -0
- package/dist/hosts/integration/pi-bootstrap-runtime.js +223 -0
- package/dist/hosts/integration/pi-native-events.d.ts +112 -0
- package/dist/hosts/integration/pi-native-events.js +348 -0
- package/dist/hosts/integration/pi-rollover-extension.d.ts +166 -0
- package/dist/hosts/integration/pi-rollover-extension.js +431 -0
- package/dist/hosts/integration/recovery-config.d.ts +48 -0
- package/dist/hosts/integration/recovery-config.js +117 -0
- package/dist/hosts/integration/service.d.ts +6 -1
- package/dist/hosts/integration/service.js +485 -35
- package/dist/hosts/integration/support.d.ts +7 -0
- package/dist/hosts/integration/support.js +9 -1
- package/dist/hosts/integration/templates.d.ts +3 -0
- package/dist/hosts/integration/templates.js +26 -3
- package/dist/hosts/pi/managed-host-identity.d.ts +2 -0
- package/dist/hosts/pi/managed-host-identity.js +40 -0
- package/dist/hosts/pi/managed-provider-diagnostics.d.ts +6 -0
- package/dist/hosts/pi/managed-provider-diagnostics.js +184 -0
- package/dist/hosts/pi/managed-sdk-session.d.ts +335 -0
- package/dist/hosts/pi/managed-sdk-session.js +1639 -0
- package/dist/hosts/pi/managed-session-extension.d.ts +20 -0
- package/dist/hosts/pi/managed-session-extension.js +84 -0
- package/dist/hosts/pi/managed-session.d.ts +177 -0
- package/dist/hosts/pi/managed-session.js +1557 -0
- package/dist/hosts/pi/protocol.js +1 -1
- package/dist/hosts/pi/query-result.js +1 -1
- package/dist/hosts/pi/resume-capability.d.ts +41 -0
- package/dist/hosts/pi/resume-capability.js +33 -0
- package/dist/hosts/pi/rpc.d.ts +182 -134
- package/dist/hosts/pi/rpc.js +230 -37
- package/dist/hosts/pilot.d.ts +97 -74
- package/dist/hosts/pilot.js +5 -1
- package/dist/hosts/version.d.ts +3 -0
- package/dist/hosts/version.js +18 -0
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -1
- package/dist/infra/bounded-file.d.ts +19 -0
- package/dist/infra/bounded-file.js +66 -0
- package/dist/infra/fs.js +10 -2
- package/dist/infra/git.d.ts +29 -0
- package/dist/infra/git.js +45 -9
- package/dist/infra/json-property.d.ts +2 -0
- package/dist/infra/json-property.js +69 -0
- package/dist/infra/json.d.ts +4 -0
- package/dist/infra/json.js +24 -0
- package/dist/infra/owned-process-group.js +1 -1
- package/dist/infra/private-lock.d.ts +16 -0
- package/dist/infra/private-lock.js +148 -0
- package/dist/infra/private-state.d.ts +7 -0
- package/dist/infra/private-state.js +146 -0
- package/dist/infra/process-identity.d.ts +12 -0
- package/dist/infra/process-identity.js +142 -0
- package/dist/infra/validation.d.ts +5 -0
- package/dist/infra/validation.js +15 -0
- package/dist/init.d.ts +1 -0
- package/dist/init.js +6 -0
- package/dist/install/apply.d.ts +9 -1
- package/dist/install/apply.js +176 -12
- package/dist/install/dependencies.d.ts +38 -0
- package/dist/install/dependencies.js +282 -0
- package/dist/install/ownership.js +30 -1
- package/dist/install/references.d.ts +31 -0
- package/dist/install/references.js +208 -0
- package/dist/install/repair.d.ts +37 -0
- package/dist/install/repair.js +798 -0
- package/dist/install/reset-local.d.ts +16 -0
- package/dist/install/reset-local.js +304 -0
- package/dist/install/rollback.d.ts +3 -0
- package/dist/install/rollback.js +9 -3
- package/dist/install/runtime.d.ts +10 -6
- package/dist/install/runtime.js +299 -59
- package/dist/install/source-fingerprint.d.ts +2 -0
- package/dist/install/source-fingerprint.js +103 -0
- package/dist/knowledge/catalog.d.ts +1 -0
- package/dist/knowledge/catalog.js +143 -10
- package/dist/knowledge/journal.js +17 -7
- package/dist/knowledge/paths.js +2 -1
- package/dist/knowledge/refs.js +4 -0
- package/dist/knowledge/register-batch.d.ts +4 -0
- package/dist/knowledge/register-batch.js +225 -0
- package/dist/knowledge/relocate.d.ts +5 -0
- package/dist/knowledge/relocate.js +92 -0
- package/dist/knowledge/scan.js +103 -47
- package/dist/knowledge/service.d.ts +3 -0
- package/dist/knowledge/service.js +33 -1
- package/dist/knowledge/write.d.ts +4 -1
- package/dist/knowledge/write.js +1 -1
- package/dist/mcp/server.d.ts +4 -2
- package/dist/mcp/server.js +87 -136
- package/dist/schemas/collaboration-state-validation.d.ts +6 -0
- package/dist/schemas/collaboration-state-validation.js +342 -0
- package/dist/schemas/collaboration-state.d.ts +436 -0
- package/dist/schemas/collaboration-state.js +1 -0
- package/dist/schemas/collaboration.d.ts +335 -0
- package/dist/schemas/collaboration.js +272 -0
- package/dist/schemas/continuity.d.ts +8 -0
- package/dist/schemas/continuity.js +13 -3
- package/dist/schemas/doctor.d.ts +1 -0
- package/dist/schemas/doctor.js +1 -0
- package/dist/schemas/document.d.ts +61 -0
- package/dist/schemas/document.js +9 -0
- package/dist/schemas/errors.d.ts +1 -0
- package/dist/schemas/errors.js +1 -0
- package/dist/schemas/host.d.ts +24 -0
- package/dist/schemas/host.js +19 -0
- package/dist/schemas/install.d.ts +8 -2
- package/dist/schemas/install.js +11 -1
- package/dist/schemas/managed-pi-execution.d.ts +16 -0
- package/dist/schemas/managed-pi-execution.js +2 -0
- package/dist/schemas/outcome.d.ts +9 -5
- package/dist/workspace/config-file.js +1 -3
- package/dist/workspace/documents.js +12 -2
- package/dist/workspace/repositories.d.ts +7 -0
- package/dist/workspace/repositories.js +14 -5
- package/package.json +35 -35
- package/skills/pappra/SKILL.md +28 -7
- package/skills/pappra/references/collaboration.md +633 -0
- package/skills/pappra/references/environment.md +360 -0
- package/skills/pappra/references/hosts.md +20 -0
- package/skills/pappra/references/operations.md +36 -5
- package/dist/app/collab-from.d.ts +0 -35
- package/dist/app/collab-from.js +0 -84
package/dist/hosts/pilot.d.ts
CHANGED
|
@@ -26,8 +26,13 @@ export declare function readClaudeSessionId(file: string): string | null;
|
|
|
26
26
|
export declare function readPiSessionId(file: string): string | null;
|
|
27
27
|
export declare function runNativePilot({ harness, profile, cwd, promptFile, evidenceDir, sessionId, resume, timeoutMs, maxBudgetUsd, outputName, phase, trustProject, extraDirs, clock, assignmentFile, capabilitiesFile, taskRoot, maxAgeMinutes, launchKind, discovery, }: PilotOptions): Promise<{
|
|
28
28
|
reservation?: never;
|
|
29
|
+
settlement?: never;
|
|
30
|
+
reservation_id?: never;
|
|
29
31
|
refused: boolean;
|
|
30
32
|
admission: {
|
|
33
|
+
detail?: never;
|
|
34
|
+
state?: never;
|
|
35
|
+
state_revision?: never;
|
|
31
36
|
ok: false;
|
|
32
37
|
reason: string;
|
|
33
38
|
checks: Record<string, unknown>[];
|
|
@@ -36,10 +41,6 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
36
41
|
required_skills?: never;
|
|
37
42
|
required_tools?: never;
|
|
38
43
|
preflight?: never;
|
|
39
|
-
state?: never;
|
|
40
|
-
detail?: never;
|
|
41
|
-
state_revision?: never;
|
|
42
|
-
owner_epoch?: never;
|
|
43
44
|
attempt_state?: never;
|
|
44
45
|
resources?: never;
|
|
45
46
|
mode?: never;
|
|
@@ -50,19 +51,19 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
50
51
|
capability_evidence?: never;
|
|
51
52
|
assignment_digest?: never;
|
|
52
53
|
input_revision?: never;
|
|
54
|
+
owner_epoch?: never;
|
|
53
55
|
} | {
|
|
56
|
+
detail?: never;
|
|
57
|
+
expected?: never;
|
|
58
|
+
state?: never;
|
|
59
|
+
state_revision?: never;
|
|
54
60
|
ok: false;
|
|
55
61
|
reason: string;
|
|
56
62
|
checks: Record<string, unknown>[];
|
|
57
|
-
|
|
63
|
+
actual: string;
|
|
58
64
|
required_skills?: never;
|
|
59
65
|
required_tools?: never;
|
|
60
66
|
preflight?: never;
|
|
61
|
-
state?: never;
|
|
62
|
-
expected?: never;
|
|
63
|
-
actual?: never;
|
|
64
|
-
state_revision?: never;
|
|
65
|
-
owner_epoch?: never;
|
|
66
67
|
attempt_state?: never;
|
|
67
68
|
resources?: never;
|
|
68
69
|
mode?: never;
|
|
@@ -73,19 +74,42 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
73
74
|
capability_evidence?: never;
|
|
74
75
|
assignment_digest?: never;
|
|
75
76
|
input_revision?: never;
|
|
77
|
+
owner_epoch?: never;
|
|
76
78
|
} | {
|
|
79
|
+
expected?: never;
|
|
80
|
+
actual?: never;
|
|
81
|
+
state?: never;
|
|
82
|
+
state_revision?: never;
|
|
77
83
|
ok: false;
|
|
78
84
|
reason: string;
|
|
79
85
|
checks: Record<string, unknown>[];
|
|
86
|
+
detail: string;
|
|
80
87
|
required_skills?: never;
|
|
81
88
|
required_tools?: never;
|
|
82
89
|
preflight?: never;
|
|
83
|
-
|
|
90
|
+
attempt_state?: never;
|
|
91
|
+
resources?: never;
|
|
92
|
+
mode?: never;
|
|
93
|
+
launch_kind?: never;
|
|
94
|
+
resume_selector?: never;
|
|
95
|
+
pre_bound_identity?: never;
|
|
96
|
+
expected_identity?: never;
|
|
97
|
+
capability_evidence?: never;
|
|
98
|
+
assignment_digest?: never;
|
|
99
|
+
input_revision?: never;
|
|
100
|
+
owner_epoch?: never;
|
|
101
|
+
} | {
|
|
84
102
|
detail?: never;
|
|
85
103
|
expected?: never;
|
|
86
104
|
actual?: never;
|
|
105
|
+
state?: never;
|
|
87
106
|
state_revision?: never;
|
|
88
|
-
|
|
107
|
+
ok: false;
|
|
108
|
+
reason: string;
|
|
109
|
+
checks: Record<string, unknown>[];
|
|
110
|
+
required_skills?: never;
|
|
111
|
+
required_tools?: never;
|
|
112
|
+
preflight?: never;
|
|
89
113
|
attempt_state?: never;
|
|
90
114
|
resources?: never;
|
|
91
115
|
mode?: never;
|
|
@@ -96,7 +120,11 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
96
120
|
capability_evidence?: never;
|
|
97
121
|
assignment_digest?: never;
|
|
98
122
|
input_revision?: never;
|
|
123
|
+
owner_epoch?: never;
|
|
99
124
|
} | {
|
|
125
|
+
detail?: never;
|
|
126
|
+
state?: never;
|
|
127
|
+
state_revision?: never;
|
|
100
128
|
ok: false;
|
|
101
129
|
reason: string;
|
|
102
130
|
checks: Record<string, unknown>[];
|
|
@@ -105,10 +133,6 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
105
133
|
required_skills?: never;
|
|
106
134
|
required_tools?: never;
|
|
107
135
|
preflight?: never;
|
|
108
|
-
state?: never;
|
|
109
|
-
detail?: never;
|
|
110
|
-
state_revision?: never;
|
|
111
|
-
owner_epoch?: never;
|
|
112
136
|
attempt_state?: never;
|
|
113
137
|
resources?: never;
|
|
114
138
|
mode?: never;
|
|
@@ -119,12 +143,16 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
119
143
|
capability_evidence?: never;
|
|
120
144
|
assignment_digest?: never;
|
|
121
145
|
input_revision?: never;
|
|
146
|
+
owner_epoch?: never;
|
|
122
147
|
} | {
|
|
148
|
+
detail?: never;
|
|
149
|
+
state?: never;
|
|
150
|
+
state_revision?: never;
|
|
123
151
|
ok: false;
|
|
124
152
|
reason: string;
|
|
125
153
|
checks: Record<string, unknown>[];
|
|
126
|
-
expected: import("../
|
|
127
|
-
actual: import("../
|
|
154
|
+
expected: import("../schemas/collaboration-state.js").Identity;
|
|
155
|
+
actual: import("../schemas/collaboration-state.js").Identity & {
|
|
128
156
|
harness: string;
|
|
129
157
|
cwd: string;
|
|
130
158
|
surface: string;
|
|
@@ -133,10 +161,6 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
133
161
|
required_skills?: never;
|
|
134
162
|
required_tools?: never;
|
|
135
163
|
preflight?: never;
|
|
136
|
-
state?: never;
|
|
137
|
-
detail?: never;
|
|
138
|
-
state_revision?: never;
|
|
139
|
-
owner_epoch?: never;
|
|
140
164
|
attempt_state?: never;
|
|
141
165
|
resources?: never;
|
|
142
166
|
mode?: never;
|
|
@@ -147,7 +171,10 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
147
171
|
capability_evidence?: never;
|
|
148
172
|
assignment_digest?: never;
|
|
149
173
|
input_revision?: never;
|
|
174
|
+
owner_epoch?: never;
|
|
150
175
|
} | {
|
|
176
|
+
state?: never;
|
|
177
|
+
state_revision?: never;
|
|
151
178
|
ok: false;
|
|
152
179
|
reason: string;
|
|
153
180
|
checks: Record<string, unknown>[];
|
|
@@ -157,9 +184,6 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
157
184
|
required_skills?: never;
|
|
158
185
|
required_tools?: never;
|
|
159
186
|
preflight?: never;
|
|
160
|
-
state?: never;
|
|
161
|
-
state_revision?: never;
|
|
162
|
-
owner_epoch?: never;
|
|
163
187
|
attempt_state?: never;
|
|
164
188
|
resources?: never;
|
|
165
189
|
mode?: never;
|
|
@@ -170,19 +194,19 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
170
194
|
capability_evidence?: never;
|
|
171
195
|
assignment_digest?: never;
|
|
172
196
|
input_revision?: never;
|
|
197
|
+
owner_epoch?: never;
|
|
173
198
|
} | {
|
|
199
|
+
detail?: never;
|
|
200
|
+
expected?: never;
|
|
201
|
+
actual?: never;
|
|
202
|
+
state?: never;
|
|
203
|
+
state_revision?: never;
|
|
174
204
|
ok: false;
|
|
175
205
|
reason: string;
|
|
176
206
|
checks: Record<string, unknown>[];
|
|
177
207
|
required_skills: number;
|
|
178
208
|
required_tools: number;
|
|
179
209
|
preflight?: never;
|
|
180
|
-
state?: never;
|
|
181
|
-
detail?: never;
|
|
182
|
-
expected?: never;
|
|
183
|
-
actual?: never;
|
|
184
|
-
state_revision?: never;
|
|
185
|
-
owner_epoch?: never;
|
|
186
210
|
attempt_state?: never;
|
|
187
211
|
resources?: never;
|
|
188
212
|
mode?: never;
|
|
@@ -193,7 +217,13 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
193
217
|
capability_evidence?: never;
|
|
194
218
|
assignment_digest?: never;
|
|
195
219
|
input_revision?: never;
|
|
220
|
+
owner_epoch?: never;
|
|
196
221
|
} | {
|
|
222
|
+
detail?: never;
|
|
223
|
+
expected?: never;
|
|
224
|
+
actual?: never;
|
|
225
|
+
state?: never;
|
|
226
|
+
state_revision?: never;
|
|
197
227
|
required_skills?: never;
|
|
198
228
|
required_tools?: never;
|
|
199
229
|
ok: false;
|
|
@@ -220,12 +250,6 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
220
250
|
warnings: import("../collab/preflight.js").Check[];
|
|
221
251
|
limits: string[];
|
|
222
252
|
};
|
|
223
|
-
state?: never;
|
|
224
|
-
detail?: never;
|
|
225
|
-
expected?: never;
|
|
226
|
-
actual?: never;
|
|
227
|
-
state_revision?: never;
|
|
228
|
-
owner_epoch?: never;
|
|
229
253
|
attempt_state?: never;
|
|
230
254
|
resources?: never;
|
|
231
255
|
mode?: never;
|
|
@@ -236,7 +260,12 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
236
260
|
capability_evidence?: never;
|
|
237
261
|
assignment_digest?: never;
|
|
238
262
|
input_revision?: never;
|
|
263
|
+
owner_epoch?: never;
|
|
239
264
|
} | {
|
|
265
|
+
detail?: never;
|
|
266
|
+
expected?: never;
|
|
267
|
+
actual?: never;
|
|
268
|
+
state_revision?: never;
|
|
240
269
|
required_skills?: never;
|
|
241
270
|
required_tools?: never;
|
|
242
271
|
preflight?: never;
|
|
@@ -244,11 +273,6 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
244
273
|
reason: string;
|
|
245
274
|
checks: Record<string, unknown>[];
|
|
246
275
|
state: string;
|
|
247
|
-
detail?: never;
|
|
248
|
-
expected?: never;
|
|
249
|
-
actual?: never;
|
|
250
|
-
state_revision?: never;
|
|
251
|
-
owner_epoch?: never;
|
|
252
276
|
attempt_state?: never;
|
|
253
277
|
resources?: never;
|
|
254
278
|
mode?: never;
|
|
@@ -259,19 +283,19 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
259
283
|
capability_evidence?: never;
|
|
260
284
|
assignment_digest?: never;
|
|
261
285
|
input_revision?: never;
|
|
286
|
+
owner_epoch?: never;
|
|
262
287
|
} | {
|
|
288
|
+
detail?: never;
|
|
289
|
+
state?: never;
|
|
290
|
+
state_revision?: never;
|
|
263
291
|
required_skills?: never;
|
|
264
292
|
required_tools?: never;
|
|
265
293
|
preflight?: never;
|
|
266
|
-
state?: never;
|
|
267
294
|
ok: false;
|
|
268
295
|
reason: string;
|
|
269
296
|
checks: Record<string, unknown>[];
|
|
270
297
|
expected: (string | null)[];
|
|
271
298
|
actual: string;
|
|
272
|
-
detail?: never;
|
|
273
|
-
state_revision?: never;
|
|
274
|
-
owner_epoch?: never;
|
|
275
299
|
attempt_state?: never;
|
|
276
300
|
resources?: never;
|
|
277
301
|
mode?: never;
|
|
@@ -282,20 +306,20 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
282
306
|
capability_evidence?: never;
|
|
283
307
|
assignment_digest?: never;
|
|
284
308
|
input_revision?: never;
|
|
309
|
+
owner_epoch?: never;
|
|
285
310
|
} | {
|
|
311
|
+
expected?: never;
|
|
312
|
+
actual?: never;
|
|
313
|
+
state?: never;
|
|
314
|
+
state_revision?: never;
|
|
286
315
|
required_skills?: never;
|
|
287
316
|
required_tools?: never;
|
|
288
317
|
preflight?: never;
|
|
289
|
-
state?: never;
|
|
290
318
|
ok: false;
|
|
291
319
|
reason: string;
|
|
292
320
|
checks: Record<string, unknown>[];
|
|
293
321
|
resources: Record<string, unknown>[];
|
|
294
322
|
detail: string;
|
|
295
|
-
expected?: never;
|
|
296
|
-
actual?: never;
|
|
297
|
-
state_revision?: never;
|
|
298
|
-
owner_epoch?: never;
|
|
299
323
|
attempt_state?: never;
|
|
300
324
|
mode?: never;
|
|
301
325
|
launch_kind?: never;
|
|
@@ -305,20 +329,20 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
305
329
|
capability_evidence?: never;
|
|
306
330
|
assignment_digest?: never;
|
|
307
331
|
input_revision?: never;
|
|
332
|
+
owner_epoch?: never;
|
|
308
333
|
} | {
|
|
334
|
+
detail?: never;
|
|
335
|
+
state?: never;
|
|
336
|
+
state_revision?: never;
|
|
309
337
|
required_skills?: never;
|
|
310
338
|
required_tools?: never;
|
|
311
339
|
preflight?: never;
|
|
312
|
-
state?: never;
|
|
313
|
-
detail?: never;
|
|
314
340
|
ok: false;
|
|
315
341
|
reason: string;
|
|
316
342
|
checks: Record<string, unknown>[];
|
|
317
343
|
resources: Record<string, unknown>[];
|
|
318
344
|
expected: number | undefined;
|
|
319
345
|
actual: number;
|
|
320
|
-
state_revision?: never;
|
|
321
|
-
owner_epoch?: never;
|
|
322
346
|
attempt_state?: never;
|
|
323
347
|
mode?: never;
|
|
324
348
|
launch_kind?: never;
|
|
@@ -328,20 +352,20 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
328
352
|
capability_evidence?: never;
|
|
329
353
|
assignment_digest?: never;
|
|
330
354
|
input_revision?: never;
|
|
355
|
+
owner_epoch?: never;
|
|
331
356
|
} | {
|
|
332
|
-
required_skills?: never;
|
|
333
|
-
required_tools?: never;
|
|
334
|
-
preflight?: never;
|
|
335
|
-
state?: never;
|
|
336
357
|
detail?: never;
|
|
337
358
|
expected?: never;
|
|
338
359
|
actual?: never;
|
|
360
|
+
state?: never;
|
|
361
|
+
state_revision?: never;
|
|
362
|
+
required_skills?: never;
|
|
363
|
+
required_tools?: never;
|
|
364
|
+
preflight?: never;
|
|
339
365
|
ok: false;
|
|
340
366
|
reason: string;
|
|
341
367
|
checks: Record<string, unknown>[];
|
|
342
368
|
resources: Record<string, unknown>[];
|
|
343
|
-
state_revision?: never;
|
|
344
|
-
owner_epoch?: never;
|
|
345
369
|
attempt_state?: never;
|
|
346
370
|
mode?: never;
|
|
347
371
|
launch_kind?: never;
|
|
@@ -351,6 +375,7 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
351
375
|
capability_evidence?: never;
|
|
352
376
|
assignment_digest?: never;
|
|
353
377
|
input_revision?: never;
|
|
378
|
+
owner_epoch?: never;
|
|
354
379
|
};
|
|
355
380
|
reason: string;
|
|
356
381
|
process?: never;
|
|
@@ -361,19 +386,19 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
361
386
|
stdoutFile?: never;
|
|
362
387
|
stderrFile?: never;
|
|
363
388
|
nativeEvidence?: never;
|
|
364
|
-
reservation_id?: never;
|
|
365
|
-
settlement?: never;
|
|
366
389
|
} | {
|
|
390
|
+
settlement?: never;
|
|
391
|
+
reservation_id?: never;
|
|
367
392
|
refused: boolean;
|
|
368
393
|
admission: {
|
|
369
|
-
required_skills?: never;
|
|
370
|
-
required_tools?: never;
|
|
371
|
-
preflight?: never;
|
|
372
|
-
state?: never;
|
|
373
394
|
detail?: never;
|
|
374
395
|
expected?: never;
|
|
375
396
|
actual?: never;
|
|
397
|
+
state?: never;
|
|
376
398
|
reason?: never;
|
|
399
|
+
required_skills?: never;
|
|
400
|
+
required_tools?: never;
|
|
401
|
+
preflight?: never;
|
|
377
402
|
ok: true;
|
|
378
403
|
checks: Record<string, unknown>[];
|
|
379
404
|
state_revision: number;
|
|
@@ -403,13 +428,12 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
403
428
|
stdoutFile?: never;
|
|
404
429
|
stderrFile?: never;
|
|
405
430
|
nativeEvidence?: never;
|
|
406
|
-
reservation_id?: never;
|
|
407
|
-
settlement?: never;
|
|
408
431
|
} | {
|
|
409
432
|
reason?: never;
|
|
410
433
|
reservation?: never;
|
|
411
|
-
refused?: never;
|
|
412
434
|
admission?: never;
|
|
435
|
+
refused?: never;
|
|
436
|
+
reservation_id?: never;
|
|
413
437
|
execution: null;
|
|
414
438
|
evidenceError: string;
|
|
415
439
|
settlement: {
|
|
@@ -435,12 +459,12 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
435
459
|
stdoutFile?: never;
|
|
436
460
|
stderrFile?: never;
|
|
437
461
|
nativeEvidence?: never;
|
|
438
|
-
reservation_id?: never;
|
|
439
462
|
} | {
|
|
440
463
|
reason?: never;
|
|
441
464
|
reservation?: never;
|
|
442
|
-
refused?: never;
|
|
443
465
|
admission?: never;
|
|
466
|
+
refused?: never;
|
|
467
|
+
reservation_id?: never;
|
|
444
468
|
process?: never;
|
|
445
469
|
execution: Record<string, unknown> | null;
|
|
446
470
|
evidenceError: string;
|
|
@@ -458,12 +482,11 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
458
482
|
stdoutFile?: never;
|
|
459
483
|
stderrFile?: never;
|
|
460
484
|
nativeEvidence?: never;
|
|
461
|
-
reservation_id?: never;
|
|
462
485
|
} | {
|
|
463
486
|
reason?: never;
|
|
464
487
|
reservation?: never;
|
|
465
|
-
refused?: never;
|
|
466
488
|
admission?: never;
|
|
489
|
+
refused?: never;
|
|
467
490
|
process?: never;
|
|
468
491
|
evidenceError?: never;
|
|
469
492
|
execution: Record<string, unknown>;
|
package/dist/hosts/pilot.js
CHANGED
|
@@ -6,7 +6,7 @@ import { spawn } from 'node:child_process';
|
|
|
6
6
|
import { admitLaunch, reserveLaunch, settleLaunch, classifyIdentity, TOOL_PROFILES, } from '../collab/admission.js';
|
|
7
7
|
import { createNonce, nowIso } from '../collab/store.js';
|
|
8
8
|
import { sha256File as digestFile } from '../collab/envelope.js';
|
|
9
|
-
import { object, parseJson } from '../
|
|
9
|
+
import { object, parseJson } from '../infra/validation.js';
|
|
10
10
|
import { isAssignment } from '../collab/contracts.js';
|
|
11
11
|
const PHASES = new Set([
|
|
12
12
|
'discovery',
|
|
@@ -28,6 +28,7 @@ function buildArgv({ harness, profile, cwd, prompt, sessionId, resume, maxBudget
|
|
|
28
28
|
...(trustProject ? ['--approve'] : []),
|
|
29
29
|
resume ? '--session' : '--session-id',
|
|
30
30
|
(resume ?? sessionId),
|
|
31
|
+
'--',
|
|
31
32
|
prompt,
|
|
32
33
|
];
|
|
33
34
|
return { command: 'pi', argv, session_selector: resume ?? sessionId };
|
|
@@ -46,6 +47,7 @@ function buildArgv({ harness, profile, cwd, prompt, sessionId, resume, maxBudget
|
|
|
46
47
|
'--skip-git-repo-check',
|
|
47
48
|
'-c',
|
|
48
49
|
`sandbox_mode="${sandbox}"`,
|
|
50
|
+
'--',
|
|
49
51
|
prompt,
|
|
50
52
|
]
|
|
51
53
|
: [
|
|
@@ -56,6 +58,7 @@ function buildArgv({ harness, profile, cwd, prompt, sessionId, resume, maxBudget
|
|
|
56
58
|
'-s',
|
|
57
59
|
sandbox,
|
|
58
60
|
'--skip-git-repo-check',
|
|
61
|
+
'--',
|
|
59
62
|
prompt,
|
|
60
63
|
];
|
|
61
64
|
return { command: 'codex', argv: base, session_selector: resume ?? null };
|
|
@@ -88,6 +91,7 @@ function buildArgv({ harness, profile, cwd, prompt, sessionId, resume, maxBudget
|
|
|
88
91
|
String(maxBudgetUsd),
|
|
89
92
|
resume ? '--resume' : '--session-id',
|
|
90
93
|
(resume ?? sessionId),
|
|
94
|
+
'--',
|
|
91
95
|
prompt,
|
|
92
96
|
];
|
|
93
97
|
return { command: 'claude', argv, session_selector: resume ?? sessionId };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
2
|
+
import { executableOnPath } from './detect.js';
|
|
3
|
+
/** Bounded executable observation only; never sends a prompt or starts a model. */
|
|
4
|
+
export function observeHostVersion(host, pathEnv) {
|
|
5
|
+
const executable = executableOnPath(host, pathEnv);
|
|
6
|
+
if (!executable)
|
|
7
|
+
return null;
|
|
8
|
+
const result = spawnSync(executable, ['--version'], {
|
|
9
|
+
encoding: 'utf8',
|
|
10
|
+
shell: false,
|
|
11
|
+
timeout: 5000,
|
|
12
|
+
maxBuffer: 16 * 1024,
|
|
13
|
+
env: { ...process.env, PATH: pathEnv },
|
|
14
|
+
});
|
|
15
|
+
if (result.error || result.status !== 0)
|
|
16
|
+
return null;
|
|
17
|
+
return (/(?:^|\s)([0-9]+\.[0-9]+\.[0-9]+)(?:\s|$)/.exec(`${result.stdout}\n${result.stderr}`)?.[1] ?? null);
|
|
18
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,4 +2,3 @@ export { getPackageInfo, getPackageRoot } from './package-info.js';
|
|
|
2
2
|
export type { PackageInfo } from './package-info.js';
|
|
3
3
|
export { HostAdapter, HostIntegrationService, type HostIntegrationOptions, type HostTargetOptions, } from './hosts/integration/service.js';
|
|
4
4
|
export { mapNativeHookEvent, runHostHook, type HostHookOptions, type NativeHookMapping, } from './hosts/integration/hook.js';
|
|
5
|
-
export * from './app/collaboration.js';
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
1
|
export { getPackageInfo, getPackageRoot } from './package-info.js';
|
|
2
2
|
export { HostAdapter, HostIntegrationService, } from './hosts/integration/service.js';
|
|
3
3
|
export { mapNativeHookEvent, runHostHook, } from './hosts/integration/hook.js';
|
|
4
|
-
export * from './app/collaboration.js';
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bounded, read-only access to one explicit regular file.
|
|
3
|
+
*
|
|
4
|
+
* The pathname is observed first so obviously unsafe entries are refused without
|
|
5
|
+
* opening them. The open itself is nonblocking/no-follow on POSIX, so a regular
|
|
6
|
+
* file replaced by a FIFO or symlink between inspection and open cannot block or
|
|
7
|
+
* redirect the read; the descriptor is re-validated afterwards for type and size.
|
|
8
|
+
*/
|
|
9
|
+
export type BoundedFileFailureCode = 'path_not_absolute' | 'symlink' | 'not_regular' | 'too_large' | 'unreadable';
|
|
10
|
+
export type BoundedFileResult = {
|
|
11
|
+
readonly ok: true;
|
|
12
|
+
readonly bytes: Buffer;
|
|
13
|
+
readonly text: string;
|
|
14
|
+
readonly digest: string;
|
|
15
|
+
} | {
|
|
16
|
+
readonly ok: false;
|
|
17
|
+
readonly code: BoundedFileFailureCode;
|
|
18
|
+
};
|
|
19
|
+
export declare function readBoundedFile(file: string, maxBytes: number): BoundedFileResult;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import crypto from 'node:crypto';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
const digestOf = (bytes) => `sha256:${crypto.createHash('sha256').update(bytes).digest('hex')}`;
|
|
5
|
+
const nonblockingFlag = () => process.platform === 'win32' ? 0 : (fs.constants.O_NONBLOCK ?? 0);
|
|
6
|
+
export function readBoundedFile(file, maxBytes) {
|
|
7
|
+
if (!Number.isSafeInteger(maxBytes) || maxBytes <= 0) {
|
|
8
|
+
throw new Error('Bounded read limit must be a positive integer.');
|
|
9
|
+
}
|
|
10
|
+
if (!path.isAbsolute(file)) {
|
|
11
|
+
return { ok: false, code: 'path_not_absolute' };
|
|
12
|
+
}
|
|
13
|
+
let observed;
|
|
14
|
+
try {
|
|
15
|
+
observed = fs.lstatSync(file);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return { ok: false, code: 'unreadable' };
|
|
19
|
+
}
|
|
20
|
+
if (observed.isSymbolicLink())
|
|
21
|
+
return { ok: false, code: 'symlink' };
|
|
22
|
+
if (!observed.isFile())
|
|
23
|
+
return { ok: false, code: 'not_regular' };
|
|
24
|
+
if (observed.size > maxBytes)
|
|
25
|
+
return { ok: false, code: 'too_large' };
|
|
26
|
+
const flags = fs.constants.O_RDONLY | (fs.constants.O_NOFOLLOW ?? 0) | nonblockingFlag();
|
|
27
|
+
let handle;
|
|
28
|
+
try {
|
|
29
|
+
handle = fs.openSync(file, flags);
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
const code = typeof error === 'object' && error !== null && 'code' in error
|
|
33
|
+
? String(error.code)
|
|
34
|
+
: null;
|
|
35
|
+
return { ok: false, code: code === 'ELOOP' ? 'symlink' : 'unreadable' };
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
const stat = fs.fstatSync(handle);
|
|
39
|
+
if (!stat.isFile())
|
|
40
|
+
return { ok: false, code: 'not_regular' };
|
|
41
|
+
if (stat.size > maxBytes)
|
|
42
|
+
return { ok: false, code: 'too_large' };
|
|
43
|
+
// Read at most the observed size (already bounded); never read until EOF.
|
|
44
|
+
const bytes = Buffer.alloc(stat.size);
|
|
45
|
+
let total = 0;
|
|
46
|
+
while (total < bytes.length) {
|
|
47
|
+
const read = fs.readSync(handle, bytes, total, bytes.length - total, total);
|
|
48
|
+
if (read === 0)
|
|
49
|
+
break;
|
|
50
|
+
total += read;
|
|
51
|
+
}
|
|
52
|
+
const content = bytes.subarray(0, total);
|
|
53
|
+
return {
|
|
54
|
+
ok: true,
|
|
55
|
+
bytes: content,
|
|
56
|
+
text: content.toString('utf8'),
|
|
57
|
+
digest: digestOf(content),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return { ok: false, code: 'unreadable' };
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
fs.closeSync(handle);
|
|
65
|
+
}
|
|
66
|
+
}
|
package/dist/infra/fs.js
CHANGED
|
@@ -51,9 +51,17 @@ export async function readFileBounded(path, maxBytes = DEFAULT_CONFIG_MAX_BYTES)
|
|
|
51
51
|
if (!stats.isFile()) {
|
|
52
52
|
return failed(diagnosticCodes.fileNotRegular, `Not a regular file: ${path}`, { nextAction: 'Replace it with a regular file.' });
|
|
53
53
|
}
|
|
54
|
-
|
|
54
|
+
// Size the allocation to the opened file, rather than the caller's ceiling.
|
|
55
|
+
// Keep one extra byte to detect overflow, including files that grow after
|
|
56
|
+
// fstat; a small runtime dependency must not allocate the 64 MiB ceiling.
|
|
57
|
+
let buffer = Buffer.allocUnsafe(Math.min(stats.size, maxBytes) + 1);
|
|
55
58
|
let total = 0;
|
|
56
|
-
while (total
|
|
59
|
+
while (total <= maxBytes) {
|
|
60
|
+
if (total === buffer.length) {
|
|
61
|
+
const grown = Buffer.allocUnsafe(Math.min(maxBytes + 1, Math.max(4096, buffer.length * 2)));
|
|
62
|
+
buffer.copy(grown, 0, 0, total);
|
|
63
|
+
buffer = grown;
|
|
64
|
+
}
|
|
57
65
|
const { bytesRead } = await handle.read(buffer, total, buffer.length - total, null);
|
|
58
66
|
if (bytesRead === 0)
|
|
59
67
|
break;
|
package/dist/infra/git.d.ts
CHANGED
|
@@ -45,6 +45,12 @@ export interface InspectGitRepositoryOptions {
|
|
|
45
45
|
readonly timeoutMs?: number;
|
|
46
46
|
readonly maxOutputBytes?: number;
|
|
47
47
|
readonly signal?: AbortSignal;
|
|
48
|
+
/**
|
|
49
|
+
* Set to `false` when the caller derives working-tree state from its own
|
|
50
|
+
* diffs. The observation then reports `dirty: null` instead of spawning an
|
|
51
|
+
* additional `git status` scan.
|
|
52
|
+
*/
|
|
53
|
+
readonly workingTreeState?: boolean;
|
|
48
54
|
}
|
|
49
55
|
/**
|
|
50
56
|
* Observes a repository without modifying the index, refs, or working tree.
|
|
@@ -58,3 +64,26 @@ export declare function inspectGitRepository(candidateRoot: string, options?: In
|
|
|
58
64
|
* "nothing is ignored".
|
|
59
65
|
*/
|
|
60
66
|
export declare function filterGitIgnored(repositoryRoot: string, candidates: readonly string[], options?: InspectGitRepositoryOptions): Promise<Outcome<readonly string[]>>;
|
|
67
|
+
export interface GitObservationScope {
|
|
68
|
+
readonly repository: (root: string, options?: InspectGitRepositoryOptions) => Promise<Outcome<GitRepositoryObservation>>;
|
|
69
|
+
}
|
|
70
|
+
export interface GitObservationScopeOptions {
|
|
71
|
+
/**
|
|
72
|
+
* Default for `InspectGitRepositoryOptions.workingTreeState`; `true` keeps the
|
|
73
|
+
* `inspectGitRepository` behaviour. Callers that derive working-tree state from
|
|
74
|
+
* their own diffs opt out to save one `git status` scan per checkout.
|
|
75
|
+
*/
|
|
76
|
+
readonly workingTreeState?: boolean;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Memoizes Git repository probes for exactly one operation.
|
|
80
|
+
*
|
|
81
|
+
* Repository identity (root, git dir, HEAD, branch) is immutable for the
|
|
82
|
+
* duration of a single command, so repeated inspections of the same checkout
|
|
83
|
+
* reuse the first observation instead of spawning equivalent Git processes.
|
|
84
|
+
* Working-tree state is *not* immutable: the scope therefore only lives inside
|
|
85
|
+
* one operation and must never be reused across operations or persisted. Callers
|
|
86
|
+
* that re-observe a tree after mutation (code prepare) keep using the scope for
|
|
87
|
+
* identity probes while the working-tree diff is always re-read.
|
|
88
|
+
*/
|
|
89
|
+
export declare function createGitObservationScope(options?: GitObservationScopeOptions): GitObservationScope;
|