@wenathlan/devthink 2.0.12 → 2.0.14

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 (444) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/accounts.ts +2087 -0
  3. package/agent.ts +2331 -0
  4. package/antigravity.ts +2139 -0
  5. package/apifreeze.ts +4146 -0
  6. package/auth.ts +642 -0
  7. package/background.ts +16837 -0
  8. package/bridge.ts +2080 -0
  9. package/build.ts +54 -0
  10. package/bun.ts +26 -0
  11. package/capture.ts +1614 -0
  12. package/checksecrets.ts +72 -0
  13. package/cjs.ts +9 -0
  14. package/cli.ts +3500 -0
  15. package/commands.ts +1101 -0
  16. package/companion.ts +450 -0
  17. package/compatibility.ts +37 -0
  18. package/config.ts +3137 -0
  19. package/constants.ts +943 -0
  20. package/core.ts +1473 -0
  21. package/crossbrowser.ts +1359 -0
  22. package/dashdone.ts +605 -0
  23. package/data.ts +943 -0
  24. package/database.ts +133 -0
  25. package/debug.ts +850 -0
  26. package/deno.ts +27 -0
  27. package/devthink.ts +707 -0
  28. package/dist/accounts.d.ts +409 -0
  29. package/dist/agent.d.ts +837 -0
  30. package/dist/antigravity.d.ts +380 -0
  31. package/dist/apifreeze.d.ts +113 -0
  32. package/dist/auth.d.ts +224 -0
  33. package/{bridge.d.ts → dist/bridge.d.ts} +1 -1
  34. package/dist/capture.d.ts +595 -0
  35. package/dist/cjs.d.ts +6 -0
  36. package/{cli.js → dist/cli.js} +2 -2
  37. package/dist/commands.d.ts +310 -0
  38. package/dist/compatibility.d.ts +17 -0
  39. package/dist/config.d.ts +1853 -0
  40. package/dist/constants.d.ts +637 -0
  41. package/dist/core.d.ts +361 -0
  42. package/dist/data.d.ts +330 -0
  43. package/dist/database.d.ts +24 -0
  44. package/dist/debug.d.ts +270 -0
  45. package/dist/engine.d.ts +74 -0
  46. package/dist/environments.d.ts +244 -0
  47. package/dist/evidence.d.ts +277 -0
  48. package/dist/export.d.ts +311 -0
  49. package/dist/fingerprint.d.ts +594 -0
  50. package/dist/flow.d.ts +300 -0
  51. package/dist/gates.d.ts +103 -0
  52. package/dist/identity.d.ts +51 -0
  53. package/dist/ids.d.ts +7 -0
  54. package/dist/llm.d.ts +652 -0
  55. package/dist/models.d.ts +1807 -0
  56. package/dist/net.d.ts +325 -0
  57. package/dist/neutral.d.ts +41 -0
  58. package/dist/oauth.d.ts +703 -0
  59. package/dist/page.d.ts +1166 -0
  60. package/dist/perf.d.ts +481 -0
  61. package/dist/plan.d.ts +134 -0
  62. package/dist/project.d.ts +395 -0
  63. package/dist/providers.d.ts +37 -0
  64. package/dist/quota.d.ts +453 -0
  65. package/dist/recovery.d.ts +621 -0
  66. package/dist/request.d.ts +1492 -0
  67. package/dist/run.d.ts +779 -0
  68. package/dist/runtime.d.ts +212 -0
  69. package/dist/search.d.ts +375 -0
  70. package/dist/security.d.ts +534 -0
  71. package/dist/serve.d.ts +136 -0
  72. package/dist/session.d.ts +296 -0
  73. package/dist/storage.d.ts +53 -0
  74. package/dist/streaming.d.ts +1119 -0
  75. package/dist/swarm.d.ts +328 -0
  76. package/dist/tools.d.ts +170 -0
  77. package/dist/types.d.ts +8357 -0
  78. package/dist/utils.d.ts +82 -0
  79. package/dist/version.d.ts +7 -0
  80. package/dist/versionregistry.d.ts +406 -0
  81. package/dist/views.d.ts +579 -0
  82. package/dist/workbenchsession.d.ts +69 -0
  83. package/dist/workflow.d.ts +649 -0
  84. package/docs/readme.md +92 -0
  85. package/docs/schemas/antigravity.json +192 -0
  86. package/engine.ts +1524 -0
  87. package/environments.ts +1005 -0
  88. package/evidence.ts +643 -0
  89. package/export.ts +889 -0
  90. package/fingerprint.ts +1458 -0
  91. package/flow.ts +1190 -0
  92. package/gates.ts +307 -0
  93. package/gateway.ts +34 -0
  94. package/hardening.ts +191 -0
  95. package/headless.ts +369 -0
  96. package/http.ts +2110 -0
  97. package/identity.ts +246 -0
  98. package/ids.ts +26 -0
  99. package/index.ts +369 -0
  100. package/llm.ts +2682 -0
  101. package/mcp.ts +1835 -0
  102. package/{memory.js → memory.ts} +3834 -2310
  103. package/models.ts +3805 -0
  104. package/modes.ts +43 -0
  105. package/net.ts +1214 -0
  106. package/neutral.ts +362 -0
  107. package/node.ts +26 -0
  108. package/oauth.ts +2216 -0
  109. package/offscreen.ts +170 -0
  110. package/pack.ts +956 -0
  111. package/package.json +175 -82
  112. package/page.ts +7824 -0
  113. package/pagebridge.ts +1116 -0
  114. package/perf.ts +957 -0
  115. package/plan.ts +672 -0
  116. package/plugin.ts +76 -0
  117. package/{policy.js → policy.ts} +5073 -4679
  118. package/prisma.config.ts +27 -0
  119. package/progress.ts +1308 -0
  120. package/project.ts +1291 -0
  121. package/protocol.ts +4187 -0
  122. package/providers.ts +246 -0
  123. package/quota.ts +1887 -0
  124. package/recovery.ts +2433 -0
  125. package/request.ts +4482 -0
  126. package/run.ts +2135 -0
  127. package/runtime.ts +526 -0
  128. package/search.ts +1760 -0
  129. package/security.ts +1673 -0
  130. package/serve.ts +419 -0
  131. package/server.ts +5538 -0
  132. package/session.ts +1162 -0
  133. package/storage.ts +182 -0
  134. package/streaming.ts +4101 -0
  135. package/swarm.ts +884 -0
  136. package/sync.ts +56 -0
  137. package/tests/agentcert.test.ts +128 -0
  138. package/tests/agentfleet.test.ts +214 -0
  139. package/tests/agentreview.test.ts +241 -0
  140. package/tests/agentstream.test.ts +335 -0
  141. package/tests/agentwork.test.ts +356 -0
  142. package/tests/apifreeze.test.ts +290 -0
  143. package/tests/apimap.test.ts +112 -0
  144. package/tests/approvalgate.test.ts +175 -0
  145. package/tests/artifactmanifest.test.ts +204 -0
  146. package/tests/attentionfeed.test.ts +163 -0
  147. package/tests/backgroundruns.test.ts +100 -0
  148. package/tests/batchscheduling.test.ts +131 -0
  149. package/tests/blackboard.test.ts +238 -0
  150. package/tests/bridge.test.ts +1088 -0
  151. package/tests/browsercoverage.test.ts +134 -0
  152. package/tests/browserpolyfills.test.ts +124 -0
  153. package/tests/build.mjs +1260 -0
  154. package/tests/clientauth.test.ts +223 -0
  155. package/tests/clitools.test.ts +578 -0
  156. package/tests/confirmgates.test.ts +190 -0
  157. package/tests/containerpack.test.ts +143 -0
  158. package/tests/controlflow.test.ts +2120 -0
  159. package/tests/coordination.test.ts +345 -0
  160. package/tests/copyscreen.test.ts +139 -0
  161. package/tests/core.test.ts +417 -0
  162. package/tests/costcert.test.ts +95 -0
  163. package/tests/crossbrowser.test.ts +115 -0
  164. package/tests/cspaudit.test.ts +79 -0
  165. package/tests/dashdone.test.ts +615 -0
  166. package/tests/datagrid.test.ts +137 -0
  167. package/tests/doccheck.test.ts +107 -0
  168. package/tests/dombatch.test.ts +109 -0
  169. package/tests/emulation.test.ts +282 -0
  170. package/tests/environments.test.ts +259 -0
  171. package/tests/evidenceviews.test.ts +88 -0
  172. package/tests/exporttools.test.ts +185 -0
  173. package/tests/firefoxprep.test.ts +134 -0
  174. package/tests/flowlibrary.test.ts +242 -0
  175. package/tests/flowrun.test.ts +303 -0
  176. package/tests/forensics.test.ts +439 -0
  177. package/tests/gateway.test.ts +939 -0
  178. package/tests/headlesslib.test.ts +171 -0
  179. package/tests/httpstream.test.ts +277 -0
  180. package/tests/immutablelog.test.ts +157 -0
  181. package/tests/inboundguard.test.ts +177 -0
  182. package/tests/lazyload.test.ts +72 -0
  183. package/tests/librarymodes.test.ts +623 -0
  184. package/tests/llm.test.ts +696 -0
  185. package/tests/manifest.test.ts +226 -0
  186. package/tests/maskinputs.test.ts +150 -0
  187. package/tests/matrixverify.test.ts +111 -0
  188. package/tests/mavenpack.test.ts +75 -0
  189. package/tests/mcpserver.test.ts +704 -0
  190. package/tests/memory.test.ts +4155 -0
  191. package/tests/memorycare.test.ts +230 -0
  192. package/tests/migrateplan.test.ts +349 -0
  193. package/tests/minimization.test.ts +414 -0
  194. package/tests/modelroute.test.ts +112 -0
  195. package/tests/multiagent.test.ts +440 -0
  196. package/tests/nativebridge.test.ts +807 -0
  197. package/tests/navigation.test.ts +284 -0
  198. package/tests/nugetpack.test.ts +83 -0
  199. package/tests/orchestration.test.ts +449 -0
  200. package/tests/originpolicy.test.ts +405 -0
  201. package/tests/outputcompare.test.ts +97 -0
  202. package/tests/package.test.ts +91 -0
  203. package/tests/pagebridge.test.ts +5909 -0
  204. package/tests/pentest.test.ts +75 -0
  205. package/tests/perfrecords.test.ts +257 -0
  206. package/tests/permdiff.test.ts +85 -0
  207. package/tests/phishguard.test.ts +128 -0
  208. package/tests/pickerviews.test.ts +155 -0
  209. package/tests/pipelines.test.ts +381 -0
  210. package/tests/planlint.test.ts +240 -0
  211. package/tests/planreview.test.ts +383 -0
  212. package/tests/platformtargets.test.ts +56 -0
  213. package/tests/policy.test.ts +8284 -0
  214. package/tests/portability.test.ts +96 -0
  215. package/tests/progress.test.ts +1036 -0
  216. package/tests/promptlibrary.test.ts +116 -0
  217. package/tests/protocol.test.ts +4793 -0
  218. package/tests/publishingpipeline.test.ts +314 -0
  219. package/tests/quickactions.test.ts +164 -0
  220. package/tests/readiness.test.ts +78 -0
  221. package/tests/recipes.test.ts +163 -0
  222. package/tests/redactshots.test.ts +216 -0
  223. package/tests/registernvidiakeys.ts +51 -0
  224. package/tests/relayserve.test.ts +304 -0
  225. package/tests/releasenotes.test.ts +276 -0
  226. package/tests/resilience.test.ts +467 -0
  227. package/tests/resourceaware.test.ts +187 -0
  228. package/tests/runbudget.test.ts +125 -0
  229. package/tests/runhistory.test.ts +299 -0
  230. package/tests/runreplay.test.ts +113 -0
  231. package/tests/runresume.test.ts +184 -0
  232. package/tests/runstate.test.ts +288 -0
  233. package/tests/runtimeadapters.test.ts +251 -0
  234. package/tests/safariskeleton.test.ts +115 -0
  235. package/tests/sandboxframe.test.ts +196 -0
  236. package/tests/sbom.test.ts +105 -0
  237. package/tests/secretvault.test.ts +188 -0
  238. package/tests/selcache.test.ts +111 -0
  239. package/tests/sessioninterface.test.ts +791 -0
  240. package/tests/sessions.test.ts +591 -0
  241. package/tests/siteprefs.test.ts +228 -0
  242. package/tests/snapshotdelta.test.ts +165 -0
  243. package/tests/statusviews.test.ts +237 -0
  244. package/tests/stepmeter.test.ts +200 -0
  245. package/tests/streamparse.test.ts +163 -0
  246. package/tests/stylepruning.test.ts +90 -0
  247. package/tests/surfaces.test.ts +282 -0
  248. package/tests/sweep.test.ts +78 -0
  249. package/tests/syncbridge.test.ts +164 -0
  250. package/tests/taskqueue.test.ts +206 -0
  251. package/tests/toolcalls.test.ts +336 -0
  252. package/tests/toolcatalog.test.ts +201 -0
  253. package/tests/torture-agent.test.ts +706 -0
  254. package/tests/torture-auth.test.ts +461 -0
  255. package/tests/torture-commands.test.ts +895 -0
  256. package/tests/torture-data.test.ts +923 -0
  257. package/tests/torture-environments.test.ts +285 -0
  258. package/tests/torture-export.test.ts +263 -0
  259. package/tests/torture-http.test.ts +1379 -0
  260. package/tests/torture-llm.test.ts +808 -0
  261. package/tests/torture-memory.test.ts +1084 -0
  262. package/tests/torture-plan.test.ts +829 -0
  263. package/tests/torture-run.test.ts +626 -0
  264. package/tests/torture-session.test.ts +928 -0
  265. package/tests/torture-swarm.test.ts +1245 -0
  266. package/tests/torture-tools.test.ts +964 -0
  267. package/tests/torture-workflow.test.ts +2354 -0
  268. package/tests/tourviews.test.ts +52 -0
  269. package/tests/transparency.test.ts +147 -0
  270. package/tests/trigger.test.ts +941 -0
  271. package/tests/v1sunset.test.ts +428 -0
  272. package/tests/virtlist.test.ts +94 -0
  273. package/tests/vision.test.ts +540 -0
  274. package/tests/vsixpack.test.ts +145 -0
  275. package/tests/webapi.test.ts +523 -0
  276. package/tests/workflow.test.ts +1785 -0
  277. package/tests/workfloweditor.test.ts +759 -0
  278. package/tests/xpipack.test.ts +128 -0
  279. package/tools.ts +734 -0
  280. package/types.ts +9908 -0
  281. package/umd.ts +9 -0
  282. package/utils.ts +249 -0
  283. package/version.ts +8 -0
  284. package/versionregistry.ts +1310 -0
  285. package/views.ts +2153 -0
  286. package/vitest.config.ts +12 -0
  287. package/web/App.tsx +78 -0
  288. package/web/README.md +47 -0
  289. package/web/capacitor.config.ts +46 -0
  290. package/web/const.ts +19 -0
  291. package/web/control.shell.tsx +66 -0
  292. package/web/dashboardpage.ts +554 -0
  293. package/web/db.ts +493 -0
  294. package/web/design.html +541 -0
  295. package/web/gatewayview/Gateway.tsx +345 -0
  296. package/web/gatewayview/config.ts +1042 -0
  297. package/web/gatewayview/definition.ts +174 -0
  298. package/web/icons.ts +15 -0
  299. package/{manifest.json → web/manifest.json} +1 -1
  300. package/web/optionspage.ts +691 -0
  301. package/web/popup.ts +1651 -0
  302. package/web/schema.prisma +176 -0
  303. package/web/sidepanel.ts +7941 -0
  304. package/web/sitemanifest.json +13 -0
  305. package/web/terminal-ui.tsx +622 -0
  306. package/web/transparencypage.ts +541 -0
  307. package/web/vite.config.ts +39 -0
  308. package/web/workspace.ts +23 -0
  309. package/workbenchmemory.ts +104 -0
  310. package/workbenchsession.ts +304 -0
  311. package/workflow.ts +4495 -0
  312. package/bridge.d.ts.map +0 -1
  313. package/bridge.js +0 -1877
  314. package/bun.d.ts.map +0 -1
  315. package/bun.js +0 -52329
  316. package/caps/background.json +0 -712
  317. package/caps/cli.json +0 -360
  318. package/caps/library.json +0 -3611
  319. package/caps/mcp.json +0 -126
  320. package/caps/pagebridge.json +0 -377
  321. package/caps/popup.json +0 -51
  322. package/caps/sidepanel.json +0 -522
  323. package/checksums.txt +0 -142
  324. package/cli.d.ts.map +0 -1
  325. package/companion.d.ts.map +0 -1
  326. package/companion.js +0 -389
  327. package/crossbrowser.d.ts.map +0 -1
  328. package/crossbrowser.js +0 -1191
  329. package/dashdone.d.ts.map +0 -1
  330. package/dashdone.js +0 -368
  331. package/deno.d.ts.map +0 -1
  332. package/deno.js +0 -52325
  333. package/devthink.umd.js +0 -52346
  334. package/fixtures/bun.ts +0 -7
  335. package/fixtures/cjs.js +0 -6
  336. package/fixtures/deno.ts +0 -6
  337. package/fixtures/example-org-pagestate.json +0 -22
  338. package/fixtures/importers/automa-workflow.json +0 -18
  339. package/fixtures/importers/selenium-side.json +0 -20
  340. package/fixtures/importers/tabular-plan.csv +0 -7
  341. package/fixtures/importers/uivision-macro.json +0 -10
  342. package/fixtures/importers/v1-plan.json +0 -13
  343. package/fixtures/mcp-client.mjs +0 -14
  344. package/fixtures/pages/checkout.html +0 -192
  345. package/fixtures/pages/dashboard.html +0 -110
  346. package/fixtures/pages/feed.html +0 -113
  347. package/fixtures/pages/product-grid.html +0 -150
  348. package/fixtures/plans/form-inventory-plan.json +0 -11
  349. package/fixtures/plans/release-notes-plan.json +0 -11
  350. package/fixtures/recipes/agentscompete.json +0 -11
  351. package/fixtures/recipes/agentsforms.json +0 -11
  352. package/fixtures/recipes/agentsmonitor.json +0 -11
  353. package/fixtures/recipes/agentsreview.json +0 -29
  354. package/fixtures/recipes/agentswarm.json +0 -11
  355. package/fixtures/recipes/fillcalendar.json +0 -12
  356. package/fixtures/recipes/fillcheckout.json +0 -13
  357. package/fixtures/recipes/filldependentdropdowns.json +0 -12
  358. package/fixtures/recipes/fillfromcsv.json +0 -13
  359. package/fixtures/recipes/fillloginform.json +0 -12
  360. package/fixtures/recipes/fillmultistepwizard.json +0 -13
  361. package/fixtures/recipes/fillregistration.json +0 -12
  362. package/fixtures/recipes/fillsearchfilters.json +0 -12
  363. package/fixtures/recipes/filltypeahead.json +0 -11
  364. package/fixtures/recipes/monitoralerts.json +0 -12
  365. package/fixtures/recipes/monitoravailability.json +0 -11
  366. package/fixtures/recipes/monitornetworkquiet.json +0 -12
  367. package/fixtures/recipes/monitorpagechanges.json +0 -11
  368. package/fixtures/recipes/monitorpricechange.json +0 -11
  369. package/fixtures/recipes/monitorschedule.json +0 -12
  370. package/fixtures/recipes/scrapedynamicprices.json +0 -13
  371. package/fixtures/recipes/scrapeimagegallery.json +0 -12
  372. package/fixtures/recipes/scrapeinfinitefeed.json +0 -13
  373. package/fixtures/recipes/scrapenestedlists.json +0 -12
  374. package/fixtures/recipes/scrapeproductgrid.json +0 -12
  375. package/fixtures/recipes/scrapereviews.json +0 -12
  376. package/fixtures/recipes/scrapesearchresults.json +0 -12
  377. package/fixtures/recipes/scrapetablepagination.json +0 -12
  378. package/fixtures/recipes/testaccessibility.json +0 -34
  379. package/fixtures/recipes/testconsoleerrors.json +0 -12
  380. package/fixtures/recipes/testdeeplinks.json +0 -12
  381. package/fixtures/recipes/testformvalidation.json +0 -13
  382. package/fixtures/recipes/testlayoutshift.json +0 -12
  383. package/fixtures/recipes/testlinkcheck.json +0 -12
  384. package/fixtures/recipes/testloadtiming.json +0 -12
  385. package/fixtures/recipes/testvisualdiff.json +0 -12
  386. package/fixtures/workflows/changelog-digest-workflow.json +0 -13
  387. package/fixtures/workflows/form-survey-workflow.json +0 -13
  388. package/gallery.json +0 -706
  389. package/hardening.d.ts.map +0 -1
  390. package/hardening.js +0 -188
  391. package/headless.d.ts.map +0 -1
  392. package/headless.js +0 -11522
  393. package/http.d.ts.map +0 -1
  394. package/http.js +0 -2165
  395. package/index.cjs +0 -54682
  396. package/index.d.ts.map +0 -1
  397. package/index.js +0 -52310
  398. package/index.neutral.js +0 -46343
  399. package/mcp.d.ts.map +0 -1
  400. package/mcp.js +0 -20515
  401. package/memory.d.ts.map +0 -1
  402. package/nativehost.template.json +0 -10
  403. package/node.cjs +0 -54686
  404. package/node.d.ts.map +0 -1
  405. package/pack.d.ts.map +0 -1
  406. package/pack.js +0 -805
  407. package/policy.d.ts.map +0 -1
  408. package/progress.d.ts.map +0 -1
  409. package/progress.js +0 -645
  410. package/protocol.d.ts.map +0 -1
  411. package/protocol.js +0 -8334
  412. package/schemas/audit.schema.json +0 -226
  413. package/schemas/capability.schema.json +0 -113
  414. package/schemas/envelope.schema.json +0 -162
  415. package/schemas/memory.schema.json +0 -51
  416. package/schemas/observation.schema.json +0 -113
  417. package/schemas/plan.schema.json +0 -208
  418. package/schemas/progress.schema.json +0 -126
  419. package/schemas/proposal.schema.json +0 -68
  420. package/schemas/session.schema.json +0 -82
  421. package/schemas/tool.schema.json +0 -94
  422. package/server.d.ts.map +0 -1
  423. package/server.js +0 -28877
  424. package/umd-example.html +0 -18
  425. package/umd.d.ts.map +0 -1
  426. /package/{bun.d.ts → dist/bun.d.ts} +0 -0
  427. /package/{cli.d.ts → dist/cli.d.ts} +0 -0
  428. /package/{companion.d.ts → dist/companion.d.ts} +0 -0
  429. /package/{crossbrowser.d.ts → dist/crossbrowser.d.ts} +0 -0
  430. /package/{dashdone.d.ts → dist/dashdone.d.ts} +0 -0
  431. /package/{deno.d.ts → dist/deno.d.ts} +0 -0
  432. /package/{hardening.d.ts → dist/hardening.d.ts} +0 -0
  433. /package/{headless.d.ts → dist/headless.d.ts} +0 -0
  434. /package/{http.d.ts → dist/http.d.ts} +0 -0
  435. /package/{index.d.ts → dist/index.d.ts} +0 -0
  436. /package/{mcp.d.ts → dist/mcp.d.ts} +0 -0
  437. /package/{memory.d.ts → dist/memory.d.ts} +0 -0
  438. /package/{node.d.ts → dist/node.d.ts} +0 -0
  439. /package/{pack.d.ts → dist/pack.d.ts} +0 -0
  440. /package/{policy.d.ts → dist/policy.d.ts} +0 -0
  441. /package/{progress.d.ts → dist/progress.d.ts} +0 -0
  442. /package/{protocol.d.ts → dist/protocol.d.ts} +0 -0
  443. /package/{server.d.ts → dist/server.d.ts} +0 -0
  444. /package/{umd.d.ts → dist/umd.d.ts} +0 -0
package/serve.ts ADDED
@@ -0,0 +1,419 @@
1
+ /**
2
+ * The serve module of the 1.1.90 consolidation: every correlated variation of the mcp server surface interned in this one file, so the module family carries one surface without duplicate variations.
3
+ * The correlation is the serve mode of the agent protocol: jsonrpc holds the wire framing layer (the message codec that encodes and decodes one frame or one ordered batch, the notification frames a server never answers, and the structured errors with their retry hints that ride the rpc error data so a client reads whether a failure retries, waits its retry after window or never retries); resourceexpose holds the served resource surface (the pagestate, plan, audit, session and health catalog with its read rendering, the resource subscriptions with their change notifications that reuse the watcher baselines of the agent stream family and the notification frames the changes ride); and promptexpose holds the served prompt surface (the walkthrough prompts of the common tasks, the user authored template library published as mcp prompts and the prompts/call rendering that substitutes the declared arguments through the template library).
4
+ * No endpoint, transport, provider or built-in template body is ever hardcoded anywhere in the family: every route and prompt stays the user's choice, the audit resource carries summaries with no payload, and no served surface ever bypasses the consent gates.
5
+ */
6
+
7
+ /* ── Merged from jsonrpc.ts ── */
8
+
9
+ import { parseframe, respond, rpcerrornumbers, rpcerrorof, serializeframe } from "./mcp.js";
10
+ import { structurederrorof } from "./tools.js";
11
+ import type { jsonrpcframe, rpcerror, rpcerrorcode, retryhint, structurederror, toolresult } from "./types.js";
12
+
13
+ /**
14
+ * Json rpc framing layer of the 1.1.84 mcp server mode.
15
+ * Every wire message concern of the serve mode lives in this file: the message codec that encodes and decodes every message a transport carries — one frame or one batch array of frames — on top of the frame grammar the agent protocol family owns, the notification frames that omit the id so a server never answers them, the batch assembly and flattening that keeps the member order, the structured errors with their retry hints that ride the rpc error data so a client reads exactly whether a failure retries, waits its retry after window or never retries, and the error mapping that turns a structured error into the rpc error frame and back.
16
+ * The layer stays pure: the transports feed it raw wire text and write the encoded answers back through their own seams, the retry hints derive from the structured error surface of the call runtime, and no transport, endpoint or provider is ever hardcoded.
17
+ */
18
+
19
+ /** One wire message of the serve mode: a single frame or an ordered batch of frames. */
20
+ export type jsonrpcmessage = jsonrpcframe | jsonrpcframe[];
21
+
22
+ /** Encodes one wire message — a frame or a batch — into its compact json rpc wire form. */
23
+ export function encodemessage(message: jsonrpcmessage): string {
24
+ return Array.isArray(message) ? JSON.stringify(message) : serializeframe(message);
25
+ }
26
+
27
+ /** Decodes one raw wire message: a bare frame parses as itself while an array parses as a batch whose members must all be frames; anything else refuses. */
28
+ export function decodemessage(raw: string): { message?: jsonrpcmessage; error?: rpcerror } {
29
+ let parsed: unknown;
30
+ try {
31
+ parsed = JSON.parse(raw) as unknown;
32
+ } catch {
33
+ return { error: rpcerrorof("parse", "The wire message does not parse as json.") };
34
+ }
35
+ if (Array.isArray(parsed)) {
36
+ if (parsed.length === 0) return { error: rpcerrorof("params", "A batch message carries at least one frame.") };
37
+ const frames: jsonrpcframe[] = [];
38
+ for (const entry of parsed) {
39
+ try {
40
+ frames.push(parseframe(JSON.stringify(entry)));
41
+ } catch {
42
+ return { error: rpcerrorof("parse", "Every batch member must be a json rpc frame.") };
43
+ }
44
+ }
45
+ return { message: frames };
46
+ }
47
+ try {
48
+ const frame = parseframe(raw);
49
+ return { message: frame };
50
+ } catch {
51
+ return { error: rpcerrorof("parse", "The wire message must be one json rpc frame or one batch of frames.") };
52
+ }
53
+ }
54
+
55
+ /** Flattens one wire message into its ordered frames: a bare frame yields itself while a batch yields its members in order. */
56
+ export function framesof(message: jsonrpcmessage): jsonrpcframe[] {
57
+ return Array.isArray(message) ? message : [message];
58
+ }
59
+
60
+ /** Assembles one batch message from its ordered frames; an empty list refuses because a batch carries at least one frame. */
61
+ export function batchof(frames: jsonrpcframe[]): { message?: jsonrpcmessage; error?: rpcerror } {
62
+ if (frames.length === 0) return { error: rpcerrorof("params", "A batch message carries at least one frame.") };
63
+ return { message: frames.length === 1 ? (frames[0] as jsonrpcframe) : frames };
64
+ }
65
+
66
+ /** True when one frame is a notification: notifications omit the id and a server never answers them. */
67
+ export function isnotification(frame: jsonrpcframe): boolean {
68
+ return frame.id === undefined;
69
+ }
70
+
71
+ /** Builds one notification frame: the method with its params and no id, so the transport writes it without waiting for an answer. */
72
+ export function notificationframe(method: string, params?: Record<string, unknown>): jsonrpcframe {
73
+ return { jsonrpc: "2.0", method, ...(params !== undefined ? { params } : {}) };
74
+ }
75
+
76
+ /** Wraps one structured error with its retry hint into the rpc error frame a transport answers with: the structured surface rides the error data so the client reads the code name, the message, the retry hint and the retry after window from one frame. A code outside the json rpc code names answers as internal while the structured data keeps the original code. */
77
+ export function errorwithretry(input: {
78
+ code: rpcerrorcode | string;
79
+ message: string;
80
+ retryhint: retryhint;
81
+ retryafter?: number;
82
+ }): rpcerror {
83
+ const known = (Object.keys(rpcerrornumbers) as rpcerrorcode[]).find((code) => code === input.code);
84
+ const wirecode: rpcerrorcode = known ?? "internal";
85
+ const structured = structurederrorof({
86
+ code: input.code,
87
+ message: input.message,
88
+ retryhint: input.retryhint,
89
+ ...(input.retryafter !== undefined ? { retryafter: input.retryafter } : {}),
90
+ });
91
+ return rpcerrorof(wirecode, input.message, structured);
92
+ }
93
+
94
+ /** Reads the structured error surface with its retry hint back out of one rpc error; an error without the structured data keeps its code name and never retries. */
95
+ export function structuredof(error: rpcerror): structurederror {
96
+ if (error.data !== undefined && error.data !== null && typeof error.data === "object" && !Array.isArray(error.data)) {
97
+ const data = error.data as Record<string, unknown>;
98
+ if (
99
+ typeof data.code === "string" &&
100
+ typeof data.message === "string" &&
101
+ (data.retryhint === "retry" || data.retryhint === "wait" || data.retryhint === "none")
102
+ ) {
103
+ return {
104
+ code: data.code,
105
+ message: data.message,
106
+ retryhint: data.retryhint,
107
+ ...(typeof data.retryafter === "number" ? { retryafter: data.retryafter } : {}),
108
+ };
109
+ }
110
+ }
111
+ return structurederrorof({ code: error.code, message: error.message, retryhint: "none" });
112
+ }
113
+
114
+ /** Builds the error response frame of one request id around the structured error with its retry hint. */
115
+ export function errorresponse(input: {
116
+ id?: number | string | null;
117
+ code: rpcerrorcode | string;
118
+ message: string;
119
+ retryhint: retryhint;
120
+ retryafter?: number;
121
+ }): jsonrpcframe {
122
+ return respond({
123
+ ...(input.id === undefined ? {} : { id: input.id }),
124
+ error: errorwithretry({
125
+ code: input.code,
126
+ message: input.message,
127
+ retryhint: input.retryhint,
128
+ ...(input.retryafter !== undefined ? { retryafter: input.retryafter } : {}),
129
+ }),
130
+ });
131
+ }
132
+
133
+ /** Builds the result response frame of one request id; a tool result keeps its structured payload intact so the client reads the same details the sidepanel steps read. */
134
+ export function resultresponse(id: number | string | null | undefined, result: unknown): jsonrpcframe {
135
+ return respond({ ...(id === undefined ? {} : { id }), result });
136
+ }
137
+
138
+ /** Builds the tool result payload of one frame result: the content, the structured payload and the error flag ride the wire exactly as the sidepanel steps read them. */
139
+ export function toolresultof(result: unknown): toolresult | undefined {
140
+ if (result !== undefined && result !== null && typeof result === "object" && !Array.isArray(result)) {
141
+ const candidate = result as Record<string, unknown>;
142
+ if (typeof candidate.content === "string" && typeof candidate.iserror === "boolean")
143
+ return {
144
+ content: candidate.content,
145
+ iserror: candidate.iserror,
146
+ ...(candidate.payload !== undefined &&
147
+ candidate.payload !== null &&
148
+ typeof candidate.payload === "object" &&
149
+ !Array.isArray(candidate.payload)
150
+ ? { payload: candidate.payload as Record<string, unknown> }
151
+ : {}),
152
+ };
153
+ }
154
+ return undefined;
155
+ }
156
+
157
+ /* ── Merged from resourceexpose.ts ── */
158
+
159
+ import { notifyresource, watchresource } from "./agent.js";
160
+ import { randomid } from "./memory.js";
161
+ import type { agentplan, agentsession, auditevent, resourcewatch, servedresource, servehealth } from "./types.js";
162
+
163
+ /**
164
+ * Resource exposure of the 1.1.84 mcp server mode.
165
+ * Every served resource concern lives in this file: the resource catalog the serve mode publishes — the page state of the session tab, the approved plan, the audit trail, the session record and the health line with its version and uptime — the resources/read rendering of every resource into its wire text, the resource subscriptions a paired client opens with their change notifications that reuse the watcher baselines of the agent stream family so a subscriber reads exactly the keys that changed, and the notification frames the changes ride.
166
+ * The exposure stays pure and consent-first: the page state resource carries no page content the user granted none of, the audit trail resource carries the summaries with no payload, and a subscription never widens what the session grants because the watcher stays a read only observation.
167
+ */
168
+
169
+ /** The resource uris the serve mode publishes, in the documented order of the resources/list report. */
170
+ export const resourceuris = [
171
+ "devthink://pagestate",
172
+ "devthink://plan",
173
+ "devthink://audit",
174
+ "devthink://session",
175
+ "devthink://health",
176
+ ] as const;
177
+
178
+ /** The resource catalog the serve mode publishes: the page state of the session tab, the approved plan, the audit trail, the session record and the health line. */
179
+ export function servedresources(): servedresource[] {
180
+ return [
181
+ {
182
+ uri: "devthink://pagestate",
183
+ name: "pagestate",
184
+ description:
185
+ "The page state of the session tab: the url, the title and the page signals of the observed page — never the page content the user granted none of.",
186
+ mimetype: "application/json",
187
+ },
188
+ {
189
+ uri: "devthink://plan",
190
+ name: "plan",
191
+ description: "The plan of the live session with its state, its origin, its objective and its reviewed steps.",
192
+ mimetype: "application/json",
193
+ },
194
+ {
195
+ uri: "devthink://audit",
196
+ name: "audit",
197
+ description: "The audit trail of the session: every entry summary with its kind and time and no payload.",
198
+ mimetype: "application/json",
199
+ },
200
+ {
201
+ uri: "devthink://session",
202
+ name: "session",
203
+ description:
204
+ "The session record of the extension session the client pairs with: the state, the origin grants and the expiry.",
205
+ mimetype: "application/json",
206
+ },
207
+ {
208
+ uri: "devthink://health",
209
+ name: "health",
210
+ description:
211
+ "The health line of the serve mode: the extension version, the protocol version, the server contract version, the uptime and the serve state.",
212
+ mimetype: "application/json",
213
+ },
214
+ ];
215
+ }
216
+
217
+ /** Resolves one served resource by its uri; an unknown uri returns undefined so the read reports it. */
218
+ export function resourceof(uri: string): servedresource | undefined {
219
+ return servedresources().find((resource) => resource.uri === uri);
220
+ }
221
+
222
+ /** Reads one served resource into its wire form: the page state carries the observed signals only, the plan its reviewed steps, the audit its summaries with no payload, the session its record and the health its line; an unknown uri refuses with its reason. */
223
+ export function readresource(input: {
224
+ uri: string;
225
+ pagestate?: Record<string, unknown>;
226
+ plan?: agentplan;
227
+ audit?: auditevent[];
228
+ session?: agentsession;
229
+ health?: servehealth;
230
+ }): { resource?: servedresource; text?: string; reason?: string } {
231
+ const resource = resourceof(input.uri);
232
+ if (resource === undefined) return { reason: `The serve mode publishes no resource named ${input.uri}.` };
233
+ if (resource.uri === "devthink://pagestate") return { resource, text: JSON.stringify(input.pagestate ?? {}) };
234
+ if (resource.uri === "devthink://plan") return { resource, text: JSON.stringify(input.plan ?? null) };
235
+ if (resource.uri === "devthink://audit")
236
+ return {
237
+ resource,
238
+ text: JSON.stringify(
239
+ (input.audit ?? []).map((entry) => ({ id: entry.id, kind: entry.kind, at: entry.at, summary: entry.summary })),
240
+ ),
241
+ };
242
+ if (resource.uri === "devthink://session") {
243
+ if (input.session === undefined) return { resource, text: JSON.stringify(null) };
244
+ return {
245
+ resource,
246
+ text: JSON.stringify({
247
+ id: input.session.id,
248
+ tabid: input.session.tabid,
249
+ origin: input.session.origin,
250
+ startedat: input.session.startedat,
251
+ expiresat: input.session.expiresat,
252
+ grants: input.session.grants,
253
+ ...(input.session.stoppedat !== undefined ? { stoppedat: input.session.stoppedat } : {}),
254
+ ...(input.session.pausedat !== undefined ? { pausedat: input.session.pausedat } : {}),
255
+ }),
256
+ };
257
+ }
258
+ return { resource, text: JSON.stringify(input.health ?? {}) };
259
+ }
260
+
261
+ /** Opens one resource subscription for a paired client: the uri must name a served resource and the baseline freezes the resource state at subscription time so later change notifications deliver exactly the keys that changed. */
262
+ export function subscriberesource(input: {
263
+ clientid: string;
264
+ uri: string;
265
+ state?: Record<string, unknown>;
266
+ now: number;
267
+ id?: string;
268
+ }): { watch?: resourcewatch; reason?: string } {
269
+ if (input.clientid.trim() === "")
270
+ return { reason: "The resource subscription needs the paired client it belongs to." };
271
+ if (resourceof(input.uri) === undefined)
272
+ return { reason: `The serve mode publishes no resource named ${input.uri}.` };
273
+ const watched = watchresource({
274
+ clientid: input.clientid,
275
+ resource: input.uri,
276
+ ...(input.state !== undefined ? { state: input.state } : {}),
277
+ now: input.now,
278
+ id: input.id ?? randomid(),
279
+ });
280
+ return {
281
+ ...(watched.watch !== undefined ? { watch: watched.watch } : {}),
282
+ ...(watched.reason !== undefined ? { reason: watched.reason } : {}),
283
+ };
284
+ }
285
+
286
+ /** Publishes one resource change to its active subscribers: every watcher of the resource receives the delta of the changed keys against its baseline while the baseline absorbs the new state; the delivery stamps the last delivery time. */
287
+ export function publishchange(input: {
288
+ watches: resourcewatch[];
289
+ uri: string;
290
+ state: Record<string, unknown>;
291
+ now: number;
292
+ }): {
293
+ deliveries: Array<{ watchid: string; clientid: string; delta: Record<string, unknown>; frame: jsonrpcframe }>;
294
+ watches: resourcewatch[];
295
+ } {
296
+ const outcome = notifyresource({ watches: input.watches, resource: input.uri, state: input.state, now: input.now });
297
+ return {
298
+ deliveries: outcome.deliveries.map((delivery) => ({
299
+ ...delivery,
300
+ frame: resourcechangeframe(delivery.watchid, input.uri, delivery.delta, input.now),
301
+ })),
302
+ watches: outcome.watches,
303
+ };
304
+ }
305
+
306
+ /** Builds the resources/updated notification frame of one delivered change: the watcher id, the resource uri, the changed keys and the time. */
307
+ export function resourcechangeframe(
308
+ watchid: string,
309
+ uri: string,
310
+ delta: Record<string, unknown>,
311
+ now: number,
312
+ ): jsonrpcframe {
313
+ return { jsonrpc: "2.0", method: "resources/updated", params: { watchid, uri, delta, at: now } };
314
+ }
315
+
316
+ /** Builds the resources/list result of the serve mode: every served resource with its uri, description and mimetype. */
317
+ export function resourceslist(): { resources: servedresource[] } {
318
+ return { resources: servedresources() };
319
+ }
320
+
321
+ /* ── Merged from promptexpose.ts ── */
322
+
323
+ import { listprompts as agentprompts, renderprompt } from "./agent.js";
324
+ import { rendertemplate } from "./llm.js";
325
+ import type { promptdef, prompttemplate } from "./types.js";
326
+
327
+ /**
328
+ * Prompt exposure of the 1.1.84 mcp server mode.
329
+ * Every served prompt concern lives in this file: the prompt template library published as mcp prompts — every user saved template of the llm integration family becomes one prompt with its variables as declared arguments — the walkthrough prompts for the common tasks a client walks through (the first snapshot, the reviewed fill and the table extraction) with their ordered steps rendered in plain language, the combined prompts/list report of the library and the walkthroughs beside the protocol prompt tools, and the prompts/call rendering that substitutes the declared arguments through the template library so a client reads exactly the prompt the user authored.
330
+ * The exposure stays pure: no built-in template body ever ships beyond the reviewed walkthrough steps, a sensitive library template keeps its consent notice requirement, and no prompt execution bypasses the consent gates.
331
+ */
332
+
333
+ /** The walkthrough prompts of the common tasks: the ordered steps a client walks through, rendered from the declared arguments. */
334
+ export function walkthroughprompts(): promptdef[] {
335
+ return [
336
+ {
337
+ name: "walkthrough.firstsnapshot",
338
+ description:
339
+ "Walks a client through the first reviewed snapshot: pair the client, read the page state and propose the plan behind the human review.",
340
+ arguments: [{ name: "origin", description: "The origin of the page the walkthrough observes.", required: true }],
341
+ template:
342
+ "First snapshot walkthrough for {{origin}}. Steps: 1. the paired client calls browser.snapshot to read the semantic snapshot of the active tab; 2. the client reads the devthink://pagestate resource for the page signals; 3. the client proposes its plan through workflow.plan with the observed steps; 4. the human review approves or refuses the plan before any step with side effects runs.",
343
+ },
344
+ {
345
+ name: "walkthrough.reviewedfill",
346
+ description:
347
+ "Walks a client through a reviewed form fill: propose the typed plan, wait for the review gate and execute exactly the approved steps.",
348
+ arguments: [
349
+ { name: "form", description: "The reviewed selector of the form the walkthrough fills.", required: true },
350
+ { name: "fields", description: "The reviewed field values of the fill.", required: true },
351
+ ],
352
+ template:
353
+ "Reviewed fill walkthrough for {{form}} with {{fields}}. Steps: 1. the client reads the form through browser.extract; 2. the client proposes the typed steps through workflow.plan naming every field value; 3. the client submits the plan through workflow.review and the call waits for the human answer; 4. the approved steps run exactly as reviewed while a refused gate never executes.",
354
+ },
355
+ {
356
+ name: "walkthrough.tablextract",
357
+ description:
358
+ "Walks a client through a reviewed table extraction: read the table, stream the rows and keep the provenance.",
359
+ arguments: [
360
+ { name: "table", description: "The reviewed selector of the table the walkthrough extracts.", required: true },
361
+ ],
362
+ template:
363
+ "Table extraction walkthrough for {{table}}. Steps: 1. the client reads the table through browser.readtable; 2. long results stream through the call chunks while the client reads them as they arrive; 3. the client reads the devthink://audit resource for the provenance of every read; 4. nothing leaves the machine because every step stays a read.",
364
+ },
365
+ ];
366
+ }
367
+
368
+ /** Publishes one prompt template of the library as one mcp prompt: the template name becomes the prompt name, the description states the user authored body and the declared arguments carry the template variables with their required markers. */
369
+ export function templateprompt(template: prompttemplate): promptdef {
370
+ return {
371
+ name: template.name,
372
+ description: `The user authored template ${template.name} of the prompt library (version ${template.version})${template.notes !== undefined ? ` — ${template.notes}` : ""}; the declared arguments are its template variables.`,
373
+ arguments: template.variables.map((variable) => ({
374
+ name: variable,
375
+ description: `The value the template substitutes for the {{${variable}}} placeholder.`,
376
+ required: true,
377
+ })),
378
+ template: template.body,
379
+ };
380
+ }
381
+
382
+ /** Lists every served prompt of the serve mode: the walkthrough prompts for the common tasks first, then the prompt template library the user authored, then the protocol prompt tools of the agent stream family. */
383
+ export function listmcpprompts(templates: prompttemplate[]): promptdef[] {
384
+ return [...walkthroughprompts(), ...templates.map(templateprompt), ...agentprompts()];
385
+ }
386
+
387
+ /** Renders one served prompt with its arguments: a walkthrough or protocol prompt renders through its own template while a library template renders through the template library so its sensitive consent notice requirement stays intact; a required argument left empty keeps its placeholder so the review sees the gap. */
388
+ export function rendermcpprompt(input: { name: string; args?: Record<string, unknown>; templates: prompttemplate[] }): {
389
+ prompt?: promptdef;
390
+ rendered?: string;
391
+ reason?: string;
392
+ } {
393
+ const prompts = listmcpprompts(input.templates);
394
+ const prompt = prompts.find((candidate) => candidate.name === input.name);
395
+ if (prompt === undefined) return { reason: `The serve mode publishes no prompt named ${input.name}.` };
396
+ const args = input.args ?? {};
397
+ const template = input.templates.find(
398
+ (candidate) =>
399
+ candidate.name === input.name &&
400
+ candidate.version ===
401
+ Math.max(...input.templates.filter((entry) => entry.name === input.name).map((entry) => entry.version)),
402
+ );
403
+ if (template !== undefined) {
404
+ const variables: Record<string, unknown> = {};
405
+ for (const argument of prompt.arguments) {
406
+ const value = args[argument.name];
407
+ if (value !== undefined && value !== null) variables[argument.name] = value;
408
+ }
409
+ const outcome = rendertemplate({ template, variables, sensitive: false });
410
+ if (outcome.text !== undefined) return { prompt, rendered: outcome.text };
411
+ return { prompt, reason: outcome.reason ?? "The library template did not render." };
412
+ }
413
+ return { prompt, rendered: renderprompt(prompt, args) };
414
+ }
415
+
416
+ /** Builds the prompts/list result of the serve mode: every walkthrough prompt, every library template prompt and every protocol prompt with its declared arguments. */
417
+ export function promptsof(templates: prompttemplate[]): { prompts: promptdef[] } {
418
+ return { prompts: listmcpprompts(templates) };
419
+ }