@hcu-lab.me/mcp-device 1.0.9 → 1.0.12

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 (506) hide show
  1. package/PRIVACY.md +21 -0
  2. package/README.md +58 -3
  3. package/SECURITY.md +67 -0
  4. package/config/revoked-approvals.json +1 -0
  5. package/control-plane/config/mcp-servers.example.toml +52 -0
  6. package/control-plane/config/mcp-servers.toml +52 -0
  7. package/control-plane/contracts/device-public-contract-v1.json +733 -0
  8. package/control-plane/scripts/GATEWAY-LICENSE.txt +7 -0
  9. package/control-plane/scripts/account-http.mjs +220 -0
  10. package/control-plane/scripts/account-store.mjs +368 -0
  11. package/control-plane/scripts/admin.mjs +68 -0
  12. package/control-plane/scripts/auth-session.mjs +411 -0
  13. package/control-plane/scripts/authenticated-mcp-wrapper.mjs +1281 -0
  14. package/control-plane/scripts/benchmark-command.mjs +9 -0
  15. package/control-plane/scripts/benchmark-mcp-catalog.mjs +174 -0
  16. package/control-plane/scripts/catalog-budget.mjs +87 -0
  17. package/control-plane/scripts/check-device-public-contract.mjs +20 -0
  18. package/control-plane/scripts/custom-tools/index.mjs +221 -0
  19. package/control-plane/scripts/custom-tools/path-utils.mjs +117 -0
  20. package/control-plane/scripts/custom-tools/response-utils.mjs +34 -0
  21. package/control-plane/scripts/dashboard-http.mjs +598 -0
  22. package/control-plane/scripts/device-access-policy.mjs +205 -0
  23. package/control-plane/scripts/device-admin.mjs +43 -0
  24. package/control-plane/scripts/device-audit.mjs +63 -0
  25. package/control-plane/scripts/device-broker.mjs +1461 -0
  26. package/control-plane/scripts/device-execution-tool-definitions.mjs +217 -0
  27. package/control-plane/scripts/device-inventory.mjs +128 -0
  28. package/control-plane/scripts/device-pairing-http.mjs +109 -0
  29. package/control-plane/scripts/device-pairing-store.mjs +245 -0
  30. package/control-plane/scripts/device-public-contract.mjs +165 -0
  31. package/control-plane/scripts/device-release.mjs +95 -0
  32. package/control-plane/scripts/device-secure-transport.mjs +128 -0
  33. package/control-plane/scripts/device-store.mjs +283 -0
  34. package/control-plane/scripts/device-usage.mjs +657 -0
  35. package/control-plane/scripts/embedded-device.mjs +149 -0
  36. package/control-plane/scripts/enduser-ui.mjs +45 -0
  37. package/control-plane/scripts/external-tool-broker.mjs +179 -0
  38. package/control-plane/scripts/oauth-authorization-server.mjs +589 -0
  39. package/control-plane/scripts/operator-dashboard-http.mjs +81 -0
  40. package/control-plane/scripts/project-inspection.mjs +227 -0
  41. package/control-plane/scripts/projects/project-id.mjs +69 -0
  42. package/control-plane/scripts/projects/trusted-roots-projects.mjs +375 -0
  43. package/control-plane/scripts/prompts/index.mjs +60 -0
  44. package/control-plane/scripts/remote-process-sessions.mjs +78 -0
  45. package/control-plane/scripts/remote-tool-result.mjs +9 -0
  46. package/control-plane/scripts/resources/index.mjs +166 -0
  47. package/control-plane/scripts/runtime-profile.mjs +54 -0
  48. package/control-plane/scripts/shell-tool-descriptor.mjs +17 -0
  49. package/control-plane/scripts/skill-source-safety.mjs +46 -0
  50. package/control-plane/scripts/skills/README.md +70 -0
  51. package/control-plane/scripts/skills/_upstream_licenses/anthropic-THIRD_PARTY_NOTICES.md +405 -0
  52. package/control-plane/scripts/skills/_upstream_licenses/hallmark-LICENSE.txt +21 -0
  53. package/control-plane/scripts/skills/_upstream_licenses/ponytail-LICENSE.txt +21 -0
  54. package/control-plane/scripts/skills/_upstream_licenses/stitch-skills-LICENSE.txt +201 -0
  55. package/control-plane/scripts/skills/_upstream_licenses/superpowers-LICENSE.txt +21 -0
  56. package/control-plane/scripts/skills/algorithmic-art/LICENSE.txt +202 -0
  57. package/control-plane/scripts/skills/algorithmic-art/SKILL.md +405 -0
  58. package/control-plane/scripts/skills/algorithmic-art/templates/generator_template.js +223 -0
  59. package/control-plane/scripts/skills/algorithmic-art/templates/viewer.html +599 -0
  60. package/control-plane/scripts/skills/brainstorming/SKILL.md +285 -0
  61. package/control-plane/scripts/skills/brainstorming/scripts/frame-template.html +213 -0
  62. package/control-plane/scripts/skills/brainstorming/scripts/helper.js +167 -0
  63. package/control-plane/scripts/skills/brainstorming/scripts/server.cjs +723 -0
  64. package/control-plane/scripts/skills/brainstorming/scripts/start-server.sh +209 -0
  65. package/control-plane/scripts/skills/brainstorming/scripts/stop-server.sh +120 -0
  66. package/control-plane/scripts/skills/brainstorming/spec-document-reviewer-prompt.md +49 -0
  67. package/control-plane/scripts/skills/brainstorming/visual-companion.md +299 -0
  68. package/control-plane/scripts/skills/brand-guidelines/LICENSE.txt +202 -0
  69. package/control-plane/scripts/skills/brand-guidelines/SKILL.md +73 -0
  70. package/control-plane/scripts/skills/claude-api/LICENSE.txt +202 -0
  71. package/control-plane/scripts/skills/claude-api/SKILL.md +570 -0
  72. package/control-plane/scripts/skills/claude-api/csharp/claude-api/README.md +362 -0
  73. package/control-plane/scripts/skills/claude-api/csharp/claude-api/batches.md +14 -0
  74. package/control-plane/scripts/skills/claude-api/csharp/claude-api/files-api.md +25 -0
  75. package/control-plane/scripts/skills/claude-api/csharp/claude-api/streaming.md +28 -0
  76. package/control-plane/scripts/skills/claude-api/csharp/claude-api/tool-use.md +164 -0
  77. package/control-plane/scripts/skills/claude-api/curl/examples.md +256 -0
  78. package/control-plane/scripts/skills/claude-api/curl/managed-agents.md +371 -0
  79. package/control-plane/scripts/skills/claude-api/go/claude-api/README.md +188 -0
  80. package/control-plane/scripts/skills/claude-api/go/claude-api/files-api.md +23 -0
  81. package/control-plane/scripts/skills/claude-api/go/claude-api/streaming.md +43 -0
  82. package/control-plane/scripts/skills/claude-api/go/claude-api/tool-use.md +220 -0
  83. package/control-plane/scripts/skills/claude-api/go/managed-agents/README.md +564 -0
  84. package/control-plane/scripts/skills/claude-api/java/claude-api/README.md +238 -0
  85. package/control-plane/scripts/skills/claude-api/java/claude-api/files-api.md +27 -0
  86. package/control-plane/scripts/skills/claude-api/java/claude-api/streaming.md +24 -0
  87. package/control-plane/scripts/skills/claude-api/java/claude-api/tool-use.md +228 -0
  88. package/control-plane/scripts/skills/claude-api/java/managed-agents/README.md +443 -0
  89. package/control-plane/scripts/skills/claude-api/php/claude-api/README.md +174 -0
  90. package/control-plane/scripts/skills/claude-api/php/claude-api/batches.md +15 -0
  91. package/control-plane/scripts/skills/claude-api/php/claude-api/files-api.md +13 -0
  92. package/control-plane/scripts/skills/claude-api/php/claude-api/streaming.md +27 -0
  93. package/control-plane/scripts/skills/claude-api/php/claude-api/tool-use.md +253 -0
  94. package/control-plane/scripts/skills/claude-api/php/managed-agents/README.md +443 -0
  95. package/control-plane/scripts/skills/claude-api/python/claude-api/README.md +565 -0
  96. package/control-plane/scripts/skills/claude-api/python/claude-api/batches.md +198 -0
  97. package/control-plane/scripts/skills/claude-api/python/claude-api/files-api.md +170 -0
  98. package/control-plane/scripts/skills/claude-api/python/claude-api/sdk-upgrade.md +286 -0
  99. package/control-plane/scripts/skills/claude-api/python/claude-api/streaming.md +179 -0
  100. package/control-plane/scripts/skills/claude-api/python/claude-api/tool-use.md +627 -0
  101. package/control-plane/scripts/skills/claude-api/python/managed-agents/README.md +335 -0
  102. package/control-plane/scripts/skills/claude-api/ruby/claude-api/README.md +134 -0
  103. package/control-plane/scripts/skills/claude-api/ruby/claude-api/streaming.md +16 -0
  104. package/control-plane/scripts/skills/claude-api/ruby/claude-api/tool-use.md +41 -0
  105. package/control-plane/scripts/skills/claude-api/ruby/managed-agents/README.md +394 -0
  106. package/control-plane/scripts/skills/claude-api/shared/admin-api.md +179 -0
  107. package/control-plane/scripts/skills/claude-api/shared/agent-design.md +101 -0
  108. package/control-plane/scripts/skills/claude-api/shared/anthropic-cli.md +269 -0
  109. package/control-plane/scripts/skills/claude-api/shared/claude-platform-on-aws.md +59 -0
  110. package/control-plane/scripts/skills/claude-api/shared/cost-optimization.md +233 -0
  111. package/control-plane/scripts/skills/claude-api/shared/error-codes.md +262 -0
  112. package/control-plane/scripts/skills/claude-api/shared/live-sources.md +166 -0
  113. package/control-plane/scripts/skills/claude-api/shared/managed-agents-api-reference.md +455 -0
  114. package/control-plane/scripts/skills/claude-api/shared/managed-agents-client-patterns.md +220 -0
  115. package/control-plane/scripts/skills/claude-api/shared/managed-agents-core.md +359 -0
  116. package/control-plane/scripts/skills/claude-api/shared/managed-agents-environments.md +226 -0
  117. package/control-plane/scripts/skills/claude-api/shared/managed-agents-events.md +290 -0
  118. package/control-plane/scripts/skills/claude-api/shared/managed-agents-memory.md +201 -0
  119. package/control-plane/scripts/skills/claude-api/shared/managed-agents-multiagent.md +260 -0
  120. package/control-plane/scripts/skills/claude-api/shared/managed-agents-onboarding.md +82 -0
  121. package/control-plane/scripts/skills/claude-api/shared/managed-agents-outcomes.md +108 -0
  122. package/control-plane/scripts/skills/claude-api/shared/managed-agents-overview.md +77 -0
  123. package/control-plane/scripts/skills/claude-api/shared/managed-agents-scheduled-deployments.md +156 -0
  124. package/control-plane/scripts/skills/claude-api/shared/managed-agents-self-hosted-sandboxes.md +282 -0
  125. package/control-plane/scripts/skills/claude-api/shared/managed-agents-tools.md +504 -0
  126. package/control-plane/scripts/skills/claude-api/shared/managed-agents-webhooks.md +143 -0
  127. package/control-plane/scripts/skills/claude-api/shared/model-migration.md +1872 -0
  128. package/control-plane/scripts/skills/claude-api/shared/models.md +142 -0
  129. package/control-plane/scripts/skills/claude-api/shared/platform-availability.md +52 -0
  130. package/control-plane/scripts/skills/claude-api/shared/prompt-audit.md +223 -0
  131. package/control-plane/scripts/skills/claude-api/shared/prompt-caching.md +292 -0
  132. package/control-plane/scripts/skills/claude-api/shared/token-counting.md +56 -0
  133. package/control-plane/scripts/skills/claude-api/shared/tool-use-concepts.md +526 -0
  134. package/control-plane/scripts/skills/claude-api/typescript/claude-api/README.md +405 -0
  135. package/control-plane/scripts/skills/claude-api/typescript/claude-api/batches.md +106 -0
  136. package/control-plane/scripts/skills/claude-api/typescript/claude-api/files-api.md +98 -0
  137. package/control-plane/scripts/skills/claude-api/typescript/claude-api/streaming.md +178 -0
  138. package/control-plane/scripts/skills/claude-api/typescript/claude-api/tool-use.md +586 -0
  139. package/control-plane/scripts/skills/claude-api/typescript/managed-agents/README.md +359 -0
  140. package/control-plane/scripts/skills/dispatching-parallel-agents/SKILL.md +167 -0
  141. package/control-plane/scripts/skills/enhance-prompt/README.md +34 -0
  142. package/control-plane/scripts/skills/enhance-prompt/SKILL.md +204 -0
  143. package/control-plane/scripts/skills/enhance-prompt/references/KEYWORDS.md +114 -0
  144. package/control-plane/scripts/skills/executing-plans/SKILL.md +371 -0
  145. package/control-plane/scripts/skills/executing-plans/scripts/task-done +52 -0
  146. package/control-plane/scripts/skills/executing-plans/scripts/task-start +28 -0
  147. package/control-plane/scripts/skills/extract-design-md/SKILL.md +358 -0
  148. package/control-plane/scripts/skills/extract-design-md/examples/DESIGN.md +210 -0
  149. package/control-plane/scripts/skills/extract-design-md/references/angular.md +122 -0
  150. package/control-plane/scripts/skills/extract-design-md/references/plain-css.md +161 -0
  151. package/control-plane/scripts/skills/extract-design-md/references/react-tailwind.md +157 -0
  152. package/control-plane/scripts/skills/extract-design-md/references/svelte.md +101 -0
  153. package/control-plane/scripts/skills/extract-design-md/references/vue.md +107 -0
  154. package/control-plane/scripts/skills/finishing-a-development-branch/SKILL.md +225 -0
  155. package/control-plane/scripts/skills/frontend-design/LICENSE.txt +177 -0
  156. package/control-plane/scripts/skills/frontend-design/SKILL.md +71 -0
  157. package/control-plane/scripts/skills/hallmark/SKILL.md +558 -0
  158. package/control-plane/scripts/skills/hallmark/references/anti-patterns.md +418 -0
  159. package/control-plane/scripts/skills/hallmark/references/assets.md +406 -0
  160. package/control-plane/scripts/skills/hallmark/references/color.md +95 -0
  161. package/control-plane/scripts/skills/hallmark/references/component-cookbook.md +263 -0
  162. package/control-plane/scripts/skills/hallmark/references/components/c1-outlined-chip.md +12 -0
  163. package/control-plane/scripts/skills/hallmark/references/components/c2-inline-form-as-cta.md +16 -0
  164. package/control-plane/scripts/skills/hallmark/references/components/c3-typographic-link.md +8 -0
  165. package/control-plane/scripts/skills/hallmark/references/components/c4-sticky-bottom-bar.md +16 -0
  166. package/control-plane/scripts/skills/hallmark/references/components/f1-bento-grid.md +20 -0
  167. package/control-plane/scripts/skills/hallmark/references/components/f2-sticky-scroll-stack.md +20 -0
  168. package/control-plane/scripts/skills/hallmark/references/components/f3-tabular-spec-sheet.md +11 -0
  169. package/control-plane/scripts/skills/hallmark/references/components/f4-step-sequence.md +11 -0
  170. package/control-plane/scripts/skills/hallmark/references/components/f5-annotated-screenshot.md +11 -0
  171. package/control-plane/scripts/skills/hallmark/references/components/f6-product-card-grid.md +41 -0
  172. package/control-plane/scripts/skills/hallmark/references/components/ft1-mast-headed.md +13 -0
  173. package/control-plane/scripts/skills/hallmark/references/components/ft2-inline-rule-single-line.md +10 -0
  174. package/control-plane/scripts/skills/hallmark/references/components/ft3-index-style-category-list.md +12 -0
  175. package/control-plane/scripts/skills/hallmark/references/components/ft4-dense-typographic.md +10 -0
  176. package/control-plane/scripts/skills/hallmark/references/components/ft5-statement.md +21 -0
  177. package/control-plane/scripts/skills/hallmark/references/components/ft6-letter-close.md +19 -0
  178. package/control-plane/scripts/skills/hallmark/references/components/ft7-newsletter-first.md +27 -0
  179. package/control-plane/scripts/skills/hallmark/references/components/ft8-marquee-scroll.md +25 -0
  180. package/control-plane/scripts/skills/hallmark/references/components/h1-marquee.md +15 -0
  181. package/control-plane/scripts/skills/hallmark/references/components/h2-split-diptych.md +15 -0
  182. package/control-plane/scripts/skills/hallmark/references/components/h3-quote-led.md +11 -0
  183. package/control-plane/scripts/skills/hallmark/references/components/h4-stat-led.md +14 -0
  184. package/control-plane/scripts/skills/hallmark/references/components/h5-letter-hero.md +11 -0
  185. package/control-plane/scripts/skills/hallmark/references/components/h6-photographic-fold.md +16 -0
  186. package/control-plane/scripts/skills/hallmark/references/components/h7-demo-video-clipped-by-viewport-edge.md +27 -0
  187. package/control-plane/scripts/skills/hallmark/references/components/h8-mockup-split-browser-framed.md +23 -0
  188. package/control-plane/scripts/skills/hallmark/references/components/h9-custom-illustration-centerpiece.md +27 -0
  189. package/control-plane/scripts/skills/hallmark/references/components/n1-wordmark-2-links.md +12 -0
  190. package/control-plane/scripts/skills/hallmark/references/components/n10-floating-on-scroll-morph.md +19 -0
  191. package/control-plane/scripts/skills/hallmark/references/components/n11-mega-menu.md +40 -0
  192. package/control-plane/scripts/skills/hallmark/references/components/n12-banner-retract.md +34 -0
  193. package/control-plane/scripts/skills/hallmark/references/components/n13-inline-cmdk-pill.md +39 -0
  194. package/control-plane/scripts/skills/hallmark/references/components/n1b-saas-three-section.md +35 -0
  195. package/control-plane/scripts/skills/hallmark/references/components/n2-floating-chip.md +14 -0
  196. package/control-plane/scripts/skills/hallmark/references/components/n3-side-rail.md +14 -0
  197. package/control-plane/scripts/skills/hallmark/references/components/n4-hidden-behind-k.md +9 -0
  198. package/control-plane/scripts/skills/hallmark/references/components/n5-floating-pill.md +28 -0
  199. package/control-plane/scripts/skills/hallmark/references/components/n6-newspaper-masthead.md +24 -0
  200. package/control-plane/scripts/skills/hallmark/references/components/n7-brutal-slab.md +22 -0
  201. package/control-plane/scripts/skills/hallmark/references/components/n8-terminal-command.md +21 -0
  202. package/control-plane/scripts/skills/hallmark/references/components/n9-edge-aligned-minimal.md +17 -0
  203. package/control-plane/scripts/skills/hallmark/references/components/s1-left-margin-numbered.md +15 -0
  204. package/control-plane/scripts/skills/hallmark/references/components/s2-hanging.md +13 -0
  205. package/control-plane/scripts/skills/hallmark/references/components/s3-sticky-pinned.md +19 -0
  206. package/control-plane/scripts/skills/hallmark/references/components/s4-inline-no-break.md +11 -0
  207. package/control-plane/scripts/skills/hallmark/references/components/s5-bottom-anchored.md +13 -0
  208. package/control-plane/scripts/skills/hallmark/references/components/t1-pull-quote-with-marginalia.md +12 -0
  209. package/control-plane/scripts/skills/hallmark/references/components/t2-logo-wall-hairline.md +19 -0
  210. package/control-plane/scripts/skills/hallmark/references/components/t3-single-huge-quote.md +11 -0
  211. package/control-plane/scripts/skills/hallmark/references/components/t4-numbered-stat-strip.md +14 -0
  212. package/control-plane/scripts/skills/hallmark/references/contract.md +25 -0
  213. package/control-plane/scripts/skills/hallmark/references/copy.md +182 -0
  214. package/control-plane/scripts/skills/hallmark/references/custom-craft.md +626 -0
  215. package/control-plane/scripts/skills/hallmark/references/custom-theme.md +367 -0
  216. package/control-plane/scripts/skills/hallmark/references/design-md.md +116 -0
  217. package/control-plane/scripts/skills/hallmark/references/export-formats.md +329 -0
  218. package/control-plane/scripts/skills/hallmark/references/floating-nav.md +89 -0
  219. package/control-plane/scripts/skills/hallmark/references/genres/atmospheric.md +69 -0
  220. package/control-plane/scripts/skills/hallmark/references/genres/editorial.md +72 -0
  221. package/control-plane/scripts/skills/hallmark/references/genres/modern-minimal.md +71 -0
  222. package/control-plane/scripts/skills/hallmark/references/genres/playful.md +70 -0
  223. package/control-plane/scripts/skills/hallmark/references/hero-enrichment.md +475 -0
  224. package/control-plane/scripts/skills/hallmark/references/imagery-kit.md +170 -0
  225. package/control-plane/scripts/skills/hallmark/references/interaction-and-states.md +208 -0
  226. package/control-plane/scripts/skills/hallmark/references/layout-and-space.md +112 -0
  227. package/control-plane/scripts/skills/hallmark/references/macrostructures/01-bento-grid.md +35 -0
  228. package/control-plane/scripts/skills/hallmark/references/macrostructures/02-long-document.md +34 -0
  229. package/control-plane/scripts/skills/hallmark/references/macrostructures/03-marquee-hero.md +31 -0
  230. package/control-plane/scripts/skills/hallmark/references/macrostructures/04-stat-led.md +34 -0
  231. package/control-plane/scripts/skills/hallmark/references/macrostructures/05-workbench.md +32 -0
  232. package/control-plane/scripts/skills/hallmark/references/macrostructures/06-conversational-faq.md +33 -0
  233. package/control-plane/scripts/skills/hallmark/references/macrostructures/07-manifesto.md +32 -0
  234. package/control-plane/scripts/skills/hallmark/references/macrostructures/08-photographic.md +34 -0
  235. package/control-plane/scripts/skills/hallmark/references/macrostructures/09-quote-led.md +32 -0
  236. package/control-plane/scripts/skills/hallmark/references/macrostructures/10-specimen.md +32 -0
  237. package/control-plane/scripts/skills/hallmark/references/macrostructures/11-catalogue.md +23 -0
  238. package/control-plane/scripts/skills/hallmark/references/macrostructures/12-letter.md +23 -0
  239. package/control-plane/scripts/skills/hallmark/references/macrostructures/13-index-first.md +23 -0
  240. package/control-plane/scripts/skills/hallmark/references/macrostructures/14-narrative-workflow.md +23 -0
  241. package/control-plane/scripts/skills/hallmark/references/macrostructures/15-split-studio.md +23 -0
  242. package/control-plane/scripts/skills/hallmark/references/macrostructures/16-feature-stack.md +23 -0
  243. package/control-plane/scripts/skills/hallmark/references/macrostructures/17-type-specimen.md +23 -0
  244. package/control-plane/scripts/skills/hallmark/references/macrostructures/18-portfolio-grid.md +23 -0
  245. package/control-plane/scripts/skills/hallmark/references/macrostructures/19-map-diagram.md +23 -0
  246. package/control-plane/scripts/skills/hallmark/references/macrostructures/20-ecosystem-index.md +23 -0
  247. package/control-plane/scripts/skills/hallmark/references/macrostructures/21-component-playground.md +23 -0
  248. package/control-plane/scripts/skills/hallmark/references/macrostructures.md +89 -0
  249. package/control-plane/scripts/skills/hallmark/references/microinteractions.md +258 -0
  250. package/control-plane/scripts/skills/hallmark/references/motion.md +109 -0
  251. package/control-plane/scripts/skills/hallmark/references/preview-examples.md +49 -0
  252. package/control-plane/scripts/skills/hallmark/references/responsive.md +138 -0
  253. package/control-plane/scripts/skills/hallmark/references/slop-test.md +192 -0
  254. package/control-plane/scripts/skills/hallmark/references/structure.md +160 -0
  255. package/control-plane/scripts/skills/hallmark/references/study.md +509 -0
  256. package/control-plane/scripts/skills/hallmark/references/themes/carnival.md +301 -0
  257. package/control-plane/scripts/skills/hallmark/references/themes/cobalt.md +146 -0
  258. package/control-plane/scripts/skills/hallmark/references/themes/grid.md +161 -0
  259. package/control-plane/scripts/skills/hallmark/references/themes/hum.md +403 -0
  260. package/control-plane/scripts/skills/hallmark/references/themes/lumen.md +478 -0
  261. package/control-plane/scripts/skills/hallmark/references/typography.md +243 -0
  262. package/control-plane/scripts/skills/hallmark/references/upstream/recipes.md +186 -0
  263. package/control-plane/scripts/skills/hallmark/references/upstream/study-examples.md +176 -0
  264. package/control-plane/scripts/skills/hallmark/references/upstream/tokens.css +1221 -0
  265. package/control-plane/scripts/skills/hallmark/references/verbs/audit.md +25 -0
  266. package/control-plane/scripts/skills/hallmark/references/verbs/redesign.md +269 -0
  267. package/control-plane/scripts/skills/human-comms/SKILL.md +29 -0
  268. package/control-plane/scripts/skills/index.mjs +432 -0
  269. package/control-plane/scripts/skills/internal-comms/LICENSE.txt +202 -0
  270. package/control-plane/scripts/skills/internal-comms/SKILL.md +32 -0
  271. package/control-plane/scripts/skills/internal-comms/examples/3p-updates.md +47 -0
  272. package/control-plane/scripts/skills/internal-comms/examples/company-newsletter.md +65 -0
  273. package/control-plane/scripts/skills/internal-comms/examples/faq-answers.md +30 -0
  274. package/control-plane/scripts/skills/internal-comms/examples/general-comms.md +16 -0
  275. package/control-plane/scripts/skills/mcp-adapter.mjs +94 -0
  276. package/control-plane/scripts/skills/mcp-builder/LICENSE.txt +202 -0
  277. package/control-plane/scripts/skills/mcp-builder/SKILL.md +236 -0
  278. package/control-plane/scripts/skills/mcp-builder/reference/evaluation.md +602 -0
  279. package/control-plane/scripts/skills/mcp-builder/reference/mcp_best_practices.md +249 -0
  280. package/control-plane/scripts/skills/mcp-builder/reference/node_mcp_server.md +970 -0
  281. package/control-plane/scripts/skills/mcp-builder/reference/python_mcp_server.md +719 -0
  282. package/control-plane/scripts/skills/mcp-builder/scripts/connections.py +151 -0
  283. package/control-plane/scripts/skills/mcp-builder/scripts/evaluation.py +373 -0
  284. package/control-plane/scripts/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
  285. package/control-plane/scripts/skills/mcp-builder/scripts/requirements.txt +2 -0
  286. package/control-plane/scripts/skills/ponytail/SKILL.md +120 -0
  287. package/control-plane/scripts/skills/ponytail-audit/SKILL.md +41 -0
  288. package/control-plane/scripts/skills/ponytail-debt/SKILL.md +44 -0
  289. package/control-plane/scripts/skills/ponytail-gain/SKILL.md +50 -0
  290. package/control-plane/scripts/skills/ponytail-help/SKILL.md +71 -0
  291. package/control-plane/scripts/skills/ponytail-review/SKILL.md +57 -0
  292. package/control-plane/scripts/skills/receiving-code-review/SKILL.md +205 -0
  293. package/control-plane/scripts/skills/requesting-code-review/SKILL.md +95 -0
  294. package/control-plane/scripts/skills/requesting-code-review/code-reviewer.md +198 -0
  295. package/control-plane/scripts/skills/skill-creator/LICENSE.txt +202 -0
  296. package/control-plane/scripts/skills/skill-creator/SKILL.md +485 -0
  297. package/control-plane/scripts/skills/skill-creator/agents/analyzer.md +274 -0
  298. package/control-plane/scripts/skills/skill-creator/agents/comparator.md +202 -0
  299. package/control-plane/scripts/skills/skill-creator/agents/grader.md +223 -0
  300. package/control-plane/scripts/skills/skill-creator/assets/eval_review.html +146 -0
  301. package/control-plane/scripts/skills/skill-creator/eval-viewer/generate_review.py +471 -0
  302. package/control-plane/scripts/skills/skill-creator/eval-viewer/viewer.html +1325 -0
  303. package/control-plane/scripts/skills/skill-creator/references/schemas.md +430 -0
  304. package/control-plane/scripts/skills/skill-creator/scripts/__init__.py +0 -0
  305. package/control-plane/scripts/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  306. package/control-plane/scripts/skills/skill-creator/scripts/generate_report.py +326 -0
  307. package/control-plane/scripts/skills/skill-creator/scripts/improve_description.py +247 -0
  308. package/control-plane/scripts/skills/skill-creator/scripts/package_skill.py +136 -0
  309. package/control-plane/scripts/skills/skill-creator/scripts/quick_validate.py +103 -0
  310. package/control-plane/scripts/skills/skill-creator/scripts/run_eval.py +310 -0
  311. package/control-plane/scripts/skills/skill-creator/scripts/run_loop.py +328 -0
  312. package/control-plane/scripts/skills/skill-creator/scripts/utils.py +47 -0
  313. package/control-plane/scripts/skills/slack-gif-creator/LICENSE.txt +202 -0
  314. package/control-plane/scripts/skills/slack-gif-creator/SKILL.md +254 -0
  315. package/control-plane/scripts/skills/slack-gif-creator/core/easing.py +234 -0
  316. package/control-plane/scripts/skills/slack-gif-creator/core/frame_composer.py +176 -0
  317. package/control-plane/scripts/skills/slack-gif-creator/core/gif_builder.py +269 -0
  318. package/control-plane/scripts/skills/slack-gif-creator/core/validators.py +136 -0
  319. package/control-plane/scripts/skills/slack-gif-creator/requirements.txt +4 -0
  320. package/control-plane/scripts/skills/sources.json +401 -0
  321. package/control-plane/scripts/skills/sources.lock.json +416 -0
  322. package/control-plane/scripts/skills/subagent-driven-development/SKILL.md +570 -0
  323. package/control-plane/scripts/skills/subagent-driven-development/implementer-prompt.md +154 -0
  324. package/control-plane/scripts/skills/subagent-driven-development/re-review-prompt.md +115 -0
  325. package/control-plane/scripts/skills/subagent-driven-development/scripts/review-package +53 -0
  326. package/control-plane/scripts/skills/subagent-driven-development/scripts/sdd-workspace +82 -0
  327. package/control-plane/scripts/skills/subagent-driven-development/scripts/task-brief +43 -0
  328. package/control-plane/scripts/skills/subagent-driven-development/task-reviewer-prompt.md +207 -0
  329. package/control-plane/scripts/skills/systematic-debugging/CREATION-LOG.md +119 -0
  330. package/control-plane/scripts/skills/systematic-debugging/SKILL.md +283 -0
  331. package/control-plane/scripts/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
  332. package/control-plane/scripts/skills/systematic-debugging/condition-based-waiting.md +115 -0
  333. package/control-plane/scripts/skills/systematic-debugging/defense-in-depth.md +122 -0
  334. package/control-plane/scripts/skills/systematic-debugging/find-polluter.sh +72 -0
  335. package/control-plane/scripts/skills/systematic-debugging/root-cause-tracing.md +169 -0
  336. package/control-plane/scripts/skills/systematic-debugging/test-academic.md +14 -0
  337. package/control-plane/scripts/skills/systematic-debugging/test-pressure-1.md +58 -0
  338. package/control-plane/scripts/skills/systematic-debugging/test-pressure-2.md +68 -0
  339. package/control-plane/scripts/skills/systematic-debugging/test-pressure-3.md +69 -0
  340. package/control-plane/scripts/skills/test-driven-development/SKILL.md +330 -0
  341. package/control-plane/scripts/skills/test-driven-development/writing-good-tests.md +198 -0
  342. package/control-plane/scripts/skills/theme-factory/LICENSE.txt +202 -0
  343. package/control-plane/scripts/skills/theme-factory/SKILL.md +59 -0
  344. package/control-plane/scripts/skills/theme-factory/theme-showcase.pdf +0 -0
  345. package/control-plane/scripts/skills/theme-factory/themes/arctic-frost.md +19 -0
  346. package/control-plane/scripts/skills/theme-factory/themes/botanical-garden.md +19 -0
  347. package/control-plane/scripts/skills/theme-factory/themes/desert-rose.md +19 -0
  348. package/control-plane/scripts/skills/theme-factory/themes/forest-canopy.md +19 -0
  349. package/control-plane/scripts/skills/theme-factory/themes/golden-hour.md +19 -0
  350. package/control-plane/scripts/skills/theme-factory/themes/midnight-galaxy.md +19 -0
  351. package/control-plane/scripts/skills/theme-factory/themes/modern-minimalist.md +19 -0
  352. package/control-plane/scripts/skills/theme-factory/themes/ocean-depths.md +19 -0
  353. package/control-plane/scripts/skills/theme-factory/themes/sunset-boulevard.md +19 -0
  354. package/control-plane/scripts/skills/theme-factory/themes/tech-innovation.md +19 -0
  355. package/control-plane/scripts/skills/using-git-worktrees/SKILL.md +167 -0
  356. package/control-plane/scripts/skills/verification-before-completion/SKILL.md +120 -0
  357. package/control-plane/scripts/skills/web-artifacts-builder/LICENSE.txt +202 -0
  358. package/control-plane/scripts/skills/web-artifacts-builder/SKILL.md +74 -0
  359. package/control-plane/scripts/skills/web-artifacts-builder/scripts/bundle-artifact.sh +54 -0
  360. package/control-plane/scripts/skills/web-artifacts-builder/scripts/init-artifact.sh +322 -0
  361. package/control-plane/scripts/skills/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  362. package/control-plane/scripts/skills/webapp-testing/LICENSE.txt +202 -0
  363. package/control-plane/scripts/skills/webapp-testing/SKILL.md +96 -0
  364. package/control-plane/scripts/skills/webapp-testing/examples/console_logging.py +35 -0
  365. package/control-plane/scripts/skills/webapp-testing/examples/element_discovery.py +40 -0
  366. package/control-plane/scripts/skills/webapp-testing/examples/static_html_automation.py +33 -0
  367. package/control-plane/scripts/skills/webapp-testing/scripts/with_server.py +106 -0
  368. package/control-plane/scripts/skills/writing-plans/SKILL.md +192 -0
  369. package/control-plane/scripts/skills/writing-plans/plan-document-reviewer-prompt.md +49 -0
  370. package/control-plane/scripts/skills/writing-skills/SKILL.md +681 -0
  371. package/control-plane/scripts/skills/writing-skills/anthropic-best-practices.md +1150 -0
  372. package/control-plane/scripts/skills/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
  373. package/control-plane/scripts/skills/writing-skills/graphviz-conventions.dot +172 -0
  374. package/control-plane/scripts/skills/writing-skills/persuasion-principles.md +187 -0
  375. package/control-plane/scripts/skills/writing-skills/render-graphs.js +169 -0
  376. package/control-plane/scripts/skills/writing-skills/testing-skills-with-subagents.md +384 -0
  377. package/control-plane/scripts/smoke-mcp-schemas.mjs +30 -0
  378. package/control-plane/scripts/surface-config.mjs +45 -0
  379. package/control-plane/scripts/sync-skills.mjs +370 -0
  380. package/control-plane/scripts/tool-metrics.mjs +74 -0
  381. package/control-plane/scripts/tool-risk.mjs +156 -0
  382. package/control-plane/scripts/tool-surface-stability.mjs +38 -0
  383. package/control-plane/scripts/upstreams/catalog-cache.mjs +28 -0
  384. package/control-plane/scripts/upstreams/config.mjs +158 -0
  385. package/control-plane/scripts/upstreams/diagnostics.mjs +21 -0
  386. package/control-plane/scripts/upstreams/http-client.mjs +67 -0
  387. package/control-plane/scripts/upstreams/manager.mjs +535 -0
  388. package/control-plane/scripts/upstreams/names.mjs +55 -0
  389. package/control-plane/scripts/upstreams/presets.mjs +60 -0
  390. package/control-plane/scripts/upstreams/resource-uri.mjs +29 -0
  391. package/control-plane/scripts/upstreams/stdio-client.mjs +73 -0
  392. package/control-plane/scripts/workspace-registry.mjs +147 -0
  393. package/dist/context/authorization.d.ts +5 -0
  394. package/dist/context/authorization.js +70 -0
  395. package/dist/context/capture.d.ts +46 -0
  396. package/dist/context/capture.js +187 -0
  397. package/dist/context/cli.d.ts +47 -0
  398. package/dist/context/cli.js +287 -0
  399. package/dist/context/device-adapter.d.ts +102 -0
  400. package/dist/context/device-adapter.js +79 -0
  401. package/dist/context/gateway.d.ts +354 -0
  402. package/dist/context/gateway.js +50 -0
  403. package/dist/context/graph.d.ts +63 -0
  404. package/dist/context/graph.js +214 -0
  405. package/dist/context/importer.d.ts +8 -0
  406. package/dist/context/importer.js +69 -0
  407. package/dist/context/indexer.d.ts +14 -0
  408. package/dist/context/indexer.js +57 -0
  409. package/dist/context/migrations/index.d.ts +4 -0
  410. package/dist/context/migrations/index.js +87 -0
  411. package/dist/context/redact.d.ts +15 -0
  412. package/dist/context/redact.js +43 -0
  413. package/dist/context/repositories.d.ts +9 -0
  414. package/dist/context/repositories.js +45 -0
  415. package/dist/context/search.d.ts +63 -0
  416. package/dist/context/search.js +207 -0
  417. package/dist/context/service.d.ts +278 -0
  418. package/dist/context/service.js +160 -0
  419. package/dist/context/store.d.ts +134 -0
  420. package/dist/context/store.js +722 -0
  421. package/dist/context/text.d.ts +4 -0
  422. package/dist/context/text.js +14 -0
  423. package/dist/context/tool-contract.d.ts +534 -0
  424. package/dist/context/tool-contract.js +45 -0
  425. package/dist/device/core.d.ts +29 -0
  426. package/dist/device/core.js +66 -0
  427. package/dist/device/device.d.ts +5 -0
  428. package/dist/device/device.js +94 -37
  429. package/dist/device/gateway-channel.d.ts +8 -1
  430. package/dist/device/gateway-channel.js +51 -3
  431. package/dist/device/gateway-tool-adapter.d.ts +11 -3
  432. package/dist/device/gateway-tool-adapter.js +141 -98
  433. package/dist/device/official-trust.d.ts +12 -0
  434. package/dist/device/official-trust.js +25 -1
  435. package/dist/device/runtime-owner.js +9 -1
  436. package/dist/distribution.d.ts +4 -0
  437. package/dist/distribution.js +8 -0
  438. package/dist/handlers/filesystem-handlers.js +53 -37
  439. package/dist/handlers/search-handlers.d.ts +1 -0
  440. package/dist/handlers/search-handlers.js +51 -1
  441. package/dist/log-palace/cli.d.ts +7 -0
  442. package/dist/log-palace/cli.js +89 -0
  443. package/dist/log-palace/formats.d.ts +26 -0
  444. package/dist/log-palace/formats.js +126 -0
  445. package/dist/log-palace/store.d.ts +129 -0
  446. package/dist/log-palace/store.js +856 -0
  447. package/dist/mcp-device.d.ts +1 -1
  448. package/dist/mcp-device.js +28 -6
  449. package/dist/npm-scripts/remote.js +1 -0
  450. package/dist/platform/activity-journal.d.ts +16 -0
  451. package/dist/platform/activity-journal.js +68 -0
  452. package/dist/platform/cli.d.ts +1 -0
  453. package/dist/platform/cli.js +300 -0
  454. package/dist/platform/coordination-lock.d.ts +45 -0
  455. package/dist/platform/coordination-lock.js +233 -0
  456. package/dist/platform/device-runtime.d.ts +16 -0
  457. package/dist/platform/device-runtime.js +83 -0
  458. package/dist/platform/knowledge-contract.d.ts +46 -0
  459. package/dist/platform/knowledge-contract.js +1 -0
  460. package/dist/platform/knowledge-mcp.d.ts +29 -0
  461. package/dist/platform/knowledge-mcp.js +95 -0
  462. package/dist/platform/knowledge-router.d.ts +64 -0
  463. package/dist/platform/knowledge-router.js +320 -0
  464. package/dist/platform/plugin-child.d.ts +1 -0
  465. package/dist/platform/plugin-child.js +115 -0
  466. package/dist/platform/plugin-contract.d.ts +76 -0
  467. package/dist/platform/plugin-contract.js +53 -0
  468. package/dist/platform/plugin-driver.d.ts +8 -0
  469. package/dist/platform/plugin-driver.js +443 -0
  470. package/dist/platform/plugin-host.d.ts +88 -0
  471. package/dist/platform/plugin-host.js +817 -0
  472. package/dist/platform/plugin-policy.d.ts +3 -0
  473. package/dist/platform/plugin-policy.js +29 -0
  474. package/dist/platform/plugin-services.d.ts +14 -0
  475. package/dist/platform/plugin-services.js +32 -0
  476. package/dist/platform/process-identity.d.ts +9 -0
  477. package/dist/platform/process-identity.js +68 -0
  478. package/dist/platform/runtime-lease.d.ts +4 -0
  479. package/dist/platform/runtime-lease.js +58 -0
  480. package/dist/platform/runtime-root.d.ts +9 -0
  481. package/dist/platform/runtime-root.js +61 -0
  482. package/dist/platform/state-backup.d.ts +92 -0
  483. package/dist/platform/state-backup.js +399 -0
  484. package/dist/plugins/reference/plugin.d.ts +3 -0
  485. package/dist/plugins/reference/plugin.js +13 -0
  486. package/dist/search-manager.d.ts +6 -0
  487. package/dist/search-manager.js +123 -0
  488. package/dist/server.d.ts +13 -0
  489. package/dist/server.js +7 -3
  490. package/dist/terminal-manager.d.ts +16 -0
  491. package/dist/terminal-manager.js +137 -42
  492. package/dist/tool-dispatcher.d.ts +11 -0
  493. package/dist/tool-dispatcher.js +228 -0
  494. package/dist/tools/edit.js +72 -1
  495. package/dist/tools/filesystem.d.ts +1 -1
  496. package/dist/tools/filesystem.js +2 -2
  497. package/dist/tools/improved-process-tools.js +91 -108
  498. package/dist/tools/schemas.d.ts +94 -2
  499. package/dist/tools/schemas.js +20 -6
  500. package/dist/types.d.ts +8 -0
  501. package/dist/utils/output-budget.d.ts +6 -0
  502. package/dist/utils/output-budget.js +15 -0
  503. package/dist/version.d.ts +1 -1
  504. package/dist/version.js +1 -1
  505. package/package.json +29 -6
  506. package/skills/mcp-device-context/SKILL.md +40 -0
@@ -0,0 +1,73 @@
1
+ import { StdioClientTransport } from "@modelcontextprotocol/client/stdio";
2
+ import { Client } from "@modelcontextprotocol/client";
3
+
4
+ function withTimeout(promise, ms, label) {
5
+ let timer;
6
+ return Promise.race([
7
+ promise.finally(() => clearTimeout(timer)),
8
+ new Promise((_, reject) => {
9
+ timer = setTimeout(() => reject(new Error(`${label} timed out after ${ms}ms`)), ms);
10
+ })
11
+ ]);
12
+ }
13
+
14
+ export async function createStdioUpstreamClient(serverConfig) {
15
+ const transport = new StdioClientTransport({
16
+ command: serverConfig.command,
17
+ args: serverConfig.args || [],
18
+ cwd: serverConfig.cwd,
19
+ stderr: 'pipe',
20
+ windowsHide: true
21
+ });
22
+ let stderr = '';
23
+ let running = true;
24
+ transport.stderr?.on?.('data', chunk => {
25
+ stderr = `${stderr}${chunk.toString()}`.slice(-4000);
26
+ });
27
+ transport.onclose = () => { running = false; };
28
+ const client = new Client({ name: `agent-mcp-gateway-upstream-${serverConfig.id}`, version: '1.0.0' }, { capabilities: {} });
29
+ try {
30
+ await withTimeout(client.connect(transport), serverConfig.startupTimeoutMs || 15000, `upstream ${serverConfig.id} initialize`);
31
+ } catch (error) {
32
+ // A failed constructor cannot return its transport to the manager for shutdown.
33
+ await client.close().catch(() => {});
34
+ await transport.close().catch(() => {});
35
+ running = false;
36
+ throw error;
37
+ }
38
+ const capabilities = client.getServerCapabilities?.() || {};
39
+ return {
40
+ id: serverConfig.id,
41
+ config: serverConfig,
42
+ client,
43
+ transport,
44
+ capabilities,
45
+ get pid() { return transport.pid; },
46
+ get stderr() { return stderr; },
47
+ isRunning() { return running && Boolean(transport.pid); },
48
+ kill(signal = 'SIGTERM') {
49
+ if (!running) return false;
50
+ const pid = transport.pid;
51
+ if (!pid) return false;
52
+ try {
53
+ process.kill(pid, signal);
54
+ return true;
55
+ } catch {
56
+ running = false;
57
+ return false;
58
+ }
59
+ },
60
+ async listTools() { return await client.listTools(); },
61
+ async callTool(params) { return await client.callTool(params); },
62
+ async listResources() { return await client.listResources(); },
63
+ async listResourceTemplates() { return await client.listResourceTemplates(); },
64
+ async readResource(params) { return await client.readResource(params); },
65
+ async listPrompts() { return await client.listPrompts(); },
66
+ async getPrompt(params) { return await client.getPrompt(params); },
67
+ async close() {
68
+ await client.close().catch(() => {});
69
+ await transport.close().catch(() => {});
70
+ running = false;
71
+ }
72
+ };
73
+ }
@@ -0,0 +1,147 @@
1
+ import { createHash } from 'node:crypto';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import * as toml from 'smol-toml';
5
+
6
+ import {
7
+ buildTrustedRootsProjectRegistryFromRaw,
8
+ trustedRootsTomlToRaw
9
+ } from './projects/trusted-roots-projects.mjs';
10
+
11
+ const DEFAULT_WATCH_INTERVAL_MS = 500;
12
+
13
+ function hashText(text) {
14
+ return createHash('sha256').update(text).digest('hex');
15
+ }
16
+
17
+ function stableValue(value) {
18
+ if (Array.isArray(value)) return value.map(stableValue);
19
+ if (!value || typeof value !== 'object') return value;
20
+ return Object.fromEntries(Object.keys(value).sort().map(key => [key, stableValue(value[key])]));
21
+ }
22
+
23
+ function stableSignature(value) {
24
+ return hashText(JSON.stringify(stableValue(value)));
25
+ }
26
+
27
+ export function createWorkspaceRegistry(options = {}) {
28
+ const configPath = path.resolve(options.configPath);
29
+ const repoRoot = path.resolve(options.repoRoot || process.cwd());
30
+ const env = options.env || process.env;
31
+ const watchIntervalMs = options.watchIntervalMs ?? DEFAULT_WATCH_INTERVAL_MS;
32
+ const listeners = new Set();
33
+ let closed = false;
34
+ let state = null;
35
+ let reloadInFlight = null;
36
+
37
+ function buildState(content) {
38
+ const rawConfig = toml.parse(content || '');
39
+ const rawRoots = trustedRootsTomlToRaw(rawConfig.trusted_roots, { repoRoot });
40
+ const projectRegistry = buildTrustedRootsProjectRegistryFromRaw(rawRoots, {
41
+ defaultProjectId: env.MCP_DEFAULT_PROJECT_ID,
42
+ requireProjectId: false,
43
+ pathInference: true,
44
+ exposeProjectPaths: String(env.MCP_EXPOSE_PROJECT_PATHS || '').toLowerCase() === 'true',
45
+ checkExists: false
46
+ });
47
+ const roots = projectRegistry.allTrustedRoots.filter(root => fs.existsSync(root));
48
+ return {
49
+ configPath,
50
+ content,
51
+ hash: hashText(content),
52
+ stateSignature: hashText(content),
53
+ rawConfig,
54
+ roots,
55
+ rootsSignature: stableSignature(roots),
56
+ upstreamSignature: stableSignature({
57
+ external_mcp: rawConfig.external_mcp || {},
58
+ mcp_servers: rawConfig.mcp_servers || {}
59
+ }),
60
+ projectRegistry,
61
+ server: {
62
+ name: rawConfig.server?.name || 'agent-mcp-gateway',
63
+ title: rawConfig.server?.title || 'Local Coding Gateway',
64
+ description: rawConfig.server?.description || 'Local coding workspace for filesystem, shell, image inspection, and optional skills.',
65
+ instructions: rawConfig.server?.instructions || 'Use filesystem tools for content, shell_execute for terminal workflows, and image_preview for local images.'
66
+ },
67
+ loadedAt: new Date().toISOString(),
68
+ lastError: null
69
+ };
70
+ }
71
+
72
+ function publicSnapshot() {
73
+ return {
74
+ ...state,
75
+ roots: [...state.roots],
76
+ rawConfig: state.rawConfig,
77
+ projectRegistry: state.projectRegistry,
78
+ server: { ...state.server }
79
+ };
80
+ }
81
+
82
+ async function notify(previous, reason) {
83
+ const next = publicSnapshot();
84
+ for (const listener of listeners) {
85
+ await listener(next, previous, reason);
86
+ }
87
+ }
88
+
89
+ async function reloadFromDisk(reason = 'manual') {
90
+ if (reloadInFlight) {
91
+ await reloadInFlight;
92
+ return await reloadFromDisk(reason);
93
+ }
94
+ reloadInFlight = (async () => {
95
+ const previousState = state;
96
+ let candidatePublished = false;
97
+ try {
98
+ const content = await fs.promises.readFile(configPath, 'utf8');
99
+ const next = buildState(content);
100
+ if (state?.stateSignature === next.stateSignature) return { changed: false, snapshot: publicSnapshot() };
101
+ const previous = state ? publicSnapshot() : null;
102
+ state = next;
103
+ candidatePublished = true;
104
+ await notify(previous, reason);
105
+ return { changed: true, snapshot: publicSnapshot() };
106
+ } catch (error) {
107
+ if (!previousState) throw error;
108
+ const lastError = String(error?.message || error);
109
+ state = { ...(candidatePublished ? previousState : state), lastError };
110
+ console.error(`[workspace-registry] keeping last synchronized config: ${lastError}`);
111
+ return { changed: false, error, snapshot: publicSnapshot() };
112
+ } finally {
113
+ reloadInFlight = null;
114
+ }
115
+ })();
116
+ return await reloadInFlight;
117
+ }
118
+
119
+ const initialContent = fs.readFileSync(configPath, 'utf8');
120
+ state = buildState(initialContent);
121
+
122
+ const watchListener = () => {
123
+ if (!closed) reloadFromDisk('watch').catch(error => console.error(`[workspace-registry] reload failed: ${error.message}`));
124
+ };
125
+ fs.watchFile(configPath, { interval: watchIntervalMs, persistent: false }, watchListener);
126
+
127
+ return {
128
+ snapshot: publicSnapshot,
129
+ reloadFromDisk,
130
+ subscribe(listener) {
131
+ listeners.add(listener);
132
+ return () => listeners.delete(listener);
133
+ },
134
+ close() {
135
+ closed = true;
136
+ fs.unwatchFile(configPath, watchListener);
137
+ listeners.clear();
138
+ }
139
+ };
140
+ }
141
+
142
+ export function classifyWorkspaceChange(next, previous) {
143
+ return {
144
+ rootsChanged: !previous || next.rootsSignature !== previous.rootsSignature,
145
+ upstreamChanged: !previous || next.upstreamSignature !== previous.upstreamSignature
146
+ };
147
+ }
@@ -0,0 +1,5 @@
1
+ export { SOC_PUBLIC_KEY } from '../device/official-trust.js';
2
+ export type GatedFeature = 'FEATURE_LIVE_CAPTURE' | 'FEATURE_PUBLIC_GATEWAY';
3
+ export declare const GATE_ERROR = "FEATURE_GATE_LOCKED: Phase 7/8 requires valid SOC security approval artifact";
4
+ export declare function isFeatureAuthorized(scope: GatedFeature): boolean;
5
+ export declare function requireFeatureAuthorized(scope: GatedFeature): void;
@@ -0,0 +1,70 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { readFileSync, statSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { verifyOfficialApproval } from '../device/official-trust.js';
6
+ export { SOC_PUBLIC_KEY } from '../device/official-trust.js';
7
+ export const GATE_ERROR = 'FEATURE_GATE_LOCKED: Phase 7/8 requires valid SOC security approval artifact';
8
+ // Anchor trust configuration to the installed module, never the caller's cwd.
9
+ const CONFIG_DIRECTORY = fileURLToPath(new URL('../../config/', import.meta.url));
10
+ function approvalFailure(scope) {
11
+ try {
12
+ if (!['FEATURE_LIVE_CAPTURE', 'FEATURE_PUBLIC_GATEWAY'].includes(scope))
13
+ return GATE_ERROR;
14
+ const path = join(CONFIG_DIRECTORY, 'soc-approval.json');
15
+ if (statSync(path).size > 16384)
16
+ return GATE_ERROR;
17
+ const artifact = JSON.parse(readFileSync(path, 'utf8'));
18
+ if (artifact.schema_version !== 1 || !Array.isArray(artifact.features) || artifact.features.length < 1 || artifact.features.length > 2 ||
19
+ !artifact.features.every((value) => value === 'FEATURE_LIVE_CAPTURE' || value === 'FEATURE_PUBLIC_GATEWAY') ||
20
+ new Set(artifact.features).size !== artifact.features.length || !artifact.features.includes(scope) ||
21
+ !Number.isSafeInteger(artifact.expires_at) || artifact.expires_at <= Date.now() || typeof artifact.signature !== 'string')
22
+ return GATE_ERROR;
23
+ // RFC 8785 JCS for this closed schema: lexicographically sorted ASCII keys,
24
+ // safe integer time, ASCII enum strings, and order-preserving arrays. JSON's
25
+ // ECMAScript serialization is canonical for these validated value types.
26
+ if (!verifyOfficialApproval(artifact))
27
+ return `${GATE_ERROR}: SOC_KEY_UNTRUSTED`;
28
+ // Digest the canonical signed artifact, not file formatting: whitespace or
29
+ // insertion-order changes cannot resurrect a revoked approval.
30
+ const digest = createHash('sha256').update(JSON.stringify({
31
+ expires_at: artifact.expires_at, features: artifact.features,
32
+ schema_version: artifact.schema_version, signature: artifact.signature
33
+ })).digest('hex');
34
+ const revokedPath = join(CONFIG_DIRECTORY, 'revoked-approvals.json');
35
+ let revokedText;
36
+ try {
37
+ if (statSync(revokedPath).size > 1048576)
38
+ return GATE_ERROR;
39
+ revokedText = readFileSync(revokedPath, 'utf8');
40
+ }
41
+ catch {
42
+ return 'FEATURE_GATE_LOCKED: revocation list missing or unreadable';
43
+ }
44
+ let revoked;
45
+ try {
46
+ revoked = JSON.parse(revokedText);
47
+ }
48
+ catch {
49
+ return 'FEATURE_GATE_LOCKED: revocation list malformed';
50
+ }
51
+ if (!Array.isArray(revoked))
52
+ return 'FEATURE_GATE_LOCKED: revocation list malformed';
53
+ if (!revoked.every((value) => typeof value === 'string' && /^[0-9a-f]{64}$/.test(value)))
54
+ return 'FEATURE_GATE_LOCKED: revocation list malformed';
55
+ if (revoked.includes(digest))
56
+ return 'FEATURE_GATE_LOCKED: artifact revoked';
57
+ return undefined;
58
+ }
59
+ catch {
60
+ return GATE_ERROR;
61
+ }
62
+ }
63
+ export function isFeatureAuthorized(scope) {
64
+ return approvalFailure(scope) === undefined;
65
+ }
66
+ export function requireFeatureAuthorized(scope) {
67
+ const failure = approvalFailure(scope);
68
+ if (failure)
69
+ throw new Error(failure);
70
+ }
@@ -0,0 +1,46 @@
1
+ import type { ContextStore } from './store.js';
2
+ import type { ContextService } from './service.js';
3
+ /** Importing this module never enables capture. Revalidate every privileged write. */
4
+ export declare function executeLiveCapture<T>(action: () => T): T;
5
+ export declare const EXCLUDED_LOCAL_TOOLS: readonly ["local_status", "local_search", "local_read", "local_graph", "local_index", "local_wiki", "get_recent_tool_calls", "track_ui_event"];
6
+ export interface IntentRequest {
7
+ tool: string;
8
+ args?: Record<string, unknown>;
9
+ invocationId?: string;
10
+ }
11
+ export interface OutcomeData {
12
+ result?: unknown;
13
+ status: 'succeeded' | 'failed' | 'cancelled';
14
+ error?: string;
15
+ durationMs?: number;
16
+ }
17
+ export interface ObservedInvocation extends IntentRequest, OutcomeData {
18
+ }
19
+ export interface IntentToken extends IntentRequest {
20
+ ok: boolean;
21
+ invocationId: string;
22
+ eventId?: number;
23
+ gap?: boolean;
24
+ error?: string;
25
+ }
26
+ export interface ObservationOutcome {
27
+ recorded: boolean;
28
+ excluded?: boolean;
29
+ eventId?: number;
30
+ gapRecorded?: boolean;
31
+ error?: string;
32
+ }
33
+ export interface CanonicalObserver {
34
+ beginIntent(request: IntentRequest): Promise<IntentToken>;
35
+ completeOutcome(token: IntentToken, outcome: OutcomeData): Promise<ObservationOutcome>;
36
+ recordInvocation(invocation: ObservedInvocation): Promise<ObservationOutcome>;
37
+ execute<T>(request: IntentRequest, action: () => T | Promise<T>): Promise<T>;
38
+ }
39
+ /** Explicit trusted-runtime installation only; importing never activates hooks. */
40
+ export declare function setLiveCaptureObserver(observer: CanonicalObserver | undefined): void;
41
+ export declare function isCapturingInvocation(): boolean;
42
+ export declare function observePublicInvocation<T>(request: IntentRequest, action: () => T | Promise<T>, observer?: CanonicalObserver | undefined): Promise<T>;
43
+ /** One public invocation -> one durable intent -> one outcome. No execution retries.
44
+ * Capture uses short SQLite lock budgets, the shared quota/fencing admission and
45
+ * bounded redacted payloads. Failures remain in memory, never on the execution path. */
46
+ export declare function createCanonicalObserver(service: ContextService, store: ContextStore, owner: string, repo: string): CanonicalObserver;
@@ -0,0 +1,187 @@
1
+ import { randomBytes, randomUUID } from 'node:crypto';
2
+ import { AsyncLocalStorage } from 'node:async_hooks';
3
+ import { requireFeatureAuthorized } from './authorization.js';
4
+ /** Importing this module never enables capture. Revalidate every privileged write. */
5
+ export function executeLiveCapture(action) {
6
+ try {
7
+ requireFeatureAuthorized('FEATURE_LIVE_CAPTURE');
8
+ }
9
+ catch (error) {
10
+ liveObserver = undefined;
11
+ throw error;
12
+ }
13
+ return action();
14
+ }
15
+ export const EXCLUDED_LOCAL_TOOLS = ['local_status', 'local_search', 'local_read', 'local_graph',
16
+ 'local_index', 'local_wiki', 'get_recent_tool_calls', 'track_ui_event'];
17
+ const excluded = (tool) => tool.startsWith('local_') || EXCLUDED_LOCAL_TOOLS.some(name => name === tool);
18
+ const activeCapture = new AsyncLocalStorage();
19
+ let liveObserver;
20
+ /** Explicit trusted-runtime installation only; importing never activates hooks. */
21
+ export function setLiveCaptureObserver(observer) {
22
+ if (observer)
23
+ executeLiveCapture(() => { liveObserver = observer; });
24
+ else
25
+ liveObserver = undefined;
26
+ }
27
+ export function isCapturingInvocation() { return activeCapture.getStore() === true; }
28
+ export async function observePublicInvocation(request, action, observer = liveObserver) {
29
+ if (!observer || isCapturingInvocation())
30
+ return action();
31
+ return activeCapture.run(true, () => observer.execute(request, action));
32
+ }
33
+ /** One public invocation -> one durable intent -> one outcome. No execution retries.
34
+ * Capture uses short SQLite lock budgets, the shared quota/fencing admission and
35
+ * bounded redacted payloads. Failures remain in memory, never on the execution path. */
36
+ export function createCanonicalObserver(service, store, owner, repo) {
37
+ store.authorize(owner, repo);
38
+ const completed = new WeakSet();
39
+ const bounded = (action) => {
40
+ const db = store.repoDatabase(owner, repo), registry = store.registry;
41
+ const connections = [registry, db, store.unscopedDatabase(owner)];
42
+ const budgets = connections.map(connection => Number(connection.prepare('PRAGMA busy_timeout').get()?.timeout));
43
+ try {
44
+ for (const connection of connections)
45
+ connection.exec('PRAGMA busy_timeout=25');
46
+ return action();
47
+ }
48
+ finally {
49
+ connections.forEach((connection, index) => connection.exec(`PRAGMA busy_timeout=${budgets[index]}`));
50
+ }
51
+ };
52
+ const gap = (reason, error) => {
53
+ service.recordGap(owner, repo, reason);
54
+ return error instanceof Error ? error.message : String(error);
55
+ };
56
+ const observer = {
57
+ async beginIntent(request) {
58
+ executeLiveCapture(() => service.requireFeatureAuthorized('FEATURE_LIVE_CAPTURE'));
59
+ const token = { ...request, invocationId: request.invocationId ?? randomUUID(), ok: false };
60
+ if (excluded(request.tool))
61
+ return token;
62
+ return executeLiveCapture(() => {
63
+ service.requireFeatureAuthorized('FEATURE_LIVE_CAPTURE');
64
+ try {
65
+ token.eventId = bounded(() => store.quotaWrite(owner, repo, 65536, () => {
66
+ const db = store.repoDatabase(owner, repo);
67
+ db.exec('BEGIN IMMEDIATE');
68
+ try {
69
+ const row = db.prepare("INSERT INTO events(invocation_id,accepted_at,execution_status) VALUES(?,?,'pending')").run(token.invocationId, Date.now());
70
+ store.commitRepository(db);
71
+ return Number(row.lastInsertRowid);
72
+ }
73
+ catch (error) {
74
+ if (db.isTransaction)
75
+ db.exec('ROLLBACK');
76
+ throw error;
77
+ }
78
+ }));
79
+ token.ok = true;
80
+ }
81
+ catch (error) {
82
+ token.gap = true;
83
+ const message = error instanceof Error ? error.message : String(error);
84
+ let reason = 'storage_unavailable';
85
+ if (/busy|locked/i.test(message))
86
+ reason = 'busy';
87
+ else if (/QUOTA/.test(message))
88
+ reason = 'quota';
89
+ token.error = gap(reason, error);
90
+ }
91
+ return token;
92
+ });
93
+ },
94
+ async completeOutcome(token, outcome) {
95
+ executeLiveCapture(() => service.requireFeatureAuthorized('FEATURE_LIVE_CAPTURE'));
96
+ if (excluded(token.tool))
97
+ return { recorded: false, excluded: true };
98
+ if (!token.ok || token.eventId === undefined)
99
+ return { recorded: false, gapRecorded: token.gap };
100
+ if (completed.has(token))
101
+ return { recorded: true, eventId: token.eventId };
102
+ const eventId = token.eventId;
103
+ try {
104
+ return executeLiveCapture(() => {
105
+ service.requireFeatureAuthorized('FEATURE_LIVE_CAPTURE');
106
+ return bounded(() => {
107
+ const prior = store.repoDatabase(owner, repo).prepare('SELECT payload_ref FROM events WHERE event_id=? AND invocation_id=?').get(eventId, token.invocationId);
108
+ if (prior?.payload_ref) {
109
+ completed.add(token);
110
+ return { recorded: true, eventId };
111
+ }
112
+ const process = outcome.result?._meta?.process;
113
+ // Poll duration is not source evidence. Identical canonical output/range
114
+ // payloads reuse their redacted keyed hash, scoped to this repository.
115
+ const canonicalRange = Boolean(process?.execution_id && process?.runtime_generation && process?.read_from !== undefined);
116
+ const payload = canonicalRange
117
+ ? { tool: token.tool, result: outcome.result, status: outcome.status }
118
+ : { tool: token.tool, args: token.args ?? {}, ...outcome };
119
+ const safe = store.redactPayload(JSON.stringify(payload), { maxBytes: 65536 });
120
+ store.quotaWrite(owner, repo, safe.retainedBytes * 4 + 65536, () => {
121
+ const db = store.repoDatabase(owner, repo);
122
+ const existing = canonicalRange
123
+ ? db.prepare("SELECT ref FROM evidence WHERE hash=? AND retention_state='available' LIMIT 1").get(safe.hash) : undefined;
124
+ const ref = existing ? String(existing.ref) : randomBytes(24).toString('hex');
125
+ db.exec('BEGIN IMMEDIATE');
126
+ try {
127
+ if (!existing)
128
+ db.prepare('INSERT INTO evidence(ref,text,hash,original_bytes,retained_bytes,redaction_state,partial) VALUES(?,?,?,?,?,?,?)')
129
+ .run(ref, safe.text, safe.hash, safe.originalBytes, safe.retainedBytes, safe.state, Number(safe.partial));
130
+ db.prepare('UPDATE events SET execution_status=?,recording_status=\'committed\',payload_ref=? WHERE event_id=? AND invocation_id=?')
131
+ .run(outcome.status, ref, eventId, token.invocationId);
132
+ store.commitRepository(db);
133
+ }
134
+ catch (error) {
135
+ if (db.isTransaction)
136
+ db.exec('ROLLBACK');
137
+ throw error;
138
+ }
139
+ });
140
+ completed.add(token);
141
+ return { recorded: true, eventId };
142
+ });
143
+ });
144
+ }
145
+ catch (error) {
146
+ const message = gap('outcome_failed', error);
147
+ // Best effort metadata only. Never bypass revoked authorization.
148
+ try {
149
+ executeLiveCapture(() => bounded(() => {
150
+ store.repoDatabase(owner, repo).prepare("UPDATE events SET execution_status=?,recording_status='degraded' WHERE event_id=?").run(outcome.status, eventId);
151
+ }));
152
+ }
153
+ catch { /* The durable pending intent will become unknown after restart. */ }
154
+ return { recorded: false, gapRecorded: true, error: message };
155
+ }
156
+ },
157
+ async recordInvocation(invocation) {
158
+ return observer.completeOutcome(await observer.beginIntent(invocation), invocation);
159
+ },
160
+ async execute(request, action) {
161
+ const token = await observer.beginIntent(request), start = Date.now();
162
+ // Revocation stops observation, not an already executed tool's result/error.
163
+ const finish = async (outcome) => {
164
+ try {
165
+ await observer.completeOutcome(token, outcome);
166
+ }
167
+ catch (error) {
168
+ if (!(error instanceof Error) || !error.message.startsWith('FEATURE_GATE_LOCKED'))
169
+ throw error;
170
+ service.recordGap(owner, repo, 'authorization_revoked');
171
+ }
172
+ };
173
+ let result;
174
+ try {
175
+ result = await action();
176
+ }
177
+ catch (error) {
178
+ await finish({ status: 'failed', error: error instanceof Error ? error.message : String(error), durationMs: Date.now() - start });
179
+ throw error;
180
+ }
181
+ const failed = result !== null && typeof result === 'object' && ('isError' in result && result.isError === true || 'exitCode' in result && result.exitCode !== 0);
182
+ await finish({ result, status: failed ? 'failed' : 'succeeded', durationMs: Date.now() - start });
183
+ return result;
184
+ }
185
+ };
186
+ return observer;
187
+ }
@@ -0,0 +1,47 @@
1
+ import { type PathGuard } from './repositories.js';
2
+ export declare const CONTEXT_CLI_CONTRACT: {
3
+ readonly globalFlags: readonly ["--cwd", "--json"];
4
+ readonly commands: readonly [{
5
+ readonly name: "status";
6
+ readonly flags: readonly [];
7
+ }, {
8
+ readonly name: "search";
9
+ readonly flags: readonly ["--query", "--limit", "--max-bytes", "--cursor", "--source-type", "--since", "--until"];
10
+ }, {
11
+ readonly name: "read";
12
+ readonly flags: readonly ["--ref", "--max-bytes", "--cursor"];
13
+ }, {
14
+ readonly name: "graph";
15
+ readonly flags: readonly ["--ref", "--action", "--target", "--direction", "--max-hops", "--max-nodes", "--max-edges", "--max-visited", "--max-bytes", "--wall-ms", "--generation"];
16
+ }, {
17
+ readonly name: "sync";
18
+ readonly flags: readonly [];
19
+ }, {
20
+ readonly name: "checkpoint";
21
+ readonly flags: readonly ["--summary", "--evidence-ref"];
22
+ }, {
23
+ readonly name: "rebuild";
24
+ readonly flags: readonly [];
25
+ }, {
26
+ readonly name: "cancel";
27
+ readonly flags: readonly ["--job-ref"];
28
+ }];
29
+ };
30
+ export interface ContextCliResult {
31
+ exitCode: number;
32
+ stdout: string;
33
+ stderr: string;
34
+ }
35
+ export interface ContextCliDependencies {
36
+ stateRoot?: string;
37
+ pathGuard?: PathGuard;
38
+ workingDirectory?: string;
39
+ }
40
+ export declare function contextCliHelp(): string;
41
+ /** Operator-only gate. Exclusive claim serializes validation and consumption.
42
+ * Token files contain {token: 64 lowercase hex, expires_at: epoch milliseconds}.
43
+ * The protected state root is an OS permission boundary, not an agent sandbox.
44
+ */
45
+ export declare function consumeAdminToken(root: string, token: string, now?: number): void;
46
+ /** Isolated local adapter. It opens device-local state and calls ContextService only. */
47
+ export declare function runContextCli(argv: string[], deps?: ContextCliDependencies): Promise<ContextCliResult>;