thehood 0.1.0-preview.0
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/CODE_OF_CONDUCT.md +21 -0
- package/CONTRIBUTING.md +58 -0
- package/LICENSE +21 -0
- package/PRIVACY.md +49 -0
- package/README.md +264 -0
- package/SECURITY.md +31 -0
- package/dist/bridges/chatgptWebBridge.d.ts +2 -0
- package/dist/bridges/chatgptWebBridge.js +981 -0
- package/dist/bridges/chatgptWebBridge.js.map +1 -0
- package/dist/cli/args.d.ts +9 -0
- package/dist/cli/args.js +82 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/format.d.ts +56 -0
- package/dist/cli/format.js +752 -0
- package/dist/cli/format.js.map +1 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.js +996 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/mcpConfig.d.ts +36 -0
- package/dist/cli/mcpConfig.js +98 -0
- package/dist/cli/mcpConfig.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/protocol.d.ts +44 -0
- package/dist/mcp/protocol.js +33 -0
- package/dist/mcp/protocol.js.map +1 -0
- package/dist/mcp/server.d.ts +1 -0
- package/dist/mcp/server.js +106 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +10 -0
- package/dist/mcp/tools.js +2200 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/mcp/validation.d.ts +8 -0
- package/dist/mcp/validation.js +67 -0
- package/dist/mcp/validation.js.map +1 -0
- package/dist/providers/chatgptWeb.d.ts +2 -0
- package/dist/providers/chatgptWeb.js +26 -0
- package/dist/providers/chatgptWeb.js.map +1 -0
- package/dist/providers/claudeCode.d.ts +4 -0
- package/dist/providers/claudeCode.js +32 -0
- package/dist/providers/claudeCode.js.map +1 -0
- package/dist/providers/codexCli.d.ts +6 -0
- package/dist/providers/codexCli.js +25 -0
- package/dist/providers/codexCli.js.map +1 -0
- package/dist/providers/codexCliModels.d.ts +23 -0
- package/dist/providers/codexCliModels.js +147 -0
- package/dist/providers/codexCliModels.js.map +1 -0
- package/dist/providers/localCommand.d.ts +26 -0
- package/dist/providers/localCommand.js +614 -0
- package/dist/providers/localCommand.js.map +1 -0
- package/dist/providers/markdownPayload.d.ts +7 -0
- package/dist/providers/markdownPayload.js +29 -0
- package/dist/providers/markdownPayload.js.map +1 -0
- package/dist/providers/responseSchema.d.ts +3 -0
- package/dist/providers/responseSchema.js +187 -0
- package/dist/providers/responseSchema.js.map +1 -0
- package/dist/providers/router.d.ts +3 -0
- package/dist/providers/router.js +21 -0
- package/dist/providers/router.js.map +1 -0
- package/dist/providers/stub.d.ts +2 -0
- package/dist/providers/stub.js +177 -0
- package/dist/providers/stub.js.map +1 -0
- package/dist/providers/types.d.ts +37 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/runtime/agentBoard.d.ts +79 -0
- package/dist/runtime/agentBoard.js +166 -0
- package/dist/runtime/agentBoard.js.map +1 -0
- package/dist/runtime/agentBoardArtifact.d.ts +9 -0
- package/dist/runtime/agentBoardArtifact.js +171 -0
- package/dist/runtime/agentBoardArtifact.js.map +1 -0
- package/dist/runtime/agentRunner.d.ts +17 -0
- package/dist/runtime/agentRunner.js +92 -0
- package/dist/runtime/agentRunner.js.map +1 -0
- package/dist/runtime/approvalInbox.d.ts +54 -0
- package/dist/runtime/approvalInbox.js +143 -0
- package/dist/runtime/approvalInbox.js.map +1 -0
- package/dist/runtime/approvalPolicy.d.ts +11 -0
- package/dist/runtime/approvalPolicy.js +58 -0
- package/dist/runtime/approvalPolicy.js.map +1 -0
- package/dist/runtime/artifacts.d.ts +23 -0
- package/dist/runtime/artifacts.js +48 -0
- package/dist/runtime/artifacts.js.map +1 -0
- package/dist/runtime/browserManager.d.ts +37 -0
- package/dist/runtime/browserManager.js +356 -0
- package/dist/runtime/browserManager.js.map +1 -0
- package/dist/runtime/canonicalMemory.d.ts +23 -0
- package/dist/runtime/canonicalMemory.js +134 -0
- package/dist/runtime/canonicalMemory.js.map +1 -0
- package/dist/runtime/chatGptPageReadiness.d.ts +16 -0
- package/dist/runtime/chatGptPageReadiness.js +74 -0
- package/dist/runtime/chatGptPageReadiness.js.map +1 -0
- package/dist/runtime/commandRunner.d.ts +18 -0
- package/dist/runtime/commandRunner.js +115 -0
- package/dist/runtime/commandRunner.js.map +1 -0
- package/dist/runtime/commandSafety.d.ts +7 -0
- package/dist/runtime/commandSafety.js +61 -0
- package/dist/runtime/commandSafety.js.map +1 -0
- package/dist/runtime/config.d.ts +10 -0
- package/dist/runtime/config.js +107 -0
- package/dist/runtime/config.js.map +1 -0
- package/dist/runtime/crewLanes.d.ts +2 -0
- package/dist/runtime/crewLanes.js +123 -0
- package/dist/runtime/crewLanes.js.map +1 -0
- package/dist/runtime/criticPolicy.d.ts +17 -0
- package/dist/runtime/criticPolicy.js +50 -0
- package/dist/runtime/criticPolicy.js.map +1 -0
- package/dist/runtime/defaults.d.ts +5 -0
- package/dist/runtime/defaults.js +100 -0
- package/dist/runtime/defaults.js.map +1 -0
- package/dist/runtime/directives.d.ts +3 -0
- package/dist/runtime/directives.js +218 -0
- package/dist/runtime/directives.js.map +1 -0
- package/dist/runtime/doctor.d.ts +36 -0
- package/dist/runtime/doctor.js +185 -0
- package/dist/runtime/doctor.js.map +1 -0
- package/dist/runtime/errors.d.ts +20 -0
- package/dist/runtime/errors.js +41 -0
- package/dist/runtime/errors.js.map +1 -0
- package/dist/runtime/externalTransfer.d.ts +20 -0
- package/dist/runtime/externalTransfer.js +156 -0
- package/dist/runtime/externalTransfer.js.map +1 -0
- package/dist/runtime/fanout.d.ts +64 -0
- package/dist/runtime/fanout.js +263 -0
- package/dist/runtime/fanout.js.map +1 -0
- package/dist/runtime/gitEvidence.d.ts +10 -0
- package/dist/runtime/gitEvidence.js +80 -0
- package/dist/runtime/gitEvidence.js.map +1 -0
- package/dist/runtime/handoffs.d.ts +32 -0
- package/dist/runtime/handoffs.js +100 -0
- package/dist/runtime/handoffs.js.map +1 -0
- package/dist/runtime/ids.d.ts +2 -0
- package/dist/runtime/ids.js +4 -0
- package/dist/runtime/ids.js.map +1 -0
- package/dist/runtime/localStateIgnore.d.ts +9 -0
- package/dist/runtime/localStateIgnore.js +98 -0
- package/dist/runtime/localStateIgnore.js.map +1 -0
- package/dist/runtime/loop.d.ts +14 -0
- package/dist/runtime/loop.js +1863 -0
- package/dist/runtime/loop.js.map +1 -0
- package/dist/runtime/loopRecommendation.d.ts +109 -0
- package/dist/runtime/loopRecommendation.js +566 -0
- package/dist/runtime/loopRecommendation.js.map +1 -0
- package/dist/runtime/loopResponsibilities.d.ts +2 -0
- package/dist/runtime/loopResponsibilities.js +395 -0
- package/dist/runtime/loopResponsibilities.js.map +1 -0
- package/dist/runtime/loopRunner.d.ts +28 -0
- package/dist/runtime/loopRunner.js +81 -0
- package/dist/runtime/loopRunner.js.map +1 -0
- package/dist/runtime/operatorNextActions.d.ts +2 -0
- package/dist/runtime/operatorNextActions.js +344 -0
- package/dist/runtime/operatorNextActions.js.map +1 -0
- package/dist/runtime/paths.d.ts +9 -0
- package/dist/runtime/paths.js +14 -0
- package/dist/runtime/paths.js.map +1 -0
- package/dist/runtime/permissions.d.ts +9 -0
- package/dist/runtime/permissions.js +73 -0
- package/dist/runtime/permissions.js.map +1 -0
- package/dist/runtime/progressPacket.d.ts +12 -0
- package/dist/runtime/progressPacket.js +512 -0
- package/dist/runtime/progressPacket.js.map +1 -0
- package/dist/runtime/protectedPaths.d.ts +6 -0
- package/dist/runtime/protectedPaths.js +48 -0
- package/dist/runtime/protectedPaths.js.map +1 -0
- package/dist/runtime/providers.d.ts +13 -0
- package/dist/runtime/providers.js +60 -0
- package/dist/runtime/providers.js.map +1 -0
- package/dist/runtime/reconciliation.d.ts +17 -0
- package/dist/runtime/reconciliation.js +283 -0
- package/dist/runtime/reconciliation.js.map +1 -0
- package/dist/runtime/redaction.d.ts +1 -0
- package/dist/runtime/redaction.js +5 -0
- package/dist/runtime/redaction.js.map +1 -0
- package/dist/runtime/remoteRepoContext.d.ts +77 -0
- package/dist/runtime/remoteRepoContext.js +316 -0
- package/dist/runtime/remoteRepoContext.js.map +1 -0
- package/dist/runtime/repoContext.d.ts +50 -0
- package/dist/runtime/repoContext.js +399 -0
- package/dist/runtime/repoContext.js.map +1 -0
- package/dist/runtime/repoGateway.d.ts +64 -0
- package/dist/runtime/repoGateway.js +308 -0
- package/dist/runtime/repoGateway.js.map +1 -0
- package/dist/runtime/responseContracts.d.ts +3 -0
- package/dist/runtime/responseContracts.js +86 -0
- package/dist/runtime/responseContracts.js.map +1 -0
- package/dist/runtime/reviewLanes.d.ts +2 -0
- package/dist/runtime/reviewLanes.js +343 -0
- package/dist/runtime/reviewLanes.js.map +1 -0
- package/dist/runtime/reviewRouting.d.ts +51 -0
- package/dist/runtime/reviewRouting.js +152 -0
- package/dist/runtime/reviewRouting.js.map +1 -0
- package/dist/runtime/revisionPacket.d.ts +38 -0
- package/dist/runtime/revisionPacket.js +144 -0
- package/dist/runtime/revisionPacket.js.map +1 -0
- package/dist/runtime/revisionTrail.d.ts +2 -0
- package/dist/runtime/revisionTrail.js +162 -0
- package/dist/runtime/revisionTrail.js.map +1 -0
- package/dist/runtime/role-assignment.d.ts +4 -0
- package/dist/runtime/role-assignment.js +21 -0
- package/dist/runtime/role-assignment.js.map +1 -0
- package/dist/runtime/roleRoster.d.ts +28 -0
- package/dist/runtime/roleRoster.js +96 -0
- package/dist/runtime/roleRoster.js.map +1 -0
- package/dist/runtime/runInsights.d.ts +121 -0
- package/dist/runtime/runInsights.js +305 -0
- package/dist/runtime/runInsights.js.map +1 -0
- package/dist/runtime/runMonitor.d.ts +33 -0
- package/dist/runtime/runMonitor.js +143 -0
- package/dist/runtime/runMonitor.js.map +1 -0
- package/dist/runtime/runtime.d.ts +15 -0
- package/dist/runtime/runtime.js +199 -0
- package/dist/runtime/runtime.js.map +1 -0
- package/dist/runtime/runtimeInfo.d.ts +9 -0
- package/dist/runtime/runtimeInfo.js +76 -0
- package/dist/runtime/runtimeInfo.js.map +1 -0
- package/dist/runtime/store.d.ts +4 -0
- package/dist/runtime/store.js +48 -0
- package/dist/runtime/store.js.map +1 -0
- package/dist/runtime/summons.d.ts +25 -0
- package/dist/runtime/summons.js +403 -0
- package/dist/runtime/summons.js.map +1 -0
- package/dist/runtime/teamPresets.d.ts +14 -0
- package/dist/runtime/teamPresets.js +153 -0
- package/dist/runtime/teamPresets.js.map +1 -0
- package/dist/runtime/types.d.ts +505 -0
- package/dist/runtime/types.js +28 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/runtime/validationCommands.d.ts +18 -0
- package/dist/runtime/validationCommands.js +106 -0
- package/dist/runtime/validationCommands.js.map +1 -0
- package/dist/tui/dashboard.d.ts +41 -0
- package/dist/tui/dashboard.js +1115 -0
- package/dist/tui/dashboard.js.map +1 -0
- package/docs/ARCHITECTURE.md +277 -0
- package/docs/CLI_SPEC.md +396 -0
- package/docs/CODEX_SETUP.md +288 -0
- package/docs/COMPLETION_CONTRACT.md +52 -0
- package/docs/CONTRIBUTOR_GUIDE.md +70 -0
- package/docs/DEMO.md +62 -0
- package/docs/GLOSSARY.md +46 -0
- package/docs/GOAL_LOOP_SCHEDULE.md +50 -0
- package/docs/KNOWN_LIMITATIONS.md +29 -0
- package/docs/LICENSING.md +21 -0
- package/docs/LOOP_RECIPES.md +290 -0
- package/docs/LOOP_SELECTION_UX.md +118 -0
- package/docs/MCP_SPEC.md +689 -0
- package/docs/MEMORY_AND_RECONCILIATION.md +222 -0
- package/docs/NPM_PUBLISHING.md +51 -0
- package/docs/OPEN_DECISIONS.md +81 -0
- package/docs/PROMPT_SCHEMAS.md +411 -0
- package/docs/PROVIDER_ADAPTERS.md +323 -0
- package/docs/PROVIDER_MATRIX.md +21 -0
- package/docs/PUBLIC_REPO_READINESS.md +49 -0
- package/docs/RESEARCH_NOTES.md +92 -0
- package/docs/ROADMAP.md +94 -0
- package/docs/ROLE_CONTRACTS.md +252 -0
- package/docs/RUNTIME_LOOP.md +240 -0
- package/docs/SECURITY_AND_PRIVACY.md +161 -0
- package/docs/TESTING_AND_VERIFICATION.md +180 -0
- package/docs/TRUST_MODEL.md +65 -0
- package/docs/decisions/0001-runtime-first-cli-and-mcp.md +23 -0
- package/docs/decisions/0002-provider-neutral-role-mapping.md +43 -0
- package/docs/decisions/0003-separate-implementation-and-verification.md +27 -0
- package/docs/product/README.md +14 -0
- package/docs/product/model-selection.md +88 -0
- package/docs/product/positioning.md +37 -0
- package/docs/product/pro-usage-modes.md +70 -0
- package/docs/product/roadmap.md +57 -0
- package/docs/product/role-policy.md +89 -0
- package/docs/product/runtime-invariants.md +44 -0
- package/docs/release/v0.1.0-preview.0.md +48 -0
- package/examples/stub-demo/README.md +25 -0
- package/package.json +55 -0
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { recentRunHandoffSummaries } from "./handoffs.js";
|
|
2
|
+
const defaultAutopilotApprovalLimit = 8;
|
|
3
|
+
export const approvalMessageHint = (run) => {
|
|
4
|
+
const reason = run.approvalReason ?? "";
|
|
5
|
+
const quoted = reason.match(/"([^"]+)"/)?.[1];
|
|
6
|
+
if (quoted) {
|
|
7
|
+
return `I approve ${quoted} for run ${run.runId}.`;
|
|
8
|
+
}
|
|
9
|
+
if (reason.includes("Implementation mode requires approval")) {
|
|
10
|
+
return `I approve starting implementation for run ${run.runId}.`;
|
|
11
|
+
}
|
|
12
|
+
return `I approve the next TheHood transition for run ${run.runId}.`;
|
|
13
|
+
};
|
|
14
|
+
const stringField = (value) => typeof value === "string" ? value : undefined;
|
|
15
|
+
const objectField = (value) => value !== null && typeof value === "object" && !Array.isArray(value)
|
|
16
|
+
? value
|
|
17
|
+
: undefined;
|
|
18
|
+
const artifactForRef = (run, artifactRef) => {
|
|
19
|
+
if (typeof artifactRef !== "string") {
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
const artifact = run.artifacts.find((candidate) => candidate.ref === artifactRef);
|
|
23
|
+
if (!artifact) {
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
kind: artifact.kind,
|
|
28
|
+
ref: artifact.ref,
|
|
29
|
+
summary: artifact.summary
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
const autopilotApprovalForEvent = (run, event) => {
|
|
33
|
+
if (event.type !== "approval_auto_approved") {
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
const gate = stringField(event.data?.gate) ?? stringField(event.data?.reason);
|
|
37
|
+
const gateReason = stringField(event.data?.gateReason);
|
|
38
|
+
const policyDecision = stringField(event.data?.policyDecision);
|
|
39
|
+
const policyReason = stringField(event.data?.policyReason);
|
|
40
|
+
const artifact = artifactForRef(run, event.data?.artifactRef);
|
|
41
|
+
const sourceArtifact = artifactForRef(run, event.data?.sourceArtifactRef);
|
|
42
|
+
const transfer = objectField(event.data?.transfer);
|
|
43
|
+
const approval = {
|
|
44
|
+
runId: run.runId,
|
|
45
|
+
createdAt: event.createdAt,
|
|
46
|
+
updatedAt: run.updatedAt,
|
|
47
|
+
repoPath: run.repoPath,
|
|
48
|
+
mode: run.mode,
|
|
49
|
+
state: run.state,
|
|
50
|
+
goal: run.userGoal,
|
|
51
|
+
message: event.message
|
|
52
|
+
};
|
|
53
|
+
if (gate) {
|
|
54
|
+
approval.gate = gate;
|
|
55
|
+
}
|
|
56
|
+
if (gateReason) {
|
|
57
|
+
approval.gateReason = gateReason;
|
|
58
|
+
}
|
|
59
|
+
if (policyDecision) {
|
|
60
|
+
approval.policyDecision = policyDecision;
|
|
61
|
+
}
|
|
62
|
+
if (policyReason) {
|
|
63
|
+
approval.policyReason = policyReason;
|
|
64
|
+
}
|
|
65
|
+
if (artifact) {
|
|
66
|
+
approval.artifact = artifact;
|
|
67
|
+
}
|
|
68
|
+
if (sourceArtifact) {
|
|
69
|
+
approval.sourceArtifact = sourceArtifact;
|
|
70
|
+
}
|
|
71
|
+
if (transfer) {
|
|
72
|
+
approval.transfer = transfer;
|
|
73
|
+
}
|
|
74
|
+
return approval;
|
|
75
|
+
};
|
|
76
|
+
const compactArtifacts = (artifacts) => {
|
|
77
|
+
const seen = new Set();
|
|
78
|
+
const compacted = [];
|
|
79
|
+
for (const artifact of artifacts) {
|
|
80
|
+
if (!artifact || seen.has(artifact.ref)) {
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
seen.add(artifact.ref);
|
|
84
|
+
compacted.push(artifact);
|
|
85
|
+
}
|
|
86
|
+
return compacted;
|
|
87
|
+
};
|
|
88
|
+
export const approvalArtifactsForRun = (run) => {
|
|
89
|
+
const approvalEvent = run.events.filter((event) => event.type === "approval_required").at(-1);
|
|
90
|
+
const integrationReportEvent = run.events
|
|
91
|
+
.filter((event) => event.type === "integration_report_written")
|
|
92
|
+
.at(-1);
|
|
93
|
+
return compactArtifacts([
|
|
94
|
+
artifactForRef(run, approvalEvent?.data?.artifactRef),
|
|
95
|
+
artifactForRef(run, approvalEvent?.data?.sourceArtifactRef),
|
|
96
|
+
run.approvalReason?.includes("protected test changes")
|
|
97
|
+
? artifactForRef(run, integrationReportEvent?.data?.artifactRef)
|
|
98
|
+
: undefined
|
|
99
|
+
]);
|
|
100
|
+
};
|
|
101
|
+
export const pendingApprovalForRun = (run) => {
|
|
102
|
+
if (!run.approvalRequired) {
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
runId: run.runId,
|
|
107
|
+
createdAt: run.createdAt,
|
|
108
|
+
updatedAt: run.updatedAt,
|
|
109
|
+
repoPath: run.repoPath,
|
|
110
|
+
mode: run.mode,
|
|
111
|
+
state: run.state,
|
|
112
|
+
goal: run.userGoal,
|
|
113
|
+
reason: run.approvalReason ?? "Approval is required before this run can continue.",
|
|
114
|
+
suggestedApprovalMessage: approvalMessageHint(run),
|
|
115
|
+
artifacts: approvalArtifactsForRun(run)
|
|
116
|
+
};
|
|
117
|
+
};
|
|
118
|
+
export const pendingApprovalsFromRuns = (runs) => runs
|
|
119
|
+
.map(pendingApprovalForRun)
|
|
120
|
+
.filter((approval) => approval !== undefined)
|
|
121
|
+
.sort((left, right) => right.updatedAt.localeCompare(left.updatedAt));
|
|
122
|
+
export const recentAutopilotApprovalsFromRuns = (runs, limit = defaultAutopilotApprovalLimit) => runs
|
|
123
|
+
.flatMap((run) => run.events
|
|
124
|
+
.map((event) => autopilotApprovalForEvent(run, event))
|
|
125
|
+
.filter((approval) => approval !== undefined))
|
|
126
|
+
.sort((left, right) => right.createdAt.localeCompare(left.createdAt))
|
|
127
|
+
.slice(0, limit);
|
|
128
|
+
export const recentHandoffsFromRuns = (runs, limit = defaultAutopilotApprovalLimit) => runs
|
|
129
|
+
.flatMap((run) => recentRunHandoffSummaries(run, limit).map((handoff) => ({
|
|
130
|
+
...handoff,
|
|
131
|
+
runId: run.runId,
|
|
132
|
+
updatedAt: run.updatedAt,
|
|
133
|
+
state: run.state,
|
|
134
|
+
goal: run.userGoal
|
|
135
|
+
})))
|
|
136
|
+
.sort((left, right) => right.createdAt.localeCompare(left.createdAt))
|
|
137
|
+
.slice(0, limit);
|
|
138
|
+
export const approvalInboxViewFromRuns = (runs, limit = defaultAutopilotApprovalLimit) => ({
|
|
139
|
+
pendingApprovals: pendingApprovalsFromRuns(runs),
|
|
140
|
+
recentAutopilotApprovals: recentAutopilotApprovalsFromRuns(runs, limit),
|
|
141
|
+
recentHandoffs: recentHandoffsFromRuns(runs, limit)
|
|
142
|
+
});
|
|
143
|
+
//# sourceMappingURL=approvalInbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approvalInbox.js","sourceRoot":"","sources":["../../src/runtime/approvalInbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ExternalTransferManifest, ExternalTransferPolicyDecision, TheHoodConfig } from "./types.js";
|
|
2
|
+
export interface ExternalTransferPolicyEvaluation {
|
|
3
|
+
decision: ExternalTransferPolicyDecision;
|
|
4
|
+
reason: string;
|
|
5
|
+
}
|
|
6
|
+
export declare const activeApprovalPolicyMode: (config: TheHoodConfig) => TheHoodConfig["approvalPolicy"]["mode"];
|
|
7
|
+
export declare const isAutopilotEnabled: (config: TheHoodConfig) => boolean;
|
|
8
|
+
export declare const autopilotApprovalReason: (summary: string) => string;
|
|
9
|
+
export declare const autopilotPolicyReason: (gate: string) => string;
|
|
10
|
+
export declare const evaluateExternalTransferPolicy: (config: TheHoodConfig, manifest: ExternalTransferManifest) => ExternalTransferPolicyEvaluation;
|
|
11
|
+
export declare const autoApprovalReason: (manifest: ExternalTransferManifest, evaluation: ExternalTransferPolicyEvaluation) => string;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export const activeApprovalPolicyMode = (config) => config.approvalPolicy.mode ?? config.approvalPolicy.externalTransfers.mode;
|
|
2
|
+
export const isAutopilotEnabled = (config) => activeApprovalPolicyMode(config) === "autopilot";
|
|
3
|
+
export const autopilotApprovalReason = (summary) => `Auto-approved by TheHood autopilot policy: ${summary}`;
|
|
4
|
+
export const autopilotPolicyReason = (gate) => `Approval policy autopilot allowed ${gate}.`;
|
|
5
|
+
const ruleMatches = (rule, manifest) => {
|
|
6
|
+
if (rule.provider && rule.provider !== manifest.destination.provider) {
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
if (rule.model && rule.model !== manifest.destination.model) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
if (rule.purposes && !rule.purposes.includes(manifest.purpose)) {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
if (rule.riskClasses && !rule.riskClasses.includes(manifest.risk.class)) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
if (rule.maxBytes !== undefined && manifest.totalBytes > rule.maxBytes) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
return true;
|
|
22
|
+
};
|
|
23
|
+
export const evaluateExternalTransferPolicy = (config, manifest) => {
|
|
24
|
+
const policy = config.approvalPolicy.externalTransfers;
|
|
25
|
+
const mode = activeApprovalPolicyMode(config);
|
|
26
|
+
const matchingRule = policy.rules.find((rule) => ruleMatches(rule, manifest));
|
|
27
|
+
if (matchingRule) {
|
|
28
|
+
return {
|
|
29
|
+
decision: matchingRule.decision,
|
|
30
|
+
reason: `Matched external transfer policy rule for ${manifest.destination.provider}:${manifest.destination.model}.`
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
if (mode === "autopilot" &&
|
|
34
|
+
manifest.risk.class !== "secret_risk" &&
|
|
35
|
+
manifest.totalBytes <= policy.maxAutoApproveBytes) {
|
|
36
|
+
return {
|
|
37
|
+
decision: "auto_approve",
|
|
38
|
+
reason: `Approval policy autopilot allowed ${manifest.purpose} ` +
|
|
39
|
+
`(${manifest.totalBytes}/${policy.maxAutoApproveBytes} bytes, risk ${manifest.risk.class}).`
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
if ((mode === "auto_low_risk" || policy.mode === "auto_low_risk") &&
|
|
43
|
+
manifest.risk.class !== "secret_risk" &&
|
|
44
|
+
manifest.totalBytes <= policy.maxAutoApproveBytes) {
|
|
45
|
+
return {
|
|
46
|
+
decision: "auto_approve",
|
|
47
|
+
reason: `External transfer policy auto_low_risk allowed ${manifest.purpose} ` +
|
|
48
|
+
`(${manifest.totalBytes}/${policy.maxAutoApproveBytes} bytes, risk ${manifest.risk.class}).`
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
decision: "manual",
|
|
53
|
+
reason: `External transfer policy requires manual approval ` +
|
|
54
|
+
`(${manifest.purpose}, risk ${manifest.risk.class}, ${manifest.totalBytes} bytes).`
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
export const autoApprovalReason = (manifest, evaluation) => `Auto-approved by TheHood approval policy: ${manifest.approvalHint} ${evaluation.reason}`;
|
|
58
|
+
//# sourceMappingURL=approvalPolicy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approvalPolicy.js","sourceRoot":"","sources":["../../src/runtime/approvalPolicy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { RunArtifact, RunArtifactKind } from "./types.js";
|
|
2
|
+
export interface WriteArtifactInput {
|
|
3
|
+
repoPath: string;
|
|
4
|
+
runId: string;
|
|
5
|
+
kind: RunArtifactKind;
|
|
6
|
+
name: string;
|
|
7
|
+
content: string;
|
|
8
|
+
summary: string;
|
|
9
|
+
}
|
|
10
|
+
export interface ReadArtifactInput {
|
|
11
|
+
repoPath: string;
|
|
12
|
+
runId: string;
|
|
13
|
+
ref: string;
|
|
14
|
+
maxBytes?: number;
|
|
15
|
+
}
|
|
16
|
+
export interface ReadArtifactResult {
|
|
17
|
+
artifact: RunArtifact;
|
|
18
|
+
content: string;
|
|
19
|
+
truncated: boolean;
|
|
20
|
+
byteLength: number;
|
|
21
|
+
}
|
|
22
|
+
export declare const writeRunArtifact: (input: WriteArtifactInput) => Promise<RunArtifact>;
|
|
23
|
+
export declare const readRunArtifact: (input: ReadArtifactInput) => Promise<ReadArtifactResult>;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { ensureLocalStateIgnored } from "./localStateIgnore.js";
|
|
4
|
+
import { getProjectPaths } from "./paths.js";
|
|
5
|
+
import { loadRun } from "./store.js";
|
|
6
|
+
import { InputError, PermissionDeniedError } from "./errors.js";
|
|
7
|
+
const safeArtifactName = (name) => name.replace(/[^a-zA-Z0-9._-]/g, "_").replace(/^_+/, "") || "artifact.txt";
|
|
8
|
+
const maxArtifactReadBytes = 200_000;
|
|
9
|
+
export const writeRunArtifact = async (input) => {
|
|
10
|
+
const artifactDir = path.join(getProjectPaths(input.repoPath).artifactsDir, input.runId, input.kind);
|
|
11
|
+
const artifactPath = path.join(artifactDir, safeArtifactName(input.name));
|
|
12
|
+
await ensureLocalStateIgnored(input.repoPath);
|
|
13
|
+
await fs.mkdir(artifactDir, { recursive: true });
|
|
14
|
+
await fs.writeFile(artifactPath, input.content, "utf8");
|
|
15
|
+
return {
|
|
16
|
+
kind: input.kind,
|
|
17
|
+
ref: artifactPath,
|
|
18
|
+
summary: input.summary
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
const assertArtifactPath = (repoPath, runId, ref) => {
|
|
22
|
+
const artifactRoot = path.join(getProjectPaths(repoPath).artifactsDir, runId);
|
|
23
|
+
const resolved = path.resolve(ref);
|
|
24
|
+
const relative = path.relative(artifactRoot, resolved);
|
|
25
|
+
if (relative.startsWith("..") || path.isAbsolute(relative)) {
|
|
26
|
+
throw new PermissionDeniedError(`Artifact ref is outside this run's artifact directory: ${ref}`);
|
|
27
|
+
}
|
|
28
|
+
return resolved;
|
|
29
|
+
};
|
|
30
|
+
export const readRunArtifact = async (input) => {
|
|
31
|
+
const run = await loadRun(input.repoPath, input.runId);
|
|
32
|
+
const artifact = run.artifacts.find((candidate) => candidate.ref === input.ref);
|
|
33
|
+
if (!artifact) {
|
|
34
|
+
throw new InputError(`Artifact ref is not attached to run ${input.runId}.`);
|
|
35
|
+
}
|
|
36
|
+
const artifactPath = assertArtifactPath(input.repoPath, input.runId, input.ref);
|
|
37
|
+
const raw = await fs.readFile(artifactPath);
|
|
38
|
+
const requestedMaxBytes = input.maxBytes ?? 20_000;
|
|
39
|
+
const maxBytes = Math.min(Math.max(1, requestedMaxBytes), maxArtifactReadBytes);
|
|
40
|
+
const sliced = raw.subarray(0, maxBytes);
|
|
41
|
+
return {
|
|
42
|
+
artifact,
|
|
43
|
+
content: sliced.toString("utf8"),
|
|
44
|
+
truncated: raw.byteLength > maxBytes,
|
|
45
|
+
byteLength: raw.byteLength
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=artifacts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../src/runtime/artifacts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export interface BrowserManagerOptions {
|
|
2
|
+
port?: number;
|
|
3
|
+
cdpUrl?: string;
|
|
4
|
+
profile?: string;
|
|
5
|
+
profilePath?: string;
|
|
6
|
+
url?: string;
|
|
7
|
+
chromePath?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface BrowserStatus {
|
|
10
|
+
provider: "chatgpt-web";
|
|
11
|
+
cdpUrl: string;
|
|
12
|
+
profilePath: string;
|
|
13
|
+
chromePath?: string;
|
|
14
|
+
pid?: number;
|
|
15
|
+
cdpReachable: boolean;
|
|
16
|
+
chatGptTabFound: boolean;
|
|
17
|
+
chatGptPageInspected: boolean;
|
|
18
|
+
chatGptAuthenticated: boolean;
|
|
19
|
+
chatGptComposerReady: boolean;
|
|
20
|
+
readyForBridge: boolean;
|
|
21
|
+
targetCount: number;
|
|
22
|
+
issues: string[];
|
|
23
|
+
}
|
|
24
|
+
export interface BrowserStartResult {
|
|
25
|
+
launched: boolean;
|
|
26
|
+
status: BrowserStatus;
|
|
27
|
+
}
|
|
28
|
+
export interface BrowserStopResult {
|
|
29
|
+
stopped: boolean;
|
|
30
|
+
status: BrowserStatus;
|
|
31
|
+
reason?: string;
|
|
32
|
+
}
|
|
33
|
+
export declare const defaultBrowserProfilePath: (profile?: string) => string;
|
|
34
|
+
export declare const resolveChromePath: (requestedPath?: string) => Promise<string>;
|
|
35
|
+
export declare const inspectBrowser: (options?: BrowserManagerOptions) => Promise<BrowserStatus>;
|
|
36
|
+
export declare const startBrowser: (options?: BrowserManagerOptions) => Promise<BrowserStartResult>;
|
|
37
|
+
export declare const stopBrowser: (options?: BrowserManagerOptions) => Promise<BrowserStopResult>;
|