@moretea-labs/forge 1.8.1 → 1.8.2

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 (328) hide show
  1. package/AGENTS.md +5 -2
  2. package/CHANGELOG.md +20 -0
  3. package/README.en.md +24 -3
  4. package/README.md +10 -6
  5. package/README.zh-CN.md +5 -3
  6. package/THIRD_PARTY_NOTICES.md +1 -2
  7. package/adapters/chatgpt/browser-delivery-runtime.ts +5 -3
  8. package/adapters/chatgpt/provider-delivery.ts +1 -1
  9. package/adapters/chatgpt/work-conversation-binding-store.ts +20 -1
  10. package/adapters/computer/chatgpt-extension-target.ts +295 -50
  11. package/adapters/computer/chrome-extension/background.js +227 -71
  12. package/adapters/computer/chrome-extension/content.js +181 -157
  13. package/adapters/computer/chrome-extension/manifest.json +3 -1
  14. package/adapters/computer/desktop-operator-provider.ts +18 -6
  15. package/adapters/computer/interaction-target-authority.ts +39 -9
  16. package/adapters/mcp/access-mode.ts +18 -39
  17. package/adapters/mcp/auth.ts +2 -6
  18. package/adapters/mcp/instructions.ts +2 -2
  19. package/adapters/mcp/multi-repository.ts +7 -28
  20. package/adapters/mcp/runtime-gateway/context-adapter.ts +79 -40
  21. package/adapters/mcp/runtime-gateway/context-pack-sidecar.ts +7 -15
  22. package/adapters/mcp/runtime-gateway/execution-tools.ts +7 -13
  23. package/adapters/mcp/runtime-gateway/plugin-adapter.ts +16 -3
  24. package/adapters/mcp/runtime-gateway/process-tools.ts +3 -21
  25. package/adapters/mcp/runtime-gateway/router.ts +3 -5
  26. package/adapters/mcp/runtime-gateway/routing-policy.ts +17 -10
  27. package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +1 -1
  28. package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +14 -9
  29. package/adapters/mcp/runtime-gateway/runtime-tools.ts +1 -5
  30. package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +36 -1
  31. package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +58 -4
  32. package/adapters/mcp/runtime-gateway/typescript-navigation-sidecar.ts +7 -3
  33. package/adapters/mcp/runtime-gateway/work-adapter.ts +16 -16
  34. package/adapters/mcp/runtime-gateway/work-input-wire-migration.ts +0 -17
  35. package/adapters/mcp/runtime-gateway/work-semantic-operations.ts +69 -12
  36. package/adapters/mcp/runtime-gateway/workflow-supervisor-adapter.ts +26 -2
  37. package/adapters/mcp/server.ts +24 -3
  38. package/adapters/mcp/setup.ts +4 -10
  39. package/adapters/mcp/tool-mapping/access-tools.ts +0 -6
  40. package/adapters/mcp/tool-mapping/legacy-tool-service.ts +672 -2935
  41. package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +1 -1
  42. package/adapters/mcp/tool-mapping/repository-tools.ts +52 -86
  43. package/adapters/mcp/toolset-names.ts +11 -42
  44. package/adapters/mcp/toolset.ts +16 -90
  45. package/{src/cli → adapters}/mcp/transports/AGENTS.md +5 -5
  46. package/{src/cli → adapters}/mcp/transports/CLAUDE.md +5 -5
  47. package/adapters/mcp/transports/http-observation.ts +18 -6
  48. package/adapters/mcp/transports/http-post-lifecycle.ts +19 -0
  49. package/adapters/mcp/transports/http.ts +54 -14
  50. package/adapters/mcp/types.ts +0 -6
  51. package/assets/hooks/lib/session-state.sh +0 -38
  52. package/assets/hooks/post-bash.sh +1 -1
  53. package/assets/hooks/post-tool-observer.sh +0 -5
  54. package/assets/hooks/prompt-guard.sh +0 -55
  55. package/assets/partials/04-project-structure.partial.md +1 -1
  56. package/assets/partials/07-footer.partial.md +1 -1
  57. package/assets/partials-agents/02-operating-mode.partial.md +1 -1
  58. package/assets/partials-agents/08-deep-docs.partial.md +1 -1
  59. package/assets/reference-configs/agentic-development-flow.md +1 -1
  60. package/assets/reference-configs/external-tooling.md +0 -76
  61. package/assets/reference-configs/release-deploy.md +1 -1
  62. package/assets/templates/helpers/architecture-queue.sh +1 -1
  63. package/assets/templates/helpers/check-agent-tooling.sh +1 -327
  64. package/assets/templates/helpers/check-task-workflow.sh +1 -1
  65. package/assets/templates/helpers/ensure-task-workflow.sh +0 -14
  66. package/assets/templates/helpers/migrate-project-template.sh +2 -2
  67. package/assets/workflow-contract.v1.json +0 -2
  68. package/docs/README.md +5 -2
  69. package/docs/architecture/CURRENT.md +114 -30
  70. package/docs/architecture/decisions/20260904-ios-device-migration-baseline.md +42 -0
  71. package/docs/architecture/decisions/20260918-stable-candidate-release-lifecycle.md +15 -2
  72. package/docs/architecture/decisions/20260924-thin-semantic-working-context.md +4 -2
  73. package/docs/architecture/decisions/20261001-supervisor-turn-authority.md +109 -4
  74. package/docs/architecture/decisions/20261009-exact-code-context-discovery.md +19 -0
  75. package/docs/architecture/decisions/20261009-generated-xcode-cache-retention.md +37 -0
  76. package/docs/architecture/decisions/20261011-autonomous-continuation-convergence.md +597 -0
  77. package/docs/architecture/decisions/20261017-edit-session-finalization-reconciliation.md +17 -0
  78. package/docs/architecture/decisions/20261019-retire-host-skills.md +16 -0
  79. package/docs/architecture/diagrams/agentic-dev-plugin-architecture.html +1 -1
  80. package/docs/architecture/domains/public-surface.md +3 -5
  81. package/docs/architecture/domains/verification.md +5 -5
  82. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +2 -2
  83. package/docs/architecture/requests/2026-09-04-computer-plugin-workflow-taxonomy.md +4 -4
  84. package/docs/architecture/reviews/20261015-code-search-runtime-acceptance.md +75 -0
  85. package/docs/forge-plugin-management.md +14 -2
  86. package/docs/operations/controller-browser-plugin.md +23 -0
  87. package/docs/operations/features.md +6 -7
  88. package/docs/operations/features.zh-CN.md +1 -1
  89. package/docs/operations/github-repository.md +4 -4
  90. package/docs/operations/github-semantic-release-projection.md +20 -0
  91. package/docs/operations/homebrew.md +2 -2
  92. package/docs/operations/mcp-tool-exposure.md +13 -54
  93. package/docs/operations/runtime-performance-diagnostics.md +8 -0
  94. package/docs/operations/standalone-disaster-recovery.md +1 -1
  95. package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
  96. package/docs/tutorials/03-first-repository-task.md +2 -0
  97. package/docs/wiki/Computer-and-Plugins.md +78 -0
  98. package/docs/wiki/Computer-and-Plugins.zh-CN.md +88 -0
  99. package/docs/wiki/Home.md +16 -2
  100. package/docs/wiki/Implementation.md +24 -12
  101. package/docs/wiki/Installation.md +28 -32
  102. package/docs/wiki/Integrations.md +4 -0
  103. package/docs/wiki/Quick-Start.md +35 -22
  104. package/docs/wiki/Releases-and-Upgrades.md +15 -25
  105. package/docs/wiki/_Sidebar.md +5 -1
  106. package/package.json +1 -12
  107. package/packages/kernel/controller/infrastructure/controller-session-store.ts +63 -38
  108. package/packages/kernel/identity/infrastructure/activity-projection-store.ts +10 -0
  109. package/packages/kernel/scheduler/application/eligibility.ts +4 -1
  110. package/packages/kernel/scheduler/infrastructure/schedule-store.ts +13 -10
  111. package/packages/kernel/work/application/work-service.ts +1 -0
  112. package/packages/kernel/work/domain/repository-completion-receipt.ts +1 -1
  113. package/packages/kernel/work/domain/state-machine.ts +9 -2
  114. package/packages/kernel/work/infrastructure/work-contract-store.ts +28 -1
  115. package/packages/plugin-runtime/browser/provider-registry.ts +12 -36
  116. package/packages/plugin-runtime/computer/conversation-target.ts +17 -7
  117. package/scripts/assemble-template.ts +11 -72
  118. package/scripts/check-mcp-compatibility.ts +55 -74
  119. package/scripts/check-package-identity.mjs +0 -5
  120. package/scripts/check-runtime-architecture.mjs +305 -28
  121. package/scripts/init-project.sh +0 -46
  122. package/scripts/install-ios-hid-toolchain.sh +60 -0
  123. package/scripts/install-standalone-recovery.ts +1 -1
  124. package/scripts/lib/project-init-lib.sh +3 -3
  125. package/scripts/migrate-windows-wsl-controller-home.ts +2 -0
  126. package/scripts/open-source-audit-allowlist.txt +0 -1
  127. package/scripts/run-governed-gate.ts +2 -0
  128. package/scripts/smoke-ios-physical-device.ts +38 -10
  129. package/scripts/smoke-mcp-http-runtime.ts +7 -8
  130. package/scripts/smoke-mcp-tool-surface.ts +27 -41
  131. package/scripts/smoke-workflow-supervisor-chrome-adapter.ts +6 -3
  132. package/scripts/sync-generated-authority.mjs +0 -1
  133. package/src/cli/agent-jobs/executor-health.ts +1 -1
  134. package/src/cli/agent-jobs/integration.ts +2 -2
  135. package/src/cli/chatgpt-browser/file-policy.ts +2 -2
  136. package/src/cli/commands/doctor.ts +1 -143
  137. package/src/cli/commands/global-runtime.ts +3 -196
  138. package/src/cli/commands/init-hook.ts +6 -23
  139. package/src/cli/commands/init.ts +3 -252
  140. package/src/cli/commands/mcp.ts +0 -5
  141. package/src/cli/commands/prompt-guard-decision.ts +0 -2
  142. package/src/cli/commands/recovery.ts +2 -14
  143. package/src/cli/commands/repository.ts +17 -1
  144. package/src/cli/commands/setup-execution.ts +41 -0
  145. package/src/cli/controller/completion-orchestrator.ts +1 -1
  146. package/src/cli/controller/composite-operations.ts +1 -1
  147. package/src/cli/controller/context/instruction-context.ts +1 -1
  148. package/src/cli/controller/context/known-paths.ts +2 -2
  149. package/src/cli/controller/context/query-planning.ts +11 -4
  150. package/src/cli/controller/context/rule-resolution.ts +2 -2
  151. package/src/cli/controller/context/source-materializer.ts +2 -2
  152. package/src/cli/controller/context/structural-provider.ts +84 -0
  153. package/src/cli/controller/context/structural.ts +6 -6
  154. package/src/cli/controller/context/types.ts +8 -9
  155. package/src/cli/controller/context-pack.ts +97 -76
  156. package/src/cli/controller/operational-plan.ts +1 -1
  157. package/src/cli/controller/systemd-user.ts +4 -10
  158. package/src/cli/editing/edit-session.ts +17 -5
  159. package/src/cli/github/github.ts +4 -4
  160. package/src/cli/github/semantic-projection.ts +174 -0
  161. package/src/cli/hook/prompt-intents.ts +0 -9
  162. package/src/cli/index.ts +1 -43
  163. package/src/cli/local-bridge/connector-freshness.ts +1 -12
  164. package/src/cli/local-bridge/console-automations.ts +1 -1
  165. package/src/cli/local-bridge/console-view-models.ts +1 -1
  166. package/src/cli/local-bridge/facade-api.ts +0 -2
  167. package/src/cli/repositories/command-classifier.ts +0 -9
  168. package/src/cli/repositories/command-scope.ts +2 -2
  169. package/src/cli/repositories/locks.ts +20 -0
  170. package/src/cli/repositories/registry.ts +2 -1
  171. package/src/cli/repositories/safe-patch.ts +2 -12
  172. package/src/cli/repositories/structured-git.ts +39 -3
  173. package/src/cli/repository/inspector.ts +185 -343
  174. package/src/effects/process-runner.ts +17 -1
  175. package/src/runtime/context/generic-lsp-provider.ts +1 -1
  176. package/src/runtime/context/semantic-navigation-contract.ts +7 -0
  177. package/src/runtime/context/semantic-navigation.ts +1 -1
  178. package/src/runtime/control-plane/cleanup-artifact-retention.ts +4 -4
  179. package/src/runtime/control-plane/execution/work-delivery-service.ts +150 -31
  180. package/src/runtime/control-plane/execution/work-handle-authority.ts +12 -4
  181. package/src/runtime/control-plane/execution/work-handle-store.ts +53 -1
  182. package/src/runtime/control-plane/execution/work-operation-service.ts +20 -10
  183. package/src/runtime/control-plane/execution/work-preparation-service.ts +108 -4
  184. package/src/runtime/control-plane/execution/work-process-evidence.ts +2 -2
  185. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +28 -13
  186. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +5 -1
  187. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +1 -1
  188. package/src/runtime/control-plane/facade/capability-registry.ts +2 -0
  189. package/src/runtime/control-plane/facade/work-continuation.ts +1 -1
  190. package/src/runtime/control-plane/generated-cache-retention.ts +114 -63
  191. package/src/runtime/control-plane/global-scheduler/maintenance.ts +20 -8
  192. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +1 -11
  193. package/src/runtime/control-plane/governance/external-effects.ts +1 -1
  194. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +1 -0
  195. package/src/runtime/control-plane/runtime-cleanup.ts +12 -93
  196. package/src/runtime/evidence/sensitive-output.ts +22 -2
  197. package/src/runtime/execution/jobs/child-reference.ts +11 -0
  198. package/src/runtime/execution/jobs/receipt-recovery.ts +1 -11
  199. package/src/runtime/execution/process-runtime/command-facade.ts +3 -3
  200. package/src/runtime/execution/process-runtime/runtime.ts +20 -16
  201. package/src/runtime/execution/thin-harness/execution-router.ts +16 -16
  202. package/src/runtime/execution/thin-harness/fast-executor.ts +2 -2
  203. package/src/runtime/execution/thin-harness/search-worker.ts +2 -2
  204. package/src/runtime/execution/workers/executor.ts +1 -2
  205. package/src/runtime/maintenance/cleanup.ts +41 -5
  206. package/src/runtime/plugins/action-application.ts +12 -1
  207. package/src/runtime/plugins/app-store-connect-adapter.ts +252 -4
  208. package/src/runtime/plugins/browser-adapter.ts +381 -313
  209. package/src/runtime/plugins/browser-macos-bridge.ts +114 -112
  210. package/src/runtime/plugins/browser-manifest-surface.ts +2 -1
  211. package/src/runtime/plugins/browser-registration.ts +2 -0
  212. package/src/runtime/plugins/browser-runtime.ts +26 -35
  213. package/src/runtime/plugins/computer-chatgpt-browser-adapter-installer.ts +11 -2
  214. package/src/runtime/plugins/computer-registration.ts +76 -9
  215. package/src/runtime/plugins/github-adapter.ts +30 -3
  216. package/src/runtime/plugins/gmail-adapter.ts +166 -1
  217. package/src/runtime/plugins/google-shared.ts +10 -5
  218. package/src/runtime/plugins/ios/remote-xpc-hid.ts +70 -30
  219. package/src/runtime/plugins/ios-adapter.ts +45 -40
  220. package/src/runtime/plugins/ios-agent-device.ts +54 -4
  221. package/src/runtime/plugins/ios-device-ownership.ts +103 -0
  222. package/src/runtime/plugins/ios-physical-device.ts +497 -79
  223. package/src/runtime/plugins/local-system-adapter.ts +1 -99
  224. package/src/runtime/plugins/store.ts +80 -7
  225. package/src/runtime/plugins/types.ts +4 -0
  226. package/src/runtime/projections/git-status-sampler.ts +2 -19
  227. package/src/runtime/recovery/actions.ts +1 -1
  228. package/src/runtime/recovery/lifecycle-inventory.ts +1 -11
  229. package/src/runtime/recovery/probe.ts +2 -2
  230. package/src/runtime/release/release-coordinator.ts +20 -4
  231. package/src/runtime/root/controller-progression-composition.ts +67 -5
  232. package/src/runtime/root/package-connector-service.ts +123 -11
  233. package/src/runtime/root/package-runtime-release.ts +6 -18
  234. package/src/runtime/root/package-runtime-service.ts +7 -13
  235. package/src/runtime/root/release-execution-canary.ts +18 -5
  236. package/src/runtime/root/release-manifest.ts +0 -34
  237. package/src/runtime/root/release-materialize.ts +0 -78
  238. package/src/runtime/root/runtime.ts +1 -2
  239. package/src/runtime/root/scheduled-controller-composition.ts +2 -1
  240. package/src/runtime/root/service.ts +90 -11
  241. package/src/runtime/root/types.ts +0 -6
  242. package/src/runtime/root/workflow-supervisor-composition.ts +207 -19
  243. package/src/runtime/root/workflow-supervisor-runtime.ts +365 -10
  244. package/src/runtime/safe-tooling/google-credential-store.ts +1 -11
  245. package/src/runtime/safe-tooling/ios-development.ts +22 -8
  246. package/src/runtime/safe-tooling/job-summary.ts +1 -1
  247. package/src/runtime/safe-tooling/workspace-auth.ts +4 -1
  248. package/src/runtime/shared/atomic-text-file.ts +21 -0
  249. package/src/runtime/shared/json-files.ts +8 -3
  250. package/src/runtime/standalone-recovery/core.ts +189 -174
  251. package/src/runtime/standalone-recovery/entry.ts +62 -30
  252. package/src/runtime/standalone-recovery/operation-lock.ts +11 -1
  253. package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +1 -0
  254. package/src/runtime/workflow/schedules/engine.ts +36 -14
  255. package/src/runtime/workflow/schedules/pending-activation.ts +11 -4
  256. package/src/runtime/workflow/schedules/work-continuation.ts +51 -6
  257. package/supervisor/client.ts +31 -14
  258. package/supervisor/control-plane.ts +210 -115
  259. package/supervisor/forge-validators.ts +88 -21
  260. package/supervisor/native-browser-adapter.ts +393 -28
  261. package/supervisor/native-messaging/host.ts +21 -2
  262. package/supervisor/protocol.ts +74 -26
  263. package/supervisor/server.ts +16 -8
  264. package/supervisor/store.ts +476 -57
  265. package/supervisor/types.ts +19 -13
  266. package/SKILL.md +0 -427
  267. package/adapters/computer/chatgpt-target-router.ts +0 -103
  268. package/adapters/mcp/runtime-gateway/automation-receipt-adapter.ts +0 -87
  269. package/adapters/mcp/runtime-gateway/work-validation-reconciler.ts +0 -1
  270. package/adapters/mcp/toolset-selection.ts +0 -41
  271. package/agents/openai.yaml +0 -4
  272. package/assets/skill-hooks.json +0 -41
  273. package/assets/skill-version.json +0 -189
  274. package/assets/skills/claude-review/SKILL.md +0 -231
  275. package/assets/skills/codex-review/SKILL.md +0 -103
  276. package/assets/templates/helpers/check-skill-version.ts +0 -193
  277. package/scripts/check-skill-version.ts +0 -5
  278. package/scripts/ensure-codegraph.sh +0 -16
  279. package/scripts/run-skill-hook.ts +0 -244
  280. package/scripts/sync-codex-installed-copies.sh +0 -182
  281. package/src/cli/commands/tools.ts +0 -167
  282. package/src/cli/mcp/access-mode.ts +0 -2
  283. package/src/cli/mcp/access-tools.ts +0 -2
  284. package/src/cli/mcp/audit.ts +0 -2
  285. package/src/cli/mcp/auth.ts +0 -2
  286. package/src/cli/mcp/instructions.ts +0 -2
  287. package/src/cli/mcp/legacy-context.ts +0 -2
  288. package/src/cli/mcp/legacy-tool-service.ts +0 -2
  289. package/src/cli/mcp/multi-repository.ts +0 -2
  290. package/src/cli/mcp/oauth.ts +0 -2
  291. package/src/cli/mcp/openai-secure-tunnel.ts +0 -2
  292. package/src/cli/mcp/paths.ts +0 -2
  293. package/src/cli/mcp/policy.ts +0 -2
  294. package/src/cli/mcp/post-finalize-work-attribution.ts +0 -2
  295. package/src/cli/mcp/proxy-env.ts +0 -2
  296. package/src/cli/mcp/readiness-projection.ts +0 -2
  297. package/src/cli/mcp/redaction.ts +0 -2
  298. package/src/cli/mcp/repo.ts +0 -2
  299. package/src/cli/mcp/repository-tools.ts +0 -2
  300. package/src/cli/mcp/server.ts +0 -2
  301. package/src/cli/mcp/setup.ts +0 -2
  302. package/src/cli/mcp/tool-capability-cache.ts +0 -2
  303. package/src/cli/mcp/tool-contract.ts +0 -2
  304. package/src/cli/mcp/tools.ts +0 -2
  305. package/src/cli/mcp/toolset-names.ts +0 -2
  306. package/src/cli/mcp/toolset-selection.ts +0 -2
  307. package/src/cli/mcp/toolset.ts +0 -2
  308. package/src/cli/mcp/transports/http.ts +0 -2
  309. package/src/cli/mcp/transports/session-registry.ts +0 -2
  310. package/src/cli/mcp/transports/stdio.ts +0 -2
  311. package/src/cli/mcp/types.ts +0 -2
  312. package/src/cli/mcp/umbrella-tools.ts +0 -2
  313. package/src/cli/tools/codegraph.ts +0 -695
  314. package/src/core/adoption/helper-wrapper-plan.ts +0 -159
  315. package/src/runtime/context/codegraph-cache-boundary.ts +0 -255
  316. package/src/runtime/context/codegraph-read-provider.ts +0 -611
  317. package/src/runtime/context/codegraph-sidecar.cjs +0 -248
  318. package/src/runtime/control-plane/codegraph-cache-retention.ts +0 -164
  319. package/src/runtime/gateway/mcp/execution-tools.ts +0 -2
  320. package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +0 -2
  321. package/src/runtime/gateway/mcp/persisted-check-process.ts +0 -2
  322. package/src/runtime/gateway/mcp/process-tools.ts +0 -2
  323. package/src/runtime/gateway/mcp/router.ts +0 -2
  324. package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +0 -2
  325. package/src/runtime/gateway/mcp/runtime-tools.ts +0 -2
  326. package/src/runtime/gateway/mcp/work-validation-reconciler.ts +0 -2
  327. package/src/runtime/plugins/browser-provider-registry.ts +0 -2
  328. package/src/runtime/plugins/computer-chatgpt-macos-target.ts +0 -891
@@ -1,248 +0,0 @@
1
- 'use strict';
2
-
3
- const fs = require('fs');
4
- const path = require('path');
5
- const readline = require('readline');
6
- const { performance } = require('perf_hooks');
7
-
8
- const SCHEMA_VERSION = 1;
9
- const ALLOWED_OPERATIONS = new Set(['status', 'search', 'context', 'impact', 'file_dependencies']);
10
-
11
- function clamp(value, fallback, min, max) {
12
- if (typeof value !== 'number' || !Number.isFinite(value)) return fallback;
13
- return Math.min(Math.max(Math.trunc(value), min), max);
14
- }
15
-
16
- function failure(operation, code, message) {
17
- return {
18
- schemaVersion: SCHEMA_VERSION,
19
- ok: false,
20
- operation,
21
- error: { code, message: String(message).slice(0, 1000) },
22
- };
23
- }
24
-
25
- function writeResponse(response, options = {}) {
26
- process.stdout.write(`${JSON.stringify(response)}${options.newline ? '\n' : ''}`);
27
- if (options.failExit && response.ok === false) process.exitCode = 1;
28
- }
29
-
30
- function nodeSummary(node) {
31
- return {
32
- id: node.id,
33
- kind: node.kind,
34
- name: node.name,
35
- qualifiedName: node.qualifiedName,
36
- filePath: node.filePath,
37
- language: node.language,
38
- startLine: node.startLine,
39
- endLine: node.endLine,
40
- ...(node.signature ? { signature: String(node.signature).slice(0, 1000) } : {}),
41
- };
42
- }
43
-
44
- function edgeSummary(edge) {
45
- return {
46
- source: edge.source,
47
- target: edge.target,
48
- kind: edge.kind,
49
- ...(typeof edge.line === 'number' ? { line: edge.line } : {}),
50
- ...(edge.provenance ? { provenance: edge.provenance } : {}),
51
- };
52
- }
53
-
54
- function subgraphSummary(subgraph, maxNodes) {
55
- const nodes = Array.from(subgraph.nodes.values()).slice(0, maxNodes);
56
- const nodeIds = new Set(nodes.map((node) => node.id));
57
- const edges = subgraph.edges
58
- .filter((edge) => nodeIds.has(edge.source) && nodeIds.has(edge.target))
59
- .slice(0, maxNodes * 3);
60
- const byId = new Map(nodes.map((node) => [node.id, node]));
61
- return {
62
- nodes: nodes.map(nodeSummary),
63
- edges: edges.map(edgeSummary),
64
- roots: subgraph.roots.filter((id) => nodeIds.has(id)).slice(0, 20),
65
- entryPoints: subgraph.roots.map((id) => byId.get(id)).filter(Boolean).slice(0, 12).map(nodeSummary),
66
- relatedFiles: Array.from(new Set(nodes.map((node) => node.filePath).filter(Boolean))).slice(0, 80),
67
- ...(subgraph.confidence ? { confidence: subgraph.confidence } : {}),
68
- truncated: subgraph.nodes.size > nodes.length || subgraph.edges.length > edges.length,
69
- };
70
- }
71
-
72
- function metadata(graph) {
73
- const changed = graph.getChangedFiles();
74
- const build = graph.getIndexBuildInfo();
75
- const stats = graph.getStats();
76
- return {
77
- initialized: true,
78
- lastIndexedAt: graph.getLastIndexedAt(),
79
- buildVersion: build.version,
80
- extractionVersion: build.extractionVersion,
81
- staleEngine: graph.isIndexStale(),
82
- changedFiles: {
83
- added: changed.added.slice(0, 50),
84
- modified: changed.modified.slice(0, 50),
85
- removed: changed.removed.slice(0, 50),
86
- },
87
- stats: {
88
- nodeCount: stats.nodeCount,
89
- edgeCount: stats.edgeCount,
90
- fileCount: stats.fileCount,
91
- dbSizeBytes: stats.dbSizeBytes,
92
- lastUpdated: stats.lastUpdated,
93
- },
94
- backend: String(graph.getBackend()),
95
- journalMode: String(graph.getJournalMode()),
96
- };
97
- }
98
-
99
- let CodeGraph;
100
-
101
- function loadCodeGraph(operation) {
102
- if (CodeGraph) return { ok: true, CodeGraph };
103
- try {
104
- const configuredLibrary = process.env.FORGE_CODEGRAPH_LIBRARY_PATH;
105
- const library = require(configuredLibrary || '@colbymchenry/codegraph');
106
- if (typeof library.setLogger === 'function' && library.silentLogger) library.setLogger(library.silentLogger);
107
- CodeGraph = library.CodeGraph || library.default;
108
- } catch (error) {
109
- return { ok: false, response: failure(operation, 'CODEGRAPH_LIBRARY_UNAVAILABLE', error instanceof Error ? error.message : error) };
110
- }
111
- if (!CodeGraph || typeof CodeGraph.open !== 'function') {
112
- return { ok: false, response: failure(operation, 'CODEGRAPH_LIBRARY_UNAVAILABLE', 'CodeGraph SDK entry point is unavailable.') };
113
- }
114
- return { ok: true, CodeGraph };
115
- }
116
-
117
- async function handleRequest(request) {
118
- const operation = request && request.operation;
119
- if (!request || request.schemaVersion !== SCHEMA_VERSION || !ALLOWED_OPERATIONS.has(operation)) {
120
- return failure(operation, 'CODEGRAPH_OPERATION_NOT_ALLOWED', `Unsupported read operation: ${String(operation)}`);
121
- }
122
- if (typeof request.projectRoot !== 'string' || !path.isAbsolute(request.projectRoot)) {
123
- return failure(operation, 'CODEGRAPH_PROJECT_ROOT_INVALID', 'projectRoot must be an absolute path selected by Forge.');
124
- }
125
-
126
- const loaded = loadCodeGraph(operation);
127
- if (!loaded.ok) return loaded.response;
128
- if (!loaded.CodeGraph.isInitialized(request.projectRoot)) {
129
- return {
130
- schemaVersion: SCHEMA_VERSION,
131
- ok: true,
132
- operation,
133
- metadata: {
134
- initialized: false,
135
- lastIndexedAt: null,
136
- buildVersion: null,
137
- extractionVersion: null,
138
- staleEngine: false,
139
- changedFiles: { added: [], modified: [], removed: [] },
140
- },
141
- result: {},
142
- timingsMs: { open: 0, query: 0 },
143
- };
144
- }
145
-
146
- let graph;
147
- const openStartedAt = performance.now();
148
- const refreshIfStale = request.refresh === 'if_stale';
149
- try {
150
- // Structural refresh mutates only the Forge-owned derived CodeGraph cache.
151
- // Ordinary/auto reads stay strictly read-only so they never acquire hidden
152
- // lifecycle authority or pay an indexing latency tax.
153
- graph = await loaded.CodeGraph.open(request.projectRoot, {
154
- sync: refreshIfStale,
155
- readOnly: !refreshIfStale,
156
- });
157
- } catch (error) {
158
- return failure(operation, 'CODEGRAPH_OPEN_FAILED', error instanceof Error ? error.message : error);
159
- }
160
- const openMs = Math.round((performance.now() - openStartedAt) * 100) / 100;
161
-
162
- try {
163
- const queryStartedAt = performance.now();
164
- const limit = clamp(request.limit, 12, 1, 40);
165
- const maxNodes = clamp(request.maxNodes, 40, 1, 80);
166
- const maxDepth = clamp(request.maxDepth, 2, 1, 5);
167
- let result = {};
168
- if (operation === 'search') {
169
- if (typeof request.query !== 'string' || !request.query.trim()) throw new Error('CODEGRAPH_QUERY_REQUIRED');
170
- result = {
171
- results: graph.searchNodes(request.query.trim(), { limit }).map((entry) => ({
172
- node: nodeSummary(entry.node),
173
- score: entry.score,
174
- highlights: Array.isArray(entry.highlights) ? entry.highlights.slice(0, 8).map((value) => String(value).slice(0, 500)) : [],
175
- })),
176
- };
177
- } else if (operation === 'context') {
178
- if (typeof request.query !== 'string' || !request.query.trim()) throw new Error('CODEGRAPH_QUERY_REQUIRED');
179
- const subgraph = await graph.findRelevantContext(request.query.trim(), {
180
- searchLimit: Math.min(limit, 12),
181
- traversalDepth: Math.min(maxDepth, 3),
182
- maxNodes,
183
- });
184
- result = subgraphSummary(subgraph, maxNodes);
185
- } else if (operation === 'impact') {
186
- if (typeof request.nodeId !== 'string' || !request.nodeId.trim()) throw new Error('CODEGRAPH_NODE_ID_REQUIRED');
187
- result = subgraphSummary(graph.getImpactRadius(request.nodeId.trim(), maxDepth), maxNodes);
188
- } else if (operation === 'file_dependencies') {
189
- if (typeof request.filePath !== 'string' || !request.filePath.trim()) throw new Error('CODEGRAPH_FILE_PATH_REQUIRED');
190
- result = {
191
- filePath: request.filePath.trim(),
192
- dependencies: graph.getFileDependencies(request.filePath.trim()).slice(0, 100),
193
- dependents: graph.getFileDependents(request.filePath.trim()).slice(0, 100),
194
- };
195
- }
196
- const queryMs = Math.round((performance.now() - queryStartedAt) * 100) / 100;
197
- return {
198
- schemaVersion: SCHEMA_VERSION,
199
- ok: true,
200
- operation,
201
- metadata: metadata(graph),
202
- result,
203
- timingsMs: { open: openMs, query: queryMs },
204
- };
205
- } catch (error) {
206
- return failure(operation, 'CODEGRAPH_QUERY_FAILED', error instanceof Error ? error.message : error);
207
- } finally {
208
- try { graph.close(); } catch (_) { /* no-op */ }
209
- }
210
- }
211
-
212
- async function runOneShot() {
213
- let request;
214
- try {
215
- request = JSON.parse(fs.readFileSync(0, 'utf8'));
216
- } catch (error) {
217
- writeResponse(failure(undefined, 'CODEGRAPH_REQUEST_INVALID', error instanceof Error ? error.message : error), { failExit: true });
218
- return;
219
- }
220
- writeResponse(await handleRequest(request), { failExit: true });
221
- }
222
-
223
- async function runPersistent() {
224
- const lines = readline.createInterface({ input: process.stdin, crlfDelay: Infinity });
225
- for await (const line of lines) {
226
- if (!line.trim()) continue;
227
- let request;
228
- try {
229
- request = JSON.parse(line);
230
- } catch (error) {
231
- writeResponse(failure(undefined, 'CODEGRAPH_REQUEST_INVALID', error instanceof Error ? error.message : error), { newline: true });
232
- continue;
233
- }
234
- try {
235
- writeResponse(await handleRequest(request), { newline: true });
236
- } catch (error) {
237
- writeResponse(failure(request?.operation, 'CODEGRAPH_SIDECAR_UNHANDLED', error instanceof Error ? error.message : error), { newline: true });
238
- }
239
- }
240
- }
241
-
242
- const run = process.env.FORGE_CODEGRAPH_PERSISTENT === '1' ? runPersistent : runOneShot;
243
- run().catch((error) => {
244
- writeResponse(failure(undefined, 'CODEGRAPH_SIDECAR_UNHANDLED', error instanceof Error ? error.message : error), {
245
- newline: process.env.FORGE_CODEGRAPH_PERSISTENT === '1',
246
- failExit: process.env.FORGE_CODEGRAPH_PERSISTENT !== '1',
247
- });
248
- });
@@ -1,164 +0,0 @@
1
- import { existsSync, lstatSync, readdirSync, rmSync } from 'fs';
2
- import { join, relative, resolve } from 'path';
3
- import { codegraphCacheIdentity, codegraphCacheRoot } from '../context/codegraph-cache-boundary';
4
- import { measureReclaimablePath } from './lifecycle-retention-metrics';
5
-
6
- export const CODEGRAPH_CACHE_RETENTION_POLICY_VERSION = 'codegraph-cache-retention-v2';
7
- export const DEFAULT_CODEGRAPH_CACHE_RETENTION_MS = 7 * 24 * 60 * 60_000;
8
- export const DEFAULT_CODEGRAPH_CACHE_MAX_REPOSITORY_BYTES = 512 * 1024 * 1024;
9
- export const DEFAULT_CODEGRAPH_CACHE_MAX_TOTAL_BYTES = 2 * 1024 * 1024 * 1024;
10
- const DEFAULT_CODEGRAPH_CACHE_SCAN_BUDGET = 512;
11
- const DEFAULT_CODEGRAPH_CACHE_REMOVAL_BUDGET = 16;
12
-
13
- export interface CodegraphCacheRetentionOptions {
14
- nowMs?: number;
15
- retentionMs?: number;
16
- maxRepositoryBytes?: number;
17
- maxTotalBytes?: number;
18
- maxEntries?: number;
19
- maxRemovals?: number;
20
- /** Repository roots with a live process-scoped locator. */
21
- protectedRepositoryRoots?: readonly string[];
22
- }
23
-
24
- export interface CodegraphCacheRetentionReport {
25
- policyVersion: typeof CODEGRAPH_CACHE_RETENTION_POLICY_VERSION;
26
- inspected: number;
27
- eligible: number;
28
- attempted: number;
29
- removedPaths: string[];
30
- reclaimedBytes: number;
31
- unknownReclaimedByteCount: number;
32
- observedBytes: number;
33
- unknownObservedByteCount: number;
34
- retained: number;
35
- protected: number;
36
- protectedOverCapacity: number;
37
- skippedByReason: Record<string, number>;
38
- errors: string[];
39
- truncated: boolean;
40
- budgetExhausted: boolean;
41
- }
42
-
43
- function increment(counts: Record<string, number>, reason: string): void {
44
- counts[reason] = (counts[reason] ?? 0) + 1;
45
- }
46
-
47
- /**
48
- * Reclaim only Forge-owned, rebuildable CodeGraph caches. LRU recency is the
49
- * cache-root mtime touched when a process-scoped locator is acquired/released.
50
- * A live locator fences deletion. Inactive caches are eligible when old, over
51
- * the per-repository cap, or when the Controller Home aggregate is over cap.
52
- */
53
- export function cleanupCodegraphCaches(
54
- controllerHome: string,
55
- options: CodegraphCacheRetentionOptions = {},
56
- ): CodegraphCacheRetentionReport {
57
- const root = codegraphCacheRoot(controllerHome);
58
- const nowMs = options.nowMs ?? Date.now();
59
- const retentionMs = Math.max(60_000, Math.floor(options.retentionMs ?? DEFAULT_CODEGRAPH_CACHE_RETENTION_MS));
60
- const maxRepositoryBytes = Math.max(1, Math.floor(options.maxRepositoryBytes ?? DEFAULT_CODEGRAPH_CACHE_MAX_REPOSITORY_BYTES));
61
- const maxTotalBytes = Math.max(1, Math.floor(options.maxTotalBytes ?? DEFAULT_CODEGRAPH_CACHE_MAX_TOTAL_BYTES));
62
- const maxEntries = Math.max(1, Math.floor(options.maxEntries ?? DEFAULT_CODEGRAPH_CACHE_SCAN_BUDGET));
63
- const maxRemovals = Math.max(0, Math.floor(options.maxRemovals ?? DEFAULT_CODEGRAPH_CACHE_REMOVAL_BUDGET));
64
- const protectedIds = new Set((options.protectedRepositoryRoots ?? []).map(codegraphCacheIdentity));
65
- const report: CodegraphCacheRetentionReport = {
66
- policyVersion: CODEGRAPH_CACHE_RETENTION_POLICY_VERSION,
67
- inspected: 0,
68
- eligible: 0,
69
- attempted: 0,
70
- removedPaths: [],
71
- reclaimedBytes: 0,
72
- unknownReclaimedByteCount: 0,
73
- observedBytes: 0,
74
- unknownObservedByteCount: 0,
75
- retained: 0,
76
- protected: 0,
77
- protectedOverCapacity: 0,
78
- skippedByReason: {},
79
- errors: [],
80
- truncated: false,
81
- budgetExhausted: false,
82
- };
83
- if (!existsSync(root)) return report;
84
-
85
- let entries: Array<{ name: string; path: string; mtimeMs: number; bytes: number; sizeKnown: boolean }> = [];
86
- try {
87
- for (const entry of readdirSync(root, { withFileTypes: true })) {
88
- const path = join(root, String(entry.name));
89
- try {
90
- const stat = lstatSync(path);
91
- if (!entry.isDirectory() || stat.isSymbolicLink() || !/^[a-f0-9]{24}$/.test(String(entry.name))) {
92
- increment(report.skippedByReason, 'ownership_unproven');
93
- report.retained += 1;
94
- continue;
95
- }
96
- const measurement = measureReclaimablePath(path);
97
- if (measurement.complete) report.observedBytes += measurement.bytes;
98
- else report.unknownObservedByteCount += 1;
99
- entries.push({ name: String(entry.name), path, mtimeMs: stat.mtimeMs, bytes: measurement.bytes, sizeKnown: measurement.complete });
100
- } catch (error) {
101
- report.errors.push(`${String(entry.name)}: ${error instanceof Error ? error.message : String(error)}`);
102
- }
103
- }
104
- } catch (error) {
105
- report.errors.push(`codegraph cache root: ${error instanceof Error ? error.message : String(error)}`);
106
- return report;
107
- }
108
-
109
- // Oldest first is LRU because locator acquire/release touches the cache root.
110
- entries.sort((left, right) => left.mtimeMs - right.mtimeMs || left.name.localeCompare(right.name));
111
- if (entries.length > maxEntries) report.truncated = true;
112
- entries = entries.slice(0, maxEntries);
113
- let knownRetainedBytes = report.observedBytes;
114
- if (report.unknownObservedByteCount > 0) increment(report.skippedByReason, 'capacity_unknown_size');
115
-
116
- for (const entry of entries) {
117
- report.inspected += 1;
118
- const expired = nowMs - entry.mtimeMs >= retentionMs;
119
- const overRepositoryCap = entry.sizeKnown && entry.bytes > maxRepositoryBytes;
120
- const overTotalCap = knownRetainedBytes > maxTotalBytes;
121
- const capacityPressure = overRepositoryCap || overTotalCap;
122
-
123
- if (protectedIds.has(entry.name)) {
124
- report.protected += 1;
125
- report.retained += 1;
126
- increment(report.skippedByReason, 'active_locator');
127
- if (capacityPressure) {
128
- report.protectedOverCapacity += 1;
129
- increment(report.skippedByReason, 'active_cache_over_capacity');
130
- }
131
- continue;
132
- }
133
- if (!expired && !capacityPressure) {
134
- report.retained += 1;
135
- increment(report.skippedByReason, 'retention_grace');
136
- continue;
137
- }
138
-
139
- report.eligible += 1;
140
- if (report.attempted >= maxRemovals) {
141
- report.retained += 1;
142
- report.budgetExhausted = true;
143
- increment(report.skippedByReason, 'cleanup_budget_exhausted');
144
- continue;
145
- }
146
- report.attempted += 1;
147
- try {
148
- rmSync(entry.path, { recursive: true, force: true });
149
- report.removedPaths.push(relative(resolve(controllerHome), entry.path).replace(/\\/g, '/'));
150
- if (entry.sizeKnown) {
151
- report.reclaimedBytes += entry.bytes;
152
- knownRetainedBytes = Math.max(0, knownRetainedBytes - entry.bytes);
153
- } else {
154
- report.unknownReclaimedByteCount += 1;
155
- }
156
- } catch (error) {
157
- report.errors.push(`${entry.name}: ${error instanceof Error ? error.message : String(error)}`);
158
- }
159
- }
160
- if (knownRetainedBytes > maxTotalBytes) increment(report.skippedByReason, 'total_capacity_not_yet_converged');
161
- report.removedPaths.sort();
162
- report.errors.sort();
163
- return report;
164
- }
@@ -1,2 +0,0 @@
1
- /** @deprecated Kernel V2 compatibility shim. MCP gateway mapping authority lives in adapters/mcp. */
2
- export * from '../../../../adapters/mcp/runtime-gateway/execution-tools';
@@ -1,2 +0,0 @@
1
- /** @deprecated Kernel V2 compatibility shim. MCP gateway mapping authority lives in adapters/mcp. */
2
- export * from '../../../../adapters/mcp/runtime-gateway/legacy-ios-tool-adapter';
@@ -1,2 +0,0 @@
1
- /** @deprecated Kernel V2 compatibility shim. MCP gateway mapping authority lives in adapters/mcp. */
2
- export * from '../../../../adapters/mcp/runtime-gateway/persisted-check-process';
@@ -1,2 +0,0 @@
1
- /** @deprecated Kernel V2 compatibility shim. MCP gateway mapping authority lives in adapters/mcp. */
2
- export * from '../../../../adapters/mcp/runtime-gateway/process-tools';
@@ -1,2 +0,0 @@
1
- /** @deprecated Kernel V2 compatibility shim. MCP gateway mapping authority lives in adapters/mcp. */
2
- export * from '../../../../adapters/mcp/runtime-gateway/router';
@@ -1,2 +0,0 @@
1
- /** @deprecated Kernel V2 compatibility shim. MCP gateway mapping authority lives in adapters/mcp. */
2
- export * from '../../../../adapters/mcp/runtime-gateway/runtime-tool-definitions';
@@ -1,2 +0,0 @@
1
- /** @deprecated Kernel V2 compatibility shim. MCP gateway mapping authority lives in adapters/mcp. */
2
- export * from '../../../../adapters/mcp/runtime-gateway/runtime-tools';
@@ -1,2 +0,0 @@
1
- /** @deprecated Kernel V2 compatibility shim. MCP gateway mapping authority lives in adapters/mcp. */
2
- export * from '../../../../adapters/mcp/runtime-gateway/work-validation-reconciler';
@@ -1,2 +0,0 @@
1
- /** @deprecated C0 compatibility shim. Browser provider selection lives in packages/plugin-runtime/browser. */
2
- export * from '../../../packages/plugin-runtime/browser/provider-registry';