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.
Files changed (274) hide show
  1. package/CODE_OF_CONDUCT.md +21 -0
  2. package/CONTRIBUTING.md +58 -0
  3. package/LICENSE +21 -0
  4. package/PRIVACY.md +49 -0
  5. package/README.md +264 -0
  6. package/SECURITY.md +31 -0
  7. package/dist/bridges/chatgptWebBridge.d.ts +2 -0
  8. package/dist/bridges/chatgptWebBridge.js +981 -0
  9. package/dist/bridges/chatgptWebBridge.js.map +1 -0
  10. package/dist/cli/args.d.ts +9 -0
  11. package/dist/cli/args.js +82 -0
  12. package/dist/cli/args.js.map +1 -0
  13. package/dist/cli/format.d.ts +56 -0
  14. package/dist/cli/format.js +752 -0
  15. package/dist/cli/format.js.map +1 -0
  16. package/dist/cli/main.d.ts +2 -0
  17. package/dist/cli/main.js +996 -0
  18. package/dist/cli/main.js.map +1 -0
  19. package/dist/cli/mcpConfig.d.ts +36 -0
  20. package/dist/cli/mcpConfig.js +98 -0
  21. package/dist/cli/mcpConfig.js.map +1 -0
  22. package/dist/index.d.ts +37 -0
  23. package/dist/index.js +38 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/mcp/protocol.d.ts +44 -0
  26. package/dist/mcp/protocol.js +33 -0
  27. package/dist/mcp/protocol.js.map +1 -0
  28. package/dist/mcp/server.d.ts +1 -0
  29. package/dist/mcp/server.js +106 -0
  30. package/dist/mcp/server.js.map +1 -0
  31. package/dist/mcp/tools.d.ts +10 -0
  32. package/dist/mcp/tools.js +2200 -0
  33. package/dist/mcp/tools.js.map +1 -0
  34. package/dist/mcp/validation.d.ts +8 -0
  35. package/dist/mcp/validation.js +67 -0
  36. package/dist/mcp/validation.js.map +1 -0
  37. package/dist/providers/chatgptWeb.d.ts +2 -0
  38. package/dist/providers/chatgptWeb.js +26 -0
  39. package/dist/providers/chatgptWeb.js.map +1 -0
  40. package/dist/providers/claudeCode.d.ts +4 -0
  41. package/dist/providers/claudeCode.js +32 -0
  42. package/dist/providers/claudeCode.js.map +1 -0
  43. package/dist/providers/codexCli.d.ts +6 -0
  44. package/dist/providers/codexCli.js +25 -0
  45. package/dist/providers/codexCli.js.map +1 -0
  46. package/dist/providers/codexCliModels.d.ts +23 -0
  47. package/dist/providers/codexCliModels.js +147 -0
  48. package/dist/providers/codexCliModels.js.map +1 -0
  49. package/dist/providers/localCommand.d.ts +26 -0
  50. package/dist/providers/localCommand.js +614 -0
  51. package/dist/providers/localCommand.js.map +1 -0
  52. package/dist/providers/markdownPayload.d.ts +7 -0
  53. package/dist/providers/markdownPayload.js +29 -0
  54. package/dist/providers/markdownPayload.js.map +1 -0
  55. package/dist/providers/responseSchema.d.ts +3 -0
  56. package/dist/providers/responseSchema.js +187 -0
  57. package/dist/providers/responseSchema.js.map +1 -0
  58. package/dist/providers/router.d.ts +3 -0
  59. package/dist/providers/router.js +21 -0
  60. package/dist/providers/router.js.map +1 -0
  61. package/dist/providers/stub.d.ts +2 -0
  62. package/dist/providers/stub.js +177 -0
  63. package/dist/providers/stub.js.map +1 -0
  64. package/dist/providers/types.d.ts +37 -0
  65. package/dist/providers/types.js +2 -0
  66. package/dist/providers/types.js.map +1 -0
  67. package/dist/runtime/agentBoard.d.ts +79 -0
  68. package/dist/runtime/agentBoard.js +166 -0
  69. package/dist/runtime/agentBoard.js.map +1 -0
  70. package/dist/runtime/agentBoardArtifact.d.ts +9 -0
  71. package/dist/runtime/agentBoardArtifact.js +171 -0
  72. package/dist/runtime/agentBoardArtifact.js.map +1 -0
  73. package/dist/runtime/agentRunner.d.ts +17 -0
  74. package/dist/runtime/agentRunner.js +92 -0
  75. package/dist/runtime/agentRunner.js.map +1 -0
  76. package/dist/runtime/approvalInbox.d.ts +54 -0
  77. package/dist/runtime/approvalInbox.js +143 -0
  78. package/dist/runtime/approvalInbox.js.map +1 -0
  79. package/dist/runtime/approvalPolicy.d.ts +11 -0
  80. package/dist/runtime/approvalPolicy.js +58 -0
  81. package/dist/runtime/approvalPolicy.js.map +1 -0
  82. package/dist/runtime/artifacts.d.ts +23 -0
  83. package/dist/runtime/artifacts.js +48 -0
  84. package/dist/runtime/artifacts.js.map +1 -0
  85. package/dist/runtime/browserManager.d.ts +37 -0
  86. package/dist/runtime/browserManager.js +356 -0
  87. package/dist/runtime/browserManager.js.map +1 -0
  88. package/dist/runtime/canonicalMemory.d.ts +23 -0
  89. package/dist/runtime/canonicalMemory.js +134 -0
  90. package/dist/runtime/canonicalMemory.js.map +1 -0
  91. package/dist/runtime/chatGptPageReadiness.d.ts +16 -0
  92. package/dist/runtime/chatGptPageReadiness.js +74 -0
  93. package/dist/runtime/chatGptPageReadiness.js.map +1 -0
  94. package/dist/runtime/commandRunner.d.ts +18 -0
  95. package/dist/runtime/commandRunner.js +115 -0
  96. package/dist/runtime/commandRunner.js.map +1 -0
  97. package/dist/runtime/commandSafety.d.ts +7 -0
  98. package/dist/runtime/commandSafety.js +61 -0
  99. package/dist/runtime/commandSafety.js.map +1 -0
  100. package/dist/runtime/config.d.ts +10 -0
  101. package/dist/runtime/config.js +107 -0
  102. package/dist/runtime/config.js.map +1 -0
  103. package/dist/runtime/crewLanes.d.ts +2 -0
  104. package/dist/runtime/crewLanes.js +123 -0
  105. package/dist/runtime/crewLanes.js.map +1 -0
  106. package/dist/runtime/criticPolicy.d.ts +17 -0
  107. package/dist/runtime/criticPolicy.js +50 -0
  108. package/dist/runtime/criticPolicy.js.map +1 -0
  109. package/dist/runtime/defaults.d.ts +5 -0
  110. package/dist/runtime/defaults.js +100 -0
  111. package/dist/runtime/defaults.js.map +1 -0
  112. package/dist/runtime/directives.d.ts +3 -0
  113. package/dist/runtime/directives.js +218 -0
  114. package/dist/runtime/directives.js.map +1 -0
  115. package/dist/runtime/doctor.d.ts +36 -0
  116. package/dist/runtime/doctor.js +185 -0
  117. package/dist/runtime/doctor.js.map +1 -0
  118. package/dist/runtime/errors.d.ts +20 -0
  119. package/dist/runtime/errors.js +41 -0
  120. package/dist/runtime/errors.js.map +1 -0
  121. package/dist/runtime/externalTransfer.d.ts +20 -0
  122. package/dist/runtime/externalTransfer.js +156 -0
  123. package/dist/runtime/externalTransfer.js.map +1 -0
  124. package/dist/runtime/fanout.d.ts +64 -0
  125. package/dist/runtime/fanout.js +263 -0
  126. package/dist/runtime/fanout.js.map +1 -0
  127. package/dist/runtime/gitEvidence.d.ts +10 -0
  128. package/dist/runtime/gitEvidence.js +80 -0
  129. package/dist/runtime/gitEvidence.js.map +1 -0
  130. package/dist/runtime/handoffs.d.ts +32 -0
  131. package/dist/runtime/handoffs.js +100 -0
  132. package/dist/runtime/handoffs.js.map +1 -0
  133. package/dist/runtime/ids.d.ts +2 -0
  134. package/dist/runtime/ids.js +4 -0
  135. package/dist/runtime/ids.js.map +1 -0
  136. package/dist/runtime/localStateIgnore.d.ts +9 -0
  137. package/dist/runtime/localStateIgnore.js +98 -0
  138. package/dist/runtime/localStateIgnore.js.map +1 -0
  139. package/dist/runtime/loop.d.ts +14 -0
  140. package/dist/runtime/loop.js +1863 -0
  141. package/dist/runtime/loop.js.map +1 -0
  142. package/dist/runtime/loopRecommendation.d.ts +109 -0
  143. package/dist/runtime/loopRecommendation.js +566 -0
  144. package/dist/runtime/loopRecommendation.js.map +1 -0
  145. package/dist/runtime/loopResponsibilities.d.ts +2 -0
  146. package/dist/runtime/loopResponsibilities.js +395 -0
  147. package/dist/runtime/loopResponsibilities.js.map +1 -0
  148. package/dist/runtime/loopRunner.d.ts +28 -0
  149. package/dist/runtime/loopRunner.js +81 -0
  150. package/dist/runtime/loopRunner.js.map +1 -0
  151. package/dist/runtime/operatorNextActions.d.ts +2 -0
  152. package/dist/runtime/operatorNextActions.js +344 -0
  153. package/dist/runtime/operatorNextActions.js.map +1 -0
  154. package/dist/runtime/paths.d.ts +9 -0
  155. package/dist/runtime/paths.js +14 -0
  156. package/dist/runtime/paths.js.map +1 -0
  157. package/dist/runtime/permissions.d.ts +9 -0
  158. package/dist/runtime/permissions.js +73 -0
  159. package/dist/runtime/permissions.js.map +1 -0
  160. package/dist/runtime/progressPacket.d.ts +12 -0
  161. package/dist/runtime/progressPacket.js +512 -0
  162. package/dist/runtime/progressPacket.js.map +1 -0
  163. package/dist/runtime/protectedPaths.d.ts +6 -0
  164. package/dist/runtime/protectedPaths.js +48 -0
  165. package/dist/runtime/protectedPaths.js.map +1 -0
  166. package/dist/runtime/providers.d.ts +13 -0
  167. package/dist/runtime/providers.js +60 -0
  168. package/dist/runtime/providers.js.map +1 -0
  169. package/dist/runtime/reconciliation.d.ts +17 -0
  170. package/dist/runtime/reconciliation.js +283 -0
  171. package/dist/runtime/reconciliation.js.map +1 -0
  172. package/dist/runtime/redaction.d.ts +1 -0
  173. package/dist/runtime/redaction.js +5 -0
  174. package/dist/runtime/redaction.js.map +1 -0
  175. package/dist/runtime/remoteRepoContext.d.ts +77 -0
  176. package/dist/runtime/remoteRepoContext.js +316 -0
  177. package/dist/runtime/remoteRepoContext.js.map +1 -0
  178. package/dist/runtime/repoContext.d.ts +50 -0
  179. package/dist/runtime/repoContext.js +399 -0
  180. package/dist/runtime/repoContext.js.map +1 -0
  181. package/dist/runtime/repoGateway.d.ts +64 -0
  182. package/dist/runtime/repoGateway.js +308 -0
  183. package/dist/runtime/repoGateway.js.map +1 -0
  184. package/dist/runtime/responseContracts.d.ts +3 -0
  185. package/dist/runtime/responseContracts.js +86 -0
  186. package/dist/runtime/responseContracts.js.map +1 -0
  187. package/dist/runtime/reviewLanes.d.ts +2 -0
  188. package/dist/runtime/reviewLanes.js +343 -0
  189. package/dist/runtime/reviewLanes.js.map +1 -0
  190. package/dist/runtime/reviewRouting.d.ts +51 -0
  191. package/dist/runtime/reviewRouting.js +152 -0
  192. package/dist/runtime/reviewRouting.js.map +1 -0
  193. package/dist/runtime/revisionPacket.d.ts +38 -0
  194. package/dist/runtime/revisionPacket.js +144 -0
  195. package/dist/runtime/revisionPacket.js.map +1 -0
  196. package/dist/runtime/revisionTrail.d.ts +2 -0
  197. package/dist/runtime/revisionTrail.js +162 -0
  198. package/dist/runtime/revisionTrail.js.map +1 -0
  199. package/dist/runtime/role-assignment.d.ts +4 -0
  200. package/dist/runtime/role-assignment.js +21 -0
  201. package/dist/runtime/role-assignment.js.map +1 -0
  202. package/dist/runtime/roleRoster.d.ts +28 -0
  203. package/dist/runtime/roleRoster.js +96 -0
  204. package/dist/runtime/roleRoster.js.map +1 -0
  205. package/dist/runtime/runInsights.d.ts +121 -0
  206. package/dist/runtime/runInsights.js +305 -0
  207. package/dist/runtime/runInsights.js.map +1 -0
  208. package/dist/runtime/runMonitor.d.ts +33 -0
  209. package/dist/runtime/runMonitor.js +143 -0
  210. package/dist/runtime/runMonitor.js.map +1 -0
  211. package/dist/runtime/runtime.d.ts +15 -0
  212. package/dist/runtime/runtime.js +199 -0
  213. package/dist/runtime/runtime.js.map +1 -0
  214. package/dist/runtime/runtimeInfo.d.ts +9 -0
  215. package/dist/runtime/runtimeInfo.js +76 -0
  216. package/dist/runtime/runtimeInfo.js.map +1 -0
  217. package/dist/runtime/store.d.ts +4 -0
  218. package/dist/runtime/store.js +48 -0
  219. package/dist/runtime/store.js.map +1 -0
  220. package/dist/runtime/summons.d.ts +25 -0
  221. package/dist/runtime/summons.js +403 -0
  222. package/dist/runtime/summons.js.map +1 -0
  223. package/dist/runtime/teamPresets.d.ts +14 -0
  224. package/dist/runtime/teamPresets.js +153 -0
  225. package/dist/runtime/teamPresets.js.map +1 -0
  226. package/dist/runtime/types.d.ts +505 -0
  227. package/dist/runtime/types.js +28 -0
  228. package/dist/runtime/types.js.map +1 -0
  229. package/dist/runtime/validationCommands.d.ts +18 -0
  230. package/dist/runtime/validationCommands.js +106 -0
  231. package/dist/runtime/validationCommands.js.map +1 -0
  232. package/dist/tui/dashboard.d.ts +41 -0
  233. package/dist/tui/dashboard.js +1115 -0
  234. package/dist/tui/dashboard.js.map +1 -0
  235. package/docs/ARCHITECTURE.md +277 -0
  236. package/docs/CLI_SPEC.md +396 -0
  237. package/docs/CODEX_SETUP.md +288 -0
  238. package/docs/COMPLETION_CONTRACT.md +52 -0
  239. package/docs/CONTRIBUTOR_GUIDE.md +70 -0
  240. package/docs/DEMO.md +62 -0
  241. package/docs/GLOSSARY.md +46 -0
  242. package/docs/GOAL_LOOP_SCHEDULE.md +50 -0
  243. package/docs/KNOWN_LIMITATIONS.md +29 -0
  244. package/docs/LICENSING.md +21 -0
  245. package/docs/LOOP_RECIPES.md +290 -0
  246. package/docs/LOOP_SELECTION_UX.md +118 -0
  247. package/docs/MCP_SPEC.md +689 -0
  248. package/docs/MEMORY_AND_RECONCILIATION.md +222 -0
  249. package/docs/NPM_PUBLISHING.md +51 -0
  250. package/docs/OPEN_DECISIONS.md +81 -0
  251. package/docs/PROMPT_SCHEMAS.md +411 -0
  252. package/docs/PROVIDER_ADAPTERS.md +323 -0
  253. package/docs/PROVIDER_MATRIX.md +21 -0
  254. package/docs/PUBLIC_REPO_READINESS.md +49 -0
  255. package/docs/RESEARCH_NOTES.md +92 -0
  256. package/docs/ROADMAP.md +94 -0
  257. package/docs/ROLE_CONTRACTS.md +252 -0
  258. package/docs/RUNTIME_LOOP.md +240 -0
  259. package/docs/SECURITY_AND_PRIVACY.md +161 -0
  260. package/docs/TESTING_AND_VERIFICATION.md +180 -0
  261. package/docs/TRUST_MODEL.md +65 -0
  262. package/docs/decisions/0001-runtime-first-cli-and-mcp.md +23 -0
  263. package/docs/decisions/0002-provider-neutral-role-mapping.md +43 -0
  264. package/docs/decisions/0003-separate-implementation-and-verification.md +27 -0
  265. package/docs/product/README.md +14 -0
  266. package/docs/product/model-selection.md +88 -0
  267. package/docs/product/positioning.md +37 -0
  268. package/docs/product/pro-usage-modes.md +70 -0
  269. package/docs/product/roadmap.md +57 -0
  270. package/docs/product/role-policy.md +89 -0
  271. package/docs/product/runtime-invariants.md +44 -0
  272. package/docs/release/v0.1.0-preview.0.md +48 -0
  273. package/examples/stub-demo/README.md +25 -0
  274. 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>;