toolroll 0.9.65 → 0.9.68
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/CHANGELOG.md +93 -0
- package/README.md +20 -2
- package/dist/acp-client.js +1 -3
- package/dist/agent-board.d.ts +0 -1
- package/dist/agent-board.js +0 -1
- package/dist/agent-fence.d.ts +69 -2
- package/dist/agent-fence.js +294 -11
- package/dist/agentconfig.js +4 -1
- package/dist/batch-checks.js +3 -2
- package/dist/browser/THIRD_PARTY_NOTICES.txt +46 -0
- package/dist/browser/terminal.js +134 -23
- package/dist/browser/workspace.css +2 -2
- package/dist/browser/workspace.js +31 -29
- package/dist/builder.d.ts +4 -0
- package/dist/builder.js +56 -37
- package/dist/canonical-json.d.ts +14 -0
- package/dist/canonical-json.js +36 -0
- package/dist/chat-actions.js +1 -2
- package/dist/chat-admission.d.ts +19 -0
- package/dist/chat-admission.js +22 -0
- package/dist/chat-channel.js +1 -1
- package/dist/chat-delivery.js +0 -1
- package/dist/chat-follow.d.ts +17 -0
- package/dist/chat-follow.js +32 -0
- package/dist/chat-messages.js +0 -1
- package/dist/chat-settings-page.d.ts +23 -0
- package/dist/chat-settings-page.js +41 -0
- package/dist/claim.js +3 -6
- package/dist/claude-print.d.ts +12 -0
- package/dist/claude-print.js +34 -0
- package/dist/cli-http.d.ts +0 -7
- package/dist/cli-http.js +0 -21
- package/dist/cli.d.ts +3 -10
- package/dist/cli.js +15 -24
- package/dist/coding-provider.js +2 -1
- package/dist/coding-workspace.js +1 -1
- package/dist/{team-cli.d.ts → connect-cli.d.ts} +5 -9
- package/dist/connect-cli.js +331 -0
- package/dist/containment.d.ts +0 -2
- package/dist/containment.js +2 -6
- package/dist/contracts/chat-actions.d.ts +0 -1
- package/dist/contracts/chat-content.d.ts +0 -4
- package/dist/contracts/chat-content.js +0 -2
- package/dist/contracts/chat-tables.d.ts +0 -1
- package/dist/contracts/cli.d.ts +0 -62
- package/dist/contracts/cli.js +0 -4
- package/dist/contracts/coding-workspace.js +1 -1
- package/dist/contracts/console-api.d.ts +1 -0
- package/dist/contracts/console-api.js +1 -0
- package/dist/contracts/contract.js +1 -1
- package/dist/contracts/flow-card.d.ts +0 -1
- package/dist/contracts/flow-propose.d.ts +0 -1
- package/dist/contracts/flow-send.js +1 -1
- package/dist/contracts/gateway-tools.d.ts +0 -1
- package/dist/contracts/integration-metadata.js +1 -1
- package/dist/contracts/lead-tools.d.ts +0 -1
- package/dist/contracts/memory-pass.d.ts +0 -1
- package/dist/contracts/memory-pass.js +1 -1
- package/dist/contracts/plan.js +1 -1
- package/dist/contracts/project-knowledge.js +1 -1
- package/dist/contracts/project-skills.d.ts +0 -1
- package/dist/contracts/proof.js +1 -1
- package/dist/contracts/recipes.js +1 -1
- package/dist/contracts/scope.js +1 -1
- package/dist/contracts/scout-report.js +1 -1
- package/dist/contracts/teams-callback.d.ts +0 -1
- package/dist/converse.d.ts +0 -6
- package/dist/converse.js +0 -19
- package/dist/daemon.js +3 -2
- package/dist/decision.d.ts +1 -3
- package/dist/deprecations.d.ts +12 -4
- package/dist/deprecations.js +27 -4
- package/dist/desktop-update-recovery.js +1 -1
- package/dist/desktop-update.js +3 -2
- package/dist/discord-chat.js +4 -15
- package/dist/discord-settings.d.ts +2 -6
- package/dist/discord-settings.js +10 -38
- package/dist/discord.js +12 -23
- package/dist/evidence.d.ts +0 -1
- package/dist/evidence.js +0 -3
- package/dist/exec.d.ts +0 -9
- package/dist/exec.js +3 -81
- package/dist/flow-actions.js +0 -3
- package/dist/flow-draft.d.ts +1 -3
- package/dist/flow-draft.js +15 -28
- package/dist/flow-scripts.d.ts +1 -8
- package/dist/flow-scripts.js +0 -13
- package/dist/flow-send.js +1 -1
- package/dist/flow-share.d.ts +0 -2
- package/dist/flow-share.js +1 -6
- package/dist/flow-steps.js +1 -1
- package/dist/flow-triggers.d.ts +0 -1
- package/dist/flow-triggers.js +1 -2
- package/dist/flow-unattended.js +1 -12
- package/dist/flows.js +1 -1
- package/dist/health-cli.d.ts +2 -2
- package/dist/health-cli.js +1 -1
- package/dist/invoke.d.ts +18 -3
- package/dist/invoke.js +142 -17
- package/dist/is-record.d.ts +2 -0
- package/dist/is-record.js +2 -0
- package/dist/lead-doors.d.ts +1 -5
- package/dist/lead-doors.js +0 -4
- package/dist/lead-tools.js +3 -6
- package/dist/live-detail.d.ts +0 -1
- package/dist/live-detail.js +0 -6
- package/dist/live-terminal.d.ts +24 -13
- package/dist/live-terminal.js +81 -43
- package/dist/live.d.ts +0 -1
- package/dist/live.js +1 -2
- package/dist/mcp-core.js +0 -2
- package/dist/memory-pass.js +1 -1
- package/dist/model-catalog.js +1 -1
- package/dist/modes.js +1 -12
- package/dist/operate.d.ts +2 -0
- package/dist/operate.js +436 -745
- package/dist/password-bearer.d.ts +0 -2
- package/dist/password-bearer.js +0 -4
- package/dist/peek-cli.js +2 -1
- package/dist/peek.d.ts +2 -26
- package/dist/peek.js +2 -168
- package/dist/phase-routing.d.ts +0 -4
- package/dist/phase-routing.js +2 -21
- package/dist/planner-source.d.ts +2 -1
- package/dist/planner-source.js +2 -12
- package/dist/planner.js +2 -14
- package/dist/process-tree.d.ts +0 -2
- package/dist/process-tree.js +0 -10
- package/dist/project-delete-ui.d.ts +6 -0
- package/dist/project-delete-ui.js +20 -1
- package/dist/project-delete.d.ts +0 -2
- package/dist/project-delete.js +1 -3
- package/dist/project-learning.d.ts +0 -14
- package/dist/project-skills.d.ts +0 -1
- package/dist/project-skills.js +0 -14
- package/dist/project-tools.js +2 -10
- package/dist/provider.d.ts +0 -17
- package/dist/provider.js +0 -26
- package/dist/pulls.d.ts +0 -2
- package/dist/pulls.js +0 -9
- package/dist/release-adapters.d.ts +9 -0
- package/dist/release-adapters.js +81 -4
- package/dist/release.d.ts +7 -1
- package/dist/release.js +20 -7
- package/dist/remote-exec.d.ts +3 -2
- package/dist/remote-exec.js +3 -2
- package/dist/repos.d.ts +0 -5
- package/dist/repos.js +2 -10
- package/dist/repository-context.d.ts +0 -2
- package/dist/repository-context.js +0 -4
- package/dist/restart-certification.d.ts +0 -2
- package/dist/restart-certification.js +1 -5
- package/dist/result-follow-ups.d.ts +1 -4
- package/dist/result-follow-ups.js +4 -8
- package/dist/result-review.d.ts +0 -2
- package/dist/result-review.js +0 -2
- package/dist/retention.d.ts +0 -1
- package/dist/retention.js +0 -1
- package/dist/review-context.d.ts +0 -1
- package/dist/review-context.js +1 -12
- package/dist/reviewer.d.ts +0 -16
- package/dist/reviewer.js +0 -18
- package/dist/run-closeout.js +2 -1
- package/dist/scope.d.ts +13 -0
- package/dist/scope.js +11 -18
- package/dist/scout-browser.js +2 -1
- package/dist/serve.js +3 -2
- package/dist/server/chrome.d.ts +10 -1
- package/dist/server/chrome.js +45 -4
- package/dist/server/console.css +60 -137
- package/dist/server/flows.js +2 -2
- package/dist/server/http.d.ts +2 -0
- package/dist/server/http.js +5 -0
- package/dist/server/pages.js +2 -2
- package/dist/server/people-tokens.js +3 -4
- package/dist/server/remote.js +1 -6
- package/dist/server/render-chat.d.ts +9 -2
- package/dist/server/render-chat.js +53 -7
- package/dist/server/render-pages.d.ts +28 -3
- package/dist/server/render-pages.js +78 -9
- package/dist/server/render-results.d.ts +0 -6
- package/dist/server/render-results.js +3 -9
- package/dist/server/render-tasks.js +6 -6
- package/dist/server/route-table.d.ts +0 -4
- package/dist/server/route-table.js +1 -6
- package/dist/server/settings.js +43 -22
- package/dist/server/task-views.js +1 -1
- package/dist/server/tasks.js +10 -7
- package/dist/setup-guide.d.ts +2 -2
- package/dist/skills.d.ts +0 -6
- package/dist/skills.js +0 -8
- package/dist/slack-chat.d.ts +1 -7
- package/dist/slack-chat.js +5 -18
- package/dist/slack-settings.d.ts +2 -6
- package/dist/slack-settings.js +10 -38
- package/dist/slack.js +12 -23
- package/dist/sleep.d.ts +2 -0
- package/dist/sleep.js +2 -0
- package/dist/store.d.ts +11 -74
- package/dist/store.js +36 -179
- package/dist/structured-output.d.ts +0 -1
- package/dist/structured-output.js +0 -1
- package/dist/subagent-work.d.ts +0 -2
- package/dist/subagent-work.js +0 -2
- package/dist/subagents.d.ts +1 -3
- package/dist/subagents.js +20 -33
- package/dist/subscription-chat.d.ts +1 -3
- package/dist/subscription-chat.js +2 -3
- package/dist/task-sizing.d.ts +1 -4
- package/dist/task-sizing.js +3 -10
- package/dist/teams-chat.js +4 -11
- package/dist/teams.js +12 -19
- package/dist/teardown-git.d.ts +22 -0
- package/dist/teardown-git.js +136 -2
- package/dist/telegram-lead.js +2 -2
- package/dist/telegram.js +1 -1
- package/dist/token-notices.d.ts +0 -11
- package/dist/token-notices.js +1 -5
- package/dist/tool-broker.d.ts +12 -0
- package/dist/tool-broker.js +66 -2
- package/dist/tool-secret-store.d.ts +0 -3
- package/dist/tool-secret-store.js +2 -11
- package/dist/toolroll-update.d.ts +0 -2
- package/dist/toolroll-update.js +2 -2
- package/dist/unfenced-test-support.d.ts +2 -0
- package/dist/unfenced-test-support.js +11 -0
- package/dist/verification-evidence.d.ts +0 -1
- package/dist/verification-evidence.js +0 -1
- package/dist/webhooks.d.ts +0 -1
- package/dist/webhooks.js +0 -1
- package/dist/workspace-ui.d.ts +0 -8
- package/dist/workspace-ui.js +1 -6
- package/dist/writes-mode.d.ts +9 -0
- package/dist/writes-mode.js +8 -0
- package/package.json +5 -1
- package/dist/contracts/native-census.d.ts +0 -42
- package/dist/contracts/native-census.js +0 -36
- package/dist/process-recovery-anchor.d.ts +0 -75
- package/dist/process-recovery-anchor.js +0 -188
- package/dist/process-recovery-coalition.d.ts +0 -25
- package/dist/process-recovery-coalition.js +0 -105
- package/dist/process-recovery-eligibility.d.ts +0 -179
- package/dist/process-recovery-eligibility.js +0 -174
- package/dist/process-recovery-native.d.ts +0 -161
- package/dist/process-recovery-native.js +0 -595
- package/dist/process-recovery-provenance.d.ts +0 -163
- package/dist/process-recovery-provenance.js +0 -292
- package/dist/process-recovery-services.d.ts +0 -56
- package/dist/process-recovery-services.js +0 -191
- package/dist/process-recovery-settlement.d.ts +0 -32
- package/dist/process-recovery-settlement.js +0 -133
- package/dist/process-recovery.d.ts +0 -41
- package/dist/process-recovery.js +0 -91
- package/dist/session-brief.d.ts +0 -8
- package/dist/session-brief.js +0 -24
- package/dist/session-cli.d.ts +0 -42
- package/dist/session-cli.js +0 -271
- package/dist/session-contract.d.ts +0 -183
- package/dist/session-contract.js +0 -122
- package/dist/session-remote.d.ts +0 -19
- package/dist/session-remote.js +0 -86
- package/dist/session-service.d.ts +0 -22
- package/dist/session-service.js +0 -157
- package/dist/team-cli.js +0 -692
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
import { type DarwinServiceAnchorInput, type DarwinServiceAnchorReceipt, type RecoveryReadDatabase } from "./process-recovery-anchor.js";
|
|
2
|
-
import { type DarwinCoalitionRecoverySnapshot } from "./process-recovery-native.js";
|
|
3
|
-
import { type PreexistingAppService } from "./process-recovery-services.js";
|
|
4
|
-
export declare const LEGACY_PROVENANCE_PROFILE_V1_SHA256 = "80bf37a0ddaf1765cf1f88c0fc37616f92c595f6dc15c1899a6d6cc3e8f2c754";
|
|
5
|
-
type Prefix = {
|
|
6
|
-
path: string;
|
|
7
|
-
bytes: number;
|
|
8
|
-
sha256: string;
|
|
9
|
-
};
|
|
10
|
-
type FileBinding = {
|
|
11
|
-
path: string;
|
|
12
|
-
sha256: string;
|
|
13
|
-
};
|
|
14
|
-
export type LegacyProvenanceProfile = {
|
|
15
|
-
schema: 1;
|
|
16
|
-
kind: "codex-local-prepared-run-provenance-v1";
|
|
17
|
-
appSession: string;
|
|
18
|
-
threadId: string;
|
|
19
|
-
bundle: {
|
|
20
|
-
asarPath: string;
|
|
21
|
-
members: {
|
|
22
|
-
path: string;
|
|
23
|
-
sha256: string;
|
|
24
|
-
}[];
|
|
25
|
-
cliPath: string;
|
|
26
|
-
cliSha256: string;
|
|
27
|
-
infoPath: string;
|
|
28
|
-
infoSha256: string;
|
|
29
|
-
cliVersion: string;
|
|
30
|
-
appVersion: string;
|
|
31
|
-
};
|
|
32
|
-
startup: Prefix & {
|
|
33
|
-
spawnLine: number;
|
|
34
|
-
connectionLine: number;
|
|
35
|
-
cliVersionLine: number;
|
|
36
|
-
appVersionLine: number;
|
|
37
|
-
};
|
|
38
|
-
rollout: Prefix & {
|
|
39
|
-
invocationLine: number;
|
|
40
|
-
startLine: number;
|
|
41
|
-
completionLine: number;
|
|
42
|
-
};
|
|
43
|
-
invocation: {
|
|
44
|
-
callId: string;
|
|
45
|
-
turnId: string;
|
|
46
|
-
input: string;
|
|
47
|
-
sessionId: string;
|
|
48
|
-
command: string[];
|
|
49
|
-
cwd: string;
|
|
50
|
-
};
|
|
51
|
-
source: {
|
|
52
|
-
desktopPid: number;
|
|
53
|
-
desktopUniqueId: string;
|
|
54
|
-
desktopExecutable: string;
|
|
55
|
-
serverPid: number;
|
|
56
|
-
serverUniqueId: string;
|
|
57
|
-
};
|
|
58
|
-
target: {
|
|
59
|
-
runId: number;
|
|
60
|
-
taskRef: number;
|
|
61
|
-
base: string;
|
|
62
|
-
head: string;
|
|
63
|
-
scopeDigest: string;
|
|
64
|
-
startedAt: string;
|
|
65
|
-
finishedAt: string;
|
|
66
|
-
};
|
|
67
|
-
firstPartyAudit: {
|
|
68
|
-
source: FileBinding;
|
|
69
|
-
environment: FileBinding;
|
|
70
|
-
codeEvidence: FileBinding;
|
|
71
|
-
repository: string;
|
|
72
|
-
candidate: string;
|
|
73
|
-
tree: string;
|
|
74
|
-
installedSourceCommit: string;
|
|
75
|
-
command: string;
|
|
76
|
-
};
|
|
77
|
-
anchor: Omit<DarwinServiceAnchorInput, "native">;
|
|
78
|
-
};
|
|
79
|
-
/** Non-authoritative deterministic inspection for tests and diagnostics. Even
|
|
80
|
-
* successful input inspection cannot mint the opaque live receipt below. */
|
|
81
|
-
export declare function inspectLegacyProvenanceRecords(profile: LegacyProvenanceProfile, startupBytes: Buffer, rolloutBytes: Buffer): void;
|
|
82
|
-
/** Non-authoritative OS-fact inspection. The upper bound must come from the
|
|
83
|
-
* internally collected watch continuity, never a caller's calendar estimate. */
|
|
84
|
-
export declare function inspectLegacyExecutionAncestry(profile: LegacyProvenanceProfile, snapshot: DarwinCoalitionRecoverySnapshot, ownPid: number, upperBound: string): void;
|
|
85
|
-
export type CollectedLegacyProvenance = Readonly<{
|
|
86
|
-
kind: "collected-legacy-source-provenance";
|
|
87
|
-
profileSha256: string;
|
|
88
|
-
digest: string;
|
|
89
|
-
}>;
|
|
90
|
-
export type LegacyProvenanceReceipt = {
|
|
91
|
-
schema: 1;
|
|
92
|
-
profileSha256: string;
|
|
93
|
-
targetRun: number;
|
|
94
|
-
head: string;
|
|
95
|
-
scopeDigest: string;
|
|
96
|
-
observedAt: string;
|
|
97
|
-
host: string;
|
|
98
|
-
bootId: string;
|
|
99
|
-
resourceCoalitionId: string;
|
|
100
|
-
sourceRoot: {
|
|
101
|
-
pid: number;
|
|
102
|
-
uniqueId: string;
|
|
103
|
-
};
|
|
104
|
-
preRunUpperBound: {
|
|
105
|
-
pid: number;
|
|
106
|
-
uniqueId: string;
|
|
107
|
-
};
|
|
108
|
-
snapshotDigest: string;
|
|
109
|
-
sourcePrefixes: string[];
|
|
110
|
-
appSourceHashes: string[];
|
|
111
|
-
firstPartyAudit: {
|
|
112
|
-
candidate: string;
|
|
113
|
-
tree: string;
|
|
114
|
-
reportHashes: string[];
|
|
115
|
-
};
|
|
116
|
-
preexistingAppServices: PreexistingAppService[];
|
|
117
|
-
descendantScope: "direct-and-ordinary-fork-only";
|
|
118
|
-
assumptions: string[];
|
|
119
|
-
};
|
|
120
|
-
export type CollectedLegacyFacts = Readonly<{
|
|
121
|
-
receipt: LegacyProvenanceReceipt;
|
|
122
|
-
snapshot: DarwinCoalitionRecoverySnapshot;
|
|
123
|
-
anchor: DarwinServiceAnchorReceipt;
|
|
124
|
-
}>;
|
|
125
|
-
/** A parsed/copied/serialized certificate has no entry. A settlement caller must
|
|
126
|
-
* obtain this from the live collector in the SAME process and recheck custody. */
|
|
127
|
-
export declare function collectedLegacyProvenanceOf(proof: CollectedLegacyProvenance): CollectedLegacyFacts | null;
|
|
128
|
-
export declare function collectLegacySourceProvenance(db: RecoveryReadDatabase, input: {
|
|
129
|
-
profilePath: string;
|
|
130
|
-
compilationDirectory: string;
|
|
131
|
-
}): Promise<{
|
|
132
|
-
ok: false;
|
|
133
|
-
reason: string;
|
|
134
|
-
phase: string;
|
|
135
|
-
anchorReason: string;
|
|
136
|
-
} | {
|
|
137
|
-
anchorReason?: never;
|
|
138
|
-
ok: false;
|
|
139
|
-
reason: string;
|
|
140
|
-
phase: string;
|
|
141
|
-
detail: "app-service-observation-refused" | "app-service-platform-unrecognized";
|
|
142
|
-
servicePhase?: "final-census" | "initial-census" | "middle-census" | "owner-domain" | "owner-identity" | "owner-signature-bytes" | "owner-signature-display" | "owner-signature-verify" | "platform" | "repeated-binding" | "service-job";
|
|
143
|
-
} | {
|
|
144
|
-
reason?: never;
|
|
145
|
-
phase?: never;
|
|
146
|
-
anchorReason?: never;
|
|
147
|
-
receipt: LegacyProvenanceReceipt;
|
|
148
|
-
snapshot: DarwinCoalitionRecoverySnapshot;
|
|
149
|
-
anchor: DarwinServiceAnchorReceipt;
|
|
150
|
-
ok: true;
|
|
151
|
-
proof: Readonly<{
|
|
152
|
-
kind: "collected-legacy-source-provenance";
|
|
153
|
-
profileSha256: string;
|
|
154
|
-
digest: string;
|
|
155
|
-
}>;
|
|
156
|
-
} | {
|
|
157
|
-
anchorReason?: never;
|
|
158
|
-
ok: false;
|
|
159
|
-
reason: string;
|
|
160
|
-
phase: string;
|
|
161
|
-
detail?: string;
|
|
162
|
-
}>;
|
|
163
|
-
export {};
|
|
@@ -1,292 +0,0 @@
|
|
|
1
|
-
/** Narrow legacy provenance collection; no exit or database mutation authority.
|
|
2
|
-
* A reviewed profile pins historical bytes, not caller-supplied conclusions.
|
|
3
|
-
* Only this module's live collection can mint an opaque receipt. Serialized
|
|
4
|
-
* reports and the exported document inspection are never accepted as proof. */
|
|
5
|
-
import { createHash } from "node:crypto";
|
|
6
|
-
import { execFileSync } from "node:child_process";
|
|
7
|
-
import { closeSync, constants, fstatSync, openSync, readFileSync, readSync, realpathSync, rmSync } from "node:fs";
|
|
8
|
-
import { dirname } from "node:path";
|
|
9
|
-
import { normalizeBootId } from "./boot-identity.js";
|
|
10
|
-
import { collectDarwinServiceAnchor } from "./process-recovery-anchor.js";
|
|
11
|
-
import { changedDarwinProcessIdentities, collectDarwinCoalitionSnapshot, prepareDarwinProcessCensus } from "./process-recovery-native.js";
|
|
12
|
-
import { collectPreexistingAppServices } from "./process-recovery-services.js";
|
|
13
|
-
// Reviewed legacy profile; paths and operator/run identities remain private.
|
|
14
|
-
export const LEGACY_PROVENANCE_PROFILE_V1_SHA256 = "80bf37a0ddaf1765cf1f88c0fc37616f92c595f6dc15c1899a6d6cc3e8f2c754";
|
|
15
|
-
const APP_MEMBERS = [
|
|
16
|
-
[".vite/build/src-CCXHtyvY.js", "a42da38cbb14b28399f1d54fcf453bffc5e9802663e7e098f187c8378f4c7a40"],
|
|
17
|
-
[".vite/build/main-DaMR-wdT.js", "0765260be74e8843630d5a92e30bca574783892688e67180c119a5c58679bb61"],
|
|
18
|
-
];
|
|
19
|
-
const hash = (bytes) => createHash("sha256").update(bytes).digest("hex");
|
|
20
|
-
const positive = (n) => Number.isSafeInteger(n) && Number(n) > 0;
|
|
21
|
-
const same = (a, b) => JSON.stringify(a) === JSON.stringify(b);
|
|
22
|
-
const requireFact = (ok, code) => { if (!ok)
|
|
23
|
-
throw Error(code); };
|
|
24
|
-
function ownedFile(path) {
|
|
25
|
-
requireFact(realpathSync(path) === path, "source-path-not-canonical");
|
|
26
|
-
const fd = openSync(path, constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
27
|
-
const stat = fstatSync(fd);
|
|
28
|
-
if (!stat.isFile() || (stat.uid !== process.getuid?.() && stat.uid !== 0) || (stat.mode & 0o022) !== 0) {
|
|
29
|
-
closeSync(fd);
|
|
30
|
-
throw Error("source-file-not-owned");
|
|
31
|
-
}
|
|
32
|
-
return fd;
|
|
33
|
-
}
|
|
34
|
-
function prefixBytes(source) {
|
|
35
|
-
requireFact(positive(source.bytes) && source.bytes <= 128 * 1024 * 1024, "source-prefix-size-invalid");
|
|
36
|
-
const fd = ownedFile(source.path);
|
|
37
|
-
try {
|
|
38
|
-
requireFact(fstatSync(fd).size >= source.bytes, "source-prefix-missing");
|
|
39
|
-
const bytes = Buffer.alloc(source.bytes);
|
|
40
|
-
let at = 0;
|
|
41
|
-
while (at < bytes.length) {
|
|
42
|
-
const read = readSync(fd, bytes, at, bytes.length - at, at);
|
|
43
|
-
requireFact(read > 0, "source-prefix-missing");
|
|
44
|
-
at += read;
|
|
45
|
-
}
|
|
46
|
-
requireFact(hash(bytes) === source.sha256, "source-prefix-changed");
|
|
47
|
-
return bytes;
|
|
48
|
-
}
|
|
49
|
-
finally {
|
|
50
|
-
closeSync(fd);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
function completeHash(path) {
|
|
54
|
-
const fd = ownedFile(path);
|
|
55
|
-
try {
|
|
56
|
-
return hash(readFileSync(fd));
|
|
57
|
-
}
|
|
58
|
-
finally {
|
|
59
|
-
closeSync(fd);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
function asarMember(path, member) {
|
|
63
|
-
const fd = ownedFile(path);
|
|
64
|
-
try {
|
|
65
|
-
const prefix = Buffer.alloc(16);
|
|
66
|
-
requireFact(readSync(fd, prefix, 0, 16, 0) === 16 && prefix.readUInt32LE(0) === 4, "app-archive-unreadable");
|
|
67
|
-
const headerSize = prefix.readUInt32LE(4), jsonSize = prefix.readUInt32LE(12);
|
|
68
|
-
requireFact(jsonSize > 0 && jsonSize <= 16 * 1024 * 1024 && headerSize >= jsonSize + 8 && headerSize <= jsonSize + 16, "app-archive-unreadable");
|
|
69
|
-
const bytes = Buffer.alloc(jsonSize);
|
|
70
|
-
requireFact(readSync(fd, bytes, 0, jsonSize, 16) === jsonSize, "app-archive-unreadable");
|
|
71
|
-
let entry = JSON.parse(bytes.toString("utf8"));
|
|
72
|
-
for (const part of member.split("/")) {
|
|
73
|
-
requireFact(part && part !== "." && part !== "..", "app-member-unreadable");
|
|
74
|
-
entry = entry?.files?.[part];
|
|
75
|
-
}
|
|
76
|
-
requireFact(entry && !entry.link && !entry.unpacked && positive(entry.size) && entry.size <= 16 * 1024 * 1024 && /^\d+$/.test(entry.offset), "app-member-unreadable");
|
|
77
|
-
const offset = 8 + headerSize + Number(entry.offset);
|
|
78
|
-
requireFact(Number.isSafeInteger(offset) && offset + entry.size <= fstatSync(fd).size, "app-member-unreadable");
|
|
79
|
-
const result = Buffer.alloc(entry.size);
|
|
80
|
-
requireFact(readSync(fd, result, 0, result.length, offset) === result.length, "app-member-unreadable");
|
|
81
|
-
return result;
|
|
82
|
-
}
|
|
83
|
-
finally {
|
|
84
|
-
closeSync(fd);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
function auditSources(profile) {
|
|
88
|
-
const a = profile.firstPartyAudit;
|
|
89
|
-
const read = (binding) => {
|
|
90
|
-
const fd = ownedFile(binding.path);
|
|
91
|
-
try {
|
|
92
|
-
requireFact(fstatSync(fd).size <= 8 * 1024 * 1024, "audit-too-large");
|
|
93
|
-
const bytes = readFileSync(fd);
|
|
94
|
-
requireFact(hash(bytes) === binding.sha256, "reviewed-audit-changed");
|
|
95
|
-
return JSON.parse(bytes.toString("utf8"));
|
|
96
|
-
}
|
|
97
|
-
finally {
|
|
98
|
-
closeSync(fd);
|
|
99
|
-
}
|
|
100
|
-
};
|
|
101
|
-
const source = read(a.source), environment = read(a.environment), code = read(a.codeEvidence);
|
|
102
|
-
for (const binding of Object.values(environment.privateEvidenceBindings ?? {})) {
|
|
103
|
-
requireFact(completeHash(binding.path) === binding.sha256, "audited-wrapper-input-changed");
|
|
104
|
-
}
|
|
105
|
-
requireFact(a.candidate === profile.target.head && source.candidate === a.candidate && source.gitTree === a.tree && source.command === a.command &&
|
|
106
|
-
environment.candidate === a.candidate && environment.installedSourceCommit === a.installedSourceCommit && environment.verificationCommand === a.command &&
|
|
107
|
-
code.sourceCommit === a.installedSourceCommit && realpathSync(a.repository) === a.repository, "reviewed-audit-binding-mismatch");
|
|
108
|
-
const git = (args) => execFileSync("/usr/bin/git", ["--no-replace-objects", "-c", "core.fsmonitor=false", "-C", a.repository, ...args], {
|
|
109
|
-
env: { PATH: "/usr/bin:/bin", LC_ALL: "C", GIT_NO_LAZY_FETCH: "1", GIT_OPTIONAL_LOCKS: "0" },
|
|
110
|
-
timeout: 5000, maxBuffer: 8 * 1024 * 1024, stdio: ["ignore", "pipe", "pipe"],
|
|
111
|
-
});
|
|
112
|
-
requireFact(git(["cat-file", "-p", a.candidate]).toString("utf8").startsWith(`tree ${a.tree}\n`), "audited-tree-changed");
|
|
113
|
-
for (const [commit, files] of [[a.candidate, source.source], [a.installedSourceCommit, environment.sources]]) {
|
|
114
|
-
requireFact(files && Object.keys(files).length > 0, "audited-source-missing");
|
|
115
|
-
for (const [path, expected] of Object.entries(files))
|
|
116
|
-
requireFact(hash(git(["cat-file", "blob", `${commit}:${path}`])) === expected, "audited-source-changed");
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
/** Non-authoritative deterministic inspection for tests and diagnostics. Even
|
|
120
|
-
* successful input inspection cannot mint the opaque live receipt below. */
|
|
121
|
-
export function inspectLegacyProvenanceRecords(profile, startupBytes, rolloutBytes) {
|
|
122
|
-
const lines = (bytes) => bytes.toString("utf8").split("\n");
|
|
123
|
-
const at = (all, line) => { requireFact(positive(line) && line <= all.length, "source-record-missing"); return all[line - 1]; };
|
|
124
|
-
const startup = lines(startupBytes), rollout = lines(rolloutBytes), source = profile.source, invocation = profile.invocation;
|
|
125
|
-
requireFact(profile.schema === 1 && profile.kind === "codex-local-prepared-run-provenance-v1" &&
|
|
126
|
-
profile.anchor.targetRun === profile.target.runId, "profile-shape-invalid");
|
|
127
|
-
requireFact(profile.startup.path.includes(`codex-desktop-${profile.appSession}-${source.desktopPid}-`), "app-session-mismatch");
|
|
128
|
-
const spawned = at(startup, profile.startup.spawnLine), connected = at(startup, profile.startup.connectionLine);
|
|
129
|
-
requireFact(spawned.includes("[StdioConnection] stdio_transport_spawned ") &&
|
|
130
|
-
spawned.includes(`executablePath=${profile.bundle.cliPath} `) && spawned.includes(` pid=${source.serverPid} `) &&
|
|
131
|
-
spawned.endsWith(`spawnCommand=${profile.bundle.cliPath}`) && connected.endsWith("Transport start success connectionId=1 hostId=local transport=stdio"), "startup-transport-mismatch");
|
|
132
|
-
requireFact(at(startup, profile.startup.cliVersionLine).endsWith(`Current reported app-server version: currentVersion=${profile.bundle.cliVersion} hostId=local`) &&
|
|
133
|
-
at(startup, profile.startup.appVersionLine).includes(`appSessionId=${profile.appSession} `) &&
|
|
134
|
-
at(startup, profile.startup.appVersionLine).includes(` release=${profile.bundle.appVersion} `), "startup-version-mismatch");
|
|
135
|
-
const call = JSON.parse(at(rollout, profile.rollout.invocationLine));
|
|
136
|
-
const start = JSON.parse(at(rollout, profile.rollout.startLine));
|
|
137
|
-
const completion = JSON.parse(at(rollout, profile.rollout.completionLine));
|
|
138
|
-
requireFact(call.type === "response_item" && call.payload?.type === "custom_tool_call" && call.payload.name === "exec" &&
|
|
139
|
-
call.payload.call_id === invocation.callId && call.payload.input === invocation.input &&
|
|
140
|
-
call.payload.internal_chat_message_metadata_passthrough?.turn_id === invocation.turnId, "invocation-record-mismatch");
|
|
141
|
-
requireFact(start.type === "response_item" && start.payload?.type === "custom_tool_call_output" && start.payload.call_id === invocation.callId &&
|
|
142
|
-
start.payload.internal_chat_message_metadata_passthrough?.turn_id === invocation.turnId && Array.isArray(start.payload.output), "invocation-start-mismatch");
|
|
143
|
-
const starts = start.payload.output.flatMap((one) => {
|
|
144
|
-
if (one.type !== "input_text" || typeof one.text !== "string")
|
|
145
|
-
return [];
|
|
146
|
-
try {
|
|
147
|
-
const parsed = JSON.parse(one.text);
|
|
148
|
-
return parsed?.session_id !== undefined ? [parsed] : [];
|
|
149
|
-
}
|
|
150
|
-
catch {
|
|
151
|
-
return [];
|
|
152
|
-
}
|
|
153
|
-
});
|
|
154
|
-
requireFact(starts.length === 1 && String(starts[0].session_id) === invocation.sessionId, "invocation-session-mismatch");
|
|
155
|
-
const event = completion.payload, item = event?.item;
|
|
156
|
-
requireFact(completion.type === "event_msg" && event.type === "item_completed" && event.thread_id === profile.threadId && event.turn_id === invocation.turnId &&
|
|
157
|
-
item?.type === "CommandExecution" && item.source === "unified_exec_startup" && item.process_id === invocation.sessionId &&
|
|
158
|
-
item.status === "completed" && item.exit_code === 0 && same(item.command, invocation.command) && item.cwd === invocation.cwd, "command-completion-mismatch");
|
|
159
|
-
const returned = JSON.parse(item.stdout);
|
|
160
|
-
requireFact(returned.mode === "build" && returned.status === "tick-returned" && returned.exitCode === 0 && returned.results?.length === 1 &&
|
|
161
|
-
returned.results[0].id === profile.target.runId && returned.results[0].role === "builder" && returned.results[0].parentRun === null &&
|
|
162
|
-
returned.results[0].outcome === "built" && returned.results[0].head === profile.target.head && returned.results[0].finishedAt === profile.target.finishedAt, "native-run-return-mismatch");
|
|
163
|
-
const times = [call.timestamp, start.timestamp, profile.target.startedAt, profile.target.finishedAt, completion.timestamp].map(value => Date.parse(value));
|
|
164
|
-
requireFact(times.every(Number.isFinite) && times.every((value, i) => i === 0 || value >= times[i - 1]), "invocation-order-unproven");
|
|
165
|
-
}
|
|
166
|
-
/** Non-authoritative OS-fact inspection. The upper bound must come from the
|
|
167
|
-
* internally collected watch continuity, never a caller's calendar estimate. */
|
|
168
|
-
export function inspectLegacyExecutionAncestry(profile, snapshot, ownPid, upperBound) {
|
|
169
|
-
requireFact(snapshot.complete && snapshot.stable && snapshot.countersStable && snapshot.kernelTableRead && !snapshot.errors.length &&
|
|
170
|
-
!snapshot.identityChanges.length && !snapshot.anchorIdentityChanges.length && snapshot.host === profile.anchor.host &&
|
|
171
|
-
normalizeBootId(snapshot.bootId ?? "") === profile.anchor.bootId && snapshot.resourceCoalitionId === profile.anchor.resourceCoalitionId, "current-execution-census-unproven");
|
|
172
|
-
const rows = new Map(snapshot.processes.map(row => [row.pid, row]));
|
|
173
|
-
const source = rows.get(profile.source.serverPid), desktop = rows.get(profile.source.desktopPid);
|
|
174
|
-
requireFact(source?.uniqueId === profile.source.serverUniqueId && desktop?.uniqueId === profile.source.desktopUniqueId &&
|
|
175
|
-
source?.traced === false && desktop?.traced === false && source.ppid === desktop.pid && source.parentUniqueId === desktop.uniqueId &&
|
|
176
|
-
source.uid === desktop.uid && source.executable === profile.bundle.cliPath && desktop.executable === profile.source.desktopExecutable &&
|
|
177
|
-
/^[1-9][0-9]*$/.test(upperBound) && BigInt(source.uniqueId) <= BigInt(upperBound) && BigInt(desktop.uniqueId) < BigInt(source.uniqueId), "historical-source-identity-unproven");
|
|
178
|
-
const seen = new Set();
|
|
179
|
-
let row = rows.get(ownPid);
|
|
180
|
-
while (row && row.pid !== source.pid) {
|
|
181
|
-
requireFact(!seen.has(row.pid) && row.traced === false && row.uid === source.uid && row.uniqueId && row.ppid && row.ppid > 1, "current-execution-ancestry-unproven");
|
|
182
|
-
seen.add(row.pid);
|
|
183
|
-
const parent = rows.get(row.ppid);
|
|
184
|
-
requireFact(parent?.uniqueId && row.parentUniqueId === parent.uniqueId && BigInt(parent.uniqueId) < BigInt(row.uniqueId), "current-execution-ancestry-unproven");
|
|
185
|
-
row = parent;
|
|
186
|
-
}
|
|
187
|
-
requireFact(row?.pid === source.pid, "current-execution-ancestry-unproven");
|
|
188
|
-
const collector = snapshot.collector, probe = collector && rows.get(collector.pid);
|
|
189
|
-
requireFact(collector?.exited === true && probe?.uniqueId === collector.uniqueId && probe.ppid === ownPid &&
|
|
190
|
-
probe.parentUniqueId === rows.get(ownPid)?.uniqueId && probe.traced === false, "owned-collector-exit-unproven");
|
|
191
|
-
}
|
|
192
|
-
const minted = new WeakMap();
|
|
193
|
-
function freeze(value) {
|
|
194
|
-
if (value && typeof value === "object") {
|
|
195
|
-
for (const child of Object.values(value))
|
|
196
|
-
freeze(child);
|
|
197
|
-
Object.freeze(value);
|
|
198
|
-
}
|
|
199
|
-
return value;
|
|
200
|
-
}
|
|
201
|
-
/** A parsed/copied/serialized certificate has no entry. A settlement caller must
|
|
202
|
-
* obtain this from the live collector in the SAME process and recheck custody. */
|
|
203
|
-
export function collectedLegacyProvenanceOf(proof) { return minted.get(proof) ?? null; }
|
|
204
|
-
export async function collectLegacySourceProvenance(db, input) {
|
|
205
|
-
let native;
|
|
206
|
-
let phase = "reviewed-profile";
|
|
207
|
-
try {
|
|
208
|
-
const fd = ownedFile(input.profilePath);
|
|
209
|
-
let profile;
|
|
210
|
-
try {
|
|
211
|
-
requireFact(fstatSync(fd).size <= 32 * 1024, "profile-too-large");
|
|
212
|
-
const bytes = readFileSync(fd);
|
|
213
|
-
requireFact(hash(bytes) === LEGACY_PROVENANCE_PROFILE_V1_SHA256, "unreviewed-provenance-profile");
|
|
214
|
-
profile = JSON.parse(bytes.toString("utf8"));
|
|
215
|
-
}
|
|
216
|
-
finally {
|
|
217
|
-
closeSync(fd);
|
|
218
|
-
}
|
|
219
|
-
const revalidate = () => {
|
|
220
|
-
requireFact(completeHash(input.profilePath) === LEGACY_PROVENANCE_PROFILE_V1_SHA256 &&
|
|
221
|
-
same(profile.bundle.members.map(member => [member.path, member.sha256]), APP_MEMBERS), "unreviewed-provenance-profile");
|
|
222
|
-
for (const member of profile.bundle.members)
|
|
223
|
-
requireFact(hash(asarMember(profile.bundle.asarPath, member.path)) === member.sha256, "loaded-app-source-changed");
|
|
224
|
-
requireFact(completeHash(profile.bundle.cliPath) === profile.bundle.cliSha256 && completeHash(profile.bundle.infoPath) === profile.bundle.infoSha256, "installed-app-changed");
|
|
225
|
-
inspectLegacyProvenanceRecords(profile, prefixBytes(profile.startup), prefixBytes(profile.rollout));
|
|
226
|
-
auditSources(profile);
|
|
227
|
-
requireFact(process.env.CODEX_THREAD_ID === profile.threadId, "current-thread-mismatch");
|
|
228
|
-
const r = db.prepare("SELECT id,task_ref,base_revision,head_revision,scope_digest,started_at,finished_at FROM run WHERE id=?").get(profile.target.runId);
|
|
229
|
-
const t = profile.target;
|
|
230
|
-
requireFact(r && same([r.id, r.task_ref, r.base_revision, r.head_revision, r.scope_digest, r.started_at, r.finished_at], [t.runId, t.taskRef, t.base, t.head, t.scopeDigest, t.startedAt, t.finishedAt]), "target-run-changed");
|
|
231
|
-
};
|
|
232
|
-
phase = "historical-source-revalidation";
|
|
233
|
-
revalidate();
|
|
234
|
-
phase = "native-preparation";
|
|
235
|
-
native = prepareDarwinProcessCensus(input.compilationDirectory);
|
|
236
|
-
phase = "service-anchor";
|
|
237
|
-
const anchor = await collectDarwinServiceAnchor(db, { ...profile.anchor, native });
|
|
238
|
-
if (!anchor.ok)
|
|
239
|
-
return { ok: false, reason: "legacy-source-provenance-unproven", phase, anchorReason: anchor.reason };
|
|
240
|
-
phase = "current-execution-census";
|
|
241
|
-
const anchorPids = [profile.source.desktopPid, profile.source.serverPid, profile.anchor.workerPid, process.pid];
|
|
242
|
-
const initial = await collectDarwinCoalitionSnapshot({ native, resourceCoalitionId: profile.anchor.resourceCoalitionId,
|
|
243
|
-
anchorPids, maxAttempts: 3 });
|
|
244
|
-
phase = "pre-existing-app-services";
|
|
245
|
-
const services = await collectPreexistingAppServices({ snapshot: initial, native, anchorPids,
|
|
246
|
-
upperBound: { pid: anchor.receipt.worker.pid, uniqueId: anchor.receipt.worker.uniqueId } });
|
|
247
|
-
if (!services.ok)
|
|
248
|
-
return { ok: false, reason: "legacy-source-provenance-unproven", phase, detail: services.reason,
|
|
249
|
-
...(services.diagnostic ? { servicePhase: services.diagnostic.phase } : {}) };
|
|
250
|
-
const snapshot = services.snapshot;
|
|
251
|
-
const worker = snapshot.anchors.find(row => row.pid === profile.anchor.workerPid);
|
|
252
|
-
requireFact(worker && !changedDarwinProcessIdentities([anchor.receipt.worker], [worker]).length &&
|
|
253
|
-
worker.resourceCoalitionId === anchor.receipt.worker.resourceCoalitionId, "pre-run-anchor-changed");
|
|
254
|
-
phase = "current-execution-ancestry";
|
|
255
|
-
inspectLegacyExecutionAncestry(profile, snapshot, process.pid, anchor.receipt.worker.uniqueId);
|
|
256
|
-
phase = "historical-source-recheck";
|
|
257
|
-
revalidate();
|
|
258
|
-
const receipt = { schema: 1, profileSha256: LEGACY_PROVENANCE_PROFILE_V1_SHA256, targetRun: profile.target.runId,
|
|
259
|
-
head: profile.target.head, scopeDigest: profile.target.scopeDigest, observedAt: snapshot.finishedAt,
|
|
260
|
-
host: profile.anchor.host, bootId: profile.anchor.bootId, resourceCoalitionId: profile.anchor.resourceCoalitionId,
|
|
261
|
-
sourceRoot: { pid: profile.source.serverPid, uniqueId: profile.source.serverUniqueId },
|
|
262
|
-
preRunUpperBound: { pid: worker.pid, uniqueId: worker.uniqueId }, snapshotDigest: hash(JSON.stringify(snapshot)),
|
|
263
|
-
sourcePrefixes: [profile.startup.sha256, profile.rollout.sha256], appSourceHashes: profile.bundle.members.map(one => one.sha256),
|
|
264
|
-
firstPartyAudit: { candidate: profile.firstPartyAudit.candidate, tree: profile.firstPartyAudit.tree,
|
|
265
|
-
reportHashes: [profile.firstPartyAudit.source.sha256, profile.firstPartyAudit.environment.sha256, profile.firstPartyAudit.codeEvidence.sha256] },
|
|
266
|
-
preexistingAppServices: services.services,
|
|
267
|
-
descendantScope: "direct-and-ordinary-fork-only",
|
|
268
|
-
assumptions: ["Trusted installed app, OS, compiler, credential and append-only local-log model; current verified app bytes are the startup version's bytes.",
|
|
269
|
-
"Prepared run uses the audited ordinary local execution path. Historical HOME, PATH, npmrc, npm lifecycle and Git configuration were not sealed; no historical no-delegation attestation is created.",
|
|
270
|
-
"The pinned Apple Application-type speech service and launchd implementation bind each service to its exact pre-existing Chrome owner; this relies on trusted OS service creation and does not infer ownership from a name or launchd parent.",
|
|
271
|
-
"This proves source continuity conditionally; separate spawn-provenance eligibility, complete survivor assessment and exact custody recheck remain required."] };
|
|
272
|
-
const facts = freeze({ receipt, snapshot, anchor: anchor.receipt });
|
|
273
|
-
const proof = Object.freeze({ kind: "collected-legacy-source-provenance", profileSha256: receipt.profileSha256, digest: hash(JSON.stringify(receipt)) });
|
|
274
|
-
minted.set(proof, facts);
|
|
275
|
-
return { ok: true, proof, ...facts };
|
|
276
|
-
}
|
|
277
|
-
catch (error) {
|
|
278
|
-
// No source logs, paths, argv, environment or subprocess errors escape.
|
|
279
|
-
const safe = new Set(["current-thread-mismatch", "target-run-changed", "pre-run-anchor-changed", "current-execution-census-unproven",
|
|
280
|
-
"historical-source-identity-unproven", "current-execution-ancestry-unproven", "owned-collector-exit-unproven"]);
|
|
281
|
-
return { ok: false, reason: "legacy-source-provenance-unproven", phase,
|
|
282
|
-
...(error instanceof Error && safe.has(error.message) ? { detail: error.message } : {}) };
|
|
283
|
-
}
|
|
284
|
-
finally {
|
|
285
|
-
if (native) {
|
|
286
|
-
try {
|
|
287
|
-
rmSync(dirname(native.executablePath), { recursive: true, force: true });
|
|
288
|
-
}
|
|
289
|
-
catch { /* No custody is settled by temporary-file cleanup. */ }
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import { type DarwinCoalitionRecoverySnapshot, type PreparedDarwinProcessCensus } from "./process-recovery-native.js";
|
|
2
|
-
import type { ProcessRecoveryAnchor } from "./process-recovery.js";
|
|
3
|
-
export declare const APP_SERVICE_EXECUTABLE = "/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/SpeechSynthesis.framework/Versions/A/XPCServices/SpeechSynthesisServerXPC.xpc/Contents/MacOS/SpeechSynthesisServerXPC";
|
|
4
|
-
export declare const APP_SERVICE_PLATFORM: Readonly<{
|
|
5
|
-
osRelease: "25.5.0";
|
|
6
|
-
osBuild: "25F84";
|
|
7
|
-
serviceType: "Application";
|
|
8
|
-
label: "com.apple.speech.SpeechSynthesisServerXPC";
|
|
9
|
-
codesignSha256: "214d455584d19abc0d74d02b9cbc7d3da6bdcb0596c235e6156dd9ed2f4e1ba7";
|
|
10
|
-
clonePathSha256: "0e92ba8224883b668b6becb0f2768fdca1912630e176ded161b6786822ec2a73";
|
|
11
|
-
cloneSha256: "fe21b4086d7f035b17ce4c8ff9d1ceef88eb9510252a5b311d7a5aa48c352b32";
|
|
12
|
-
cloneCdHash: "fab09b6e6ce70ffb18f6f672564b1215c8a7c75f";
|
|
13
|
-
launchctlSha256: "b1f2b90f349938cc4c3c9234f11cefd05545f7b4bfe9b1751ac01f1cb27d3714";
|
|
14
|
-
plistSha256: "c26cec3d7afe55cb33c360018c04d0c848df45dbe1ea3c3c50c9dd3b9d483aee";
|
|
15
|
-
executableSha256: "0be2afc6ec7bce4c06e14cdfe7e5155b394f98a689189f069a6ca8611fd7911d";
|
|
16
|
-
}>;
|
|
17
|
-
export type PreexistingAppService = {
|
|
18
|
-
pid: number;
|
|
19
|
-
uniqueId: string;
|
|
20
|
-
ownerPid: number;
|
|
21
|
-
ownerUniqueId: string;
|
|
22
|
-
ownerExecutable: string;
|
|
23
|
-
ownerPidVersion: number;
|
|
24
|
-
ownerSigning: {
|
|
25
|
-
identifier: "com.google.Chrome";
|
|
26
|
-
teamId: "EQHXZ8M8AV";
|
|
27
|
-
cdHash: string;
|
|
28
|
-
dynamicallyVerified: true;
|
|
29
|
-
} | null;
|
|
30
|
-
uid: number;
|
|
31
|
-
resourceCoalitionId: string;
|
|
32
|
-
executable: string;
|
|
33
|
-
domain: string;
|
|
34
|
-
platform: typeof APP_SERVICE_PLATFORM;
|
|
35
|
-
};
|
|
36
|
-
type ServicePhase = "platform" | "initial-census" | "owner-identity" | "owner-signature-bytes" | "owner-signature-verify" | "owner-signature-display" | "owner-domain" | "service-job" | "middle-census" | "repeated-binding" | "final-census";
|
|
37
|
-
type Result = {
|
|
38
|
-
ok: true;
|
|
39
|
-
snapshot: DarwinCoalitionRecoverySnapshot;
|
|
40
|
-
services: PreexistingAppService[];
|
|
41
|
-
} | {
|
|
42
|
-
ok: false;
|
|
43
|
-
reason: "app-service-platform-unrecognized" | "app-service-observation-refused";
|
|
44
|
-
diagnostic?: {
|
|
45
|
-
phase: ServicePhase;
|
|
46
|
-
};
|
|
47
|
-
};
|
|
48
|
-
/** Read-only observations, not exit/custody authority. Caller must authenticate
|
|
49
|
-
* upperBound historically and consume these facts inside its existing proof. */
|
|
50
|
-
export declare function collectPreexistingAppServices(args: {
|
|
51
|
-
snapshot: DarwinCoalitionRecoverySnapshot;
|
|
52
|
-
native: PreparedDarwinProcessCensus;
|
|
53
|
-
upperBound: ProcessRecoveryAnchor;
|
|
54
|
-
anchorPids: number[];
|
|
55
|
-
}): Promise<Result>;
|
|
56
|
-
export {};
|