@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/identity.ts ADDED
@@ -0,0 +1,246 @@
1
+ import { createHash, randomInt, timingSafeEqual } from "node:crypto";
2
+ import { existsSync, readFileSync, renameSync, writeFileSync } from "node:fs";
3
+ import { ensurePaths, type DevThinkPaths } from "./config.js";
4
+ import { createCompactId } from "./ids.js";
5
+
6
+ export type DevThinkIdentity = { version: 1; userId: string; deviceId: string; createdAt: string };
7
+ export type PairingRecord = {
8
+ id: string;
9
+ userId: string;
10
+ deviceId: string;
11
+ codeHash?: string;
12
+ createdAt: string;
13
+ expiresAt: number;
14
+ usedAt?: string;
15
+ revokedAt?: string;
16
+ };
17
+ export type BrowserSession = {
18
+ id: string;
19
+ userId: string;
20
+ deviceId: string;
21
+ tokenHash: string;
22
+ createdAt: string;
23
+ expiresAt: number;
24
+ revokedAt?: string;
25
+ };
26
+ type PairingStore = { version: 1; pairings: PairingRecord[]; sessions: BrowserSession[] };
27
+
28
+ const alphabet = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789";
29
+ const codeLength = 8;
30
+ const pairingLifetimeMs = 5 * 60 * 1000;
31
+ const browserSessionLifetimeMs = 15 * 60 * 1000;
32
+
33
+ export function normalizePublicUserId(value: string): string {
34
+ const userId = value.trim().toLowerCase();
35
+ if (!/^[a-z][a-z0-9]{9,14}$/.test(userId))
36
+ throw new Error("Public user ID must contain 10-15 lowercase letters or numbers and start with a letter.");
37
+ return userId;
38
+ }
39
+
40
+ function digest(value: string): string {
41
+ return createHash("sha256").update(value).digest("hex");
42
+ }
43
+
44
+ function privateWrite(path: string, value: unknown): void {
45
+ const temporary = `${path}.${process.pid}.${Date.now()}.tmp`;
46
+ writeFileSync(temporary, `${JSON.stringify(value, null, 2)}\n`, { encoding: "utf8", mode: 0o600 });
47
+ renameSync(temporary, path);
48
+ }
49
+
50
+ function createId(prefix: string): string {
51
+ return createCompactId(prefix);
52
+ }
53
+
54
+ function code(): string {
55
+ return Array.from({ length: codeLength }, () => alphabet[randomInt(alphabet.length)]).join("");
56
+ }
57
+
58
+ export function getIdentity(paths: DevThinkPaths): DevThinkIdentity {
59
+ ensurePaths(paths);
60
+ try {
61
+ if (existsSync(paths.identity)) {
62
+ const parsed: unknown = JSON.parse(readFileSync(paths.identity, "utf8"));
63
+ if (
64
+ parsed &&
65
+ typeof parsed === "object" &&
66
+ typeof (parsed as DevThinkIdentity).userId === "string" &&
67
+ typeof (parsed as DevThinkIdentity).deviceId === "string"
68
+ )
69
+ return parsed as DevThinkIdentity;
70
+ }
71
+ } catch {
72
+ /* the guarded best-effort operation falls through: the outer flow owns the failure */
73
+ }
74
+ const identity: DevThinkIdentity = {
75
+ version: 1,
76
+ userId: createId("u"),
77
+ deviceId: createId("d"),
78
+ createdAt: new Date().toISOString(),
79
+ };
80
+ privateWrite(paths.identity, identity);
81
+ return identity;
82
+ }
83
+
84
+ /** Updates the public local-person identifier and migrates active local pairing records. */
85
+ export function setIdentityUserId(paths: DevThinkPaths, requestedUserId: string): DevThinkIdentity {
86
+ const current = getIdentity(paths);
87
+ const userId = normalizePublicUserId(requestedUserId);
88
+ if (current.userId === userId) return current;
89
+ const next = { ...current, userId };
90
+ privateWrite(paths.identity, next);
91
+ const store = readStore(paths);
92
+ for (const record of store.pairings) if (record.userId === current.userId) record.userId = userId;
93
+ for (const session of store.sessions) if (session.userId === current.userId) session.userId = userId;
94
+ writeStore(paths, store);
95
+ return next;
96
+ }
97
+
98
+ function readStore(paths: DevThinkPaths): PairingStore {
99
+ try {
100
+ if (existsSync(paths.pairings)) {
101
+ const parsed: unknown = JSON.parse(readFileSync(paths.pairings, "utf8"));
102
+ if (
103
+ parsed &&
104
+ typeof parsed === "object" &&
105
+ Array.isArray((parsed as PairingStore).pairings) &&
106
+ Array.isArray((parsed as PairingStore).sessions)
107
+ )
108
+ return parsed as PairingStore;
109
+ }
110
+ } catch {
111
+ /* the guarded best-effort operation falls through: the outer flow owns the failure */
112
+ }
113
+ return { version: 1, pairings: [], sessions: [] };
114
+ }
115
+
116
+ function writeStore(paths: DevThinkPaths, store: PairingStore): void {
117
+ ensurePaths(paths);
118
+ privateWrite(paths.pairings, store);
119
+ }
120
+
121
+ function active(store: PairingStore): PairingStore {
122
+ const now = Date.now();
123
+ return {
124
+ version: 1,
125
+ pairings: store.pairings
126
+ .filter((record) => record.expiresAt > now || Boolean(record.usedAt) || Boolean(record.revokedAt))
127
+ .slice(-100),
128
+ sessions: store.sessions.filter((session) => session.expiresAt > now && !session.revokedAt).slice(-100),
129
+ };
130
+ }
131
+
132
+ export function createPairing(
133
+ paths: DevThinkPaths,
134
+ lifetimeMs = pairingLifetimeMs,
135
+ ): { identity: DevThinkIdentity; pairingId: string; code: string; expiresAt: number } {
136
+ const identity = getIdentity(paths);
137
+ const store = active(readStore(paths));
138
+ const pairingId = createId("p");
139
+ const oneTimeCode = code();
140
+ const expiresAt = Date.now() + lifetimeMs;
141
+ store.pairings.push({
142
+ id: pairingId,
143
+ userId: identity.userId,
144
+ deviceId: identity.deviceId,
145
+ codeHash: digest(oneTimeCode),
146
+ createdAt: new Date().toISOString(),
147
+ expiresAt,
148
+ });
149
+ writeStore(paths, store);
150
+ return { identity, pairingId, code: oneTimeCode, expiresAt };
151
+ }
152
+
153
+ /** Builds a one-time workbench invitation without embedding any provider credential. */
154
+ export function createPairingLink(
155
+ pagesUrl: string | undefined,
156
+ gatewayUrl: string | undefined,
157
+ pairingId: string,
158
+ oneTimeCode: string,
159
+ ): string | undefined {
160
+ if (!pagesUrl || !gatewayUrl) return undefined;
161
+ try {
162
+ const url = new URL(pagesUrl);
163
+ url.searchParams.set("gateway", gatewayUrl);
164
+ url.searchParams.set("pair", pairingId);
165
+ url.searchParams.set("code", oneTimeCode);
166
+ return url.toString();
167
+ } catch {
168
+ return undefined;
169
+ }
170
+ }
171
+
172
+ export function consumePairing(
173
+ paths: DevThinkPaths,
174
+ pairingId: string,
175
+ oneTimeCode: string,
176
+ sessionLifetimeMs = browserSessionLifetimeMs,
177
+ ): { token: string; identity: DevThinkIdentity; expiresAt: number } | undefined {
178
+ const store = active(readStore(paths));
179
+ const record = store.pairings.find(
180
+ (candidate) =>
181
+ candidate.id === pairingId && !candidate.usedAt && !candidate.revokedAt && candidate.expiresAt > Date.now(),
182
+ );
183
+ if (!record?.codeHash) return undefined;
184
+ const supplied = Buffer.from(digest(oneTimeCode));
185
+ const stored = Buffer.from(record.codeHash);
186
+ if (supplied.length !== stored.length || !timingSafeEqual(supplied, stored)) return undefined;
187
+ const token = createId("pt");
188
+ const expiresAt = Date.now() + sessionLifetimeMs;
189
+ record.usedAt = new Date().toISOString();
190
+ delete record.codeHash;
191
+ store.sessions.push({
192
+ id: createId("bs"),
193
+ userId: record.userId,
194
+ deviceId: record.deviceId,
195
+ tokenHash: digest(token),
196
+ createdAt: new Date().toISOString(),
197
+ expiresAt,
198
+ });
199
+ writeStore(paths, store);
200
+ return { token, identity: getIdentity(paths), expiresAt };
201
+ }
202
+
203
+ export function verifyBrowserSession(paths: DevThinkPaths, token: string | undefined): BrowserSession | undefined {
204
+ if (!token) return undefined;
205
+ const store = active(readStore(paths));
206
+ const tokenHash = digest(token);
207
+ const session = store.sessions.find(
208
+ (candidate) => candidate.tokenHash === tokenHash && candidate.expiresAt > Date.now() && !candidate.revokedAt,
209
+ );
210
+ writeStore(paths, store);
211
+ return session;
212
+ }
213
+
214
+ export function revokeBrowserSessions(paths: DevThinkPaths): number {
215
+ const store = readStore(paths);
216
+ const identity = getIdentity(paths);
217
+ let count = 0;
218
+ for (const session of store.sessions) {
219
+ if (session.userId === identity.userId && !session.revokedAt) {
220
+ session.revokedAt = new Date().toISOString();
221
+ count += 1;
222
+ }
223
+ }
224
+ writeStore(paths, store);
225
+ return count;
226
+ }
227
+
228
+ export function pairingStatus(paths: DevThinkPaths): {
229
+ identity: DevThinkIdentity;
230
+ activePairs: number;
231
+ activeSessions: number;
232
+ } {
233
+ const store = active(readStore(paths));
234
+ writeStore(paths, store);
235
+ const identity = getIdentity(paths);
236
+ return {
237
+ identity,
238
+ activePairs: store.pairings.filter(
239
+ (record) =>
240
+ record.userId === identity.userId && !record.usedAt && !record.revokedAt && record.expiresAt > Date.now(),
241
+ ).length,
242
+ activeSessions: store.sessions.filter(
243
+ (session) => session.userId === identity.userId && !session.revokedAt && session.expiresAt > Date.now(),
244
+ ).length,
245
+ };
246
+ }
package/ids.ts ADDED
@@ -0,0 +1,26 @@
1
+ /** DevThink identity contract: compact, lowercase, URL-safe identifiers for new local records. */
2
+ import { randomBytes } from "node:crypto";
3
+
4
+ const alphabet = "0123456789abcdefghjkmnpqrstvwxyz";
5
+ const tokenLength = 10;
6
+
7
+ /** Generates a 50-bit compact suffix that avoids ambiguous characters. */
8
+ export function compactToken(): string {
9
+ const bytes = randomBytes(tokenLength);
10
+ return Array.from(bytes, (value) => alphabet[value & 31]).join("");
11
+ }
12
+
13
+ /** Creates a short identifier such as `s_1e9k2m7v3q`; existing longer IDs remain valid inputs. */
14
+ export function createCompactId(prefix: string): string {
15
+ const normalized =
16
+ prefix
17
+ .toLowerCase()
18
+ .replace(/[^a-z0-9]/g, "")
19
+ .slice(0, 4) || "id";
20
+ return `${normalized}_${compactToken()}`;
21
+ }
22
+
23
+ /** Identifies the compact format without rejecting existing legacy identifiers. */
24
+ export function isCompactId(value: string): boolean {
25
+ return /^[a-z0-9]{1,4}_[0123456789abcdefghjkmnpqrstvwxyz]{10}$/.test(value);
26
+ }
package/index.ts ADDED
@@ -0,0 +1,369 @@
1
+ import { stampbundle } from "./runtime.js";
2
+
3
+ stampbundle("esm", "index.js");
4
+ export * from "./agent.js";
5
+ export * from "./gates.js";
6
+ export * from "./swarm.js";
7
+ export * from "./capture.js";
8
+ export * from "./debug.js";
9
+ export * from "./auth.js";
10
+ export * from "./workflow.js";
11
+ export * from "./environments.js";
12
+ export * from "./http.js";
13
+ export * from "./security.js";
14
+ export * from "./llm.js";
15
+ export * from "./memory.js";
16
+ export * from "./mcp.js";
17
+ export * from "./serve.js";
18
+ export * from "./bridge.js";
19
+ export * from "./crossbrowser.js";
20
+ export * from "./pack.js";
21
+ export * from "./commands.js";
22
+ export * from "./data.js";
23
+ export * from "./net.js";
24
+ export * from "./run.js";
25
+ export * from "./session.js";
26
+ export * from "./plan.js";
27
+ export * from "./views.js";
28
+ export * from "./export.js";
29
+ export * from "./flow.js";
30
+ export * from "./evidence.js";
31
+ export * from "./headless.js";
32
+ export * from "./runtime.js";
33
+ export * from "./version.js";
34
+ export * from "./perf.js";
35
+ export * from "./tools.js";
36
+ export * from "./apifreeze.js";
37
+ export {
38
+ argkind,
39
+ attachtimeline,
40
+ blockingduration,
41
+ consolecapture,
42
+ consolediff,
43
+ errorcapture,
44
+ filterentries,
45
+ levelrank,
46
+ loglevels,
47
+ longtaskcapture,
48
+ netfailureentryof,
49
+ redactconsoletext,
50
+ rejectioncapture,
51
+ rotatelogs,
52
+ serializearg,
53
+ spamdetect,
54
+ stackframes,
55
+ timelinecounts,
56
+ timelinekinds,
57
+ timelinesources,
58
+ watcherdetached,
59
+ type timeline,
60
+ } from "./run.js";
61
+ export {
62
+ actionrisk as deriveactionrisk,
63
+ agentbudgetvalid,
64
+ agentscopevalid,
65
+ apikeyconsentgranted,
66
+ authconsentgranted,
67
+ blackboardconsentgrade,
68
+ blockgate,
69
+ breakpointbudgetallowed,
70
+ breakpointceilingof,
71
+ canexecute,
72
+ confirmcredsgate,
73
+ confirmdeletegate,
74
+ confirmpaygate,
75
+ connectallowgate,
76
+ consoleconsentcovers,
77
+ controltarget,
78
+ cookiegate,
79
+ debuggate,
80
+ debuggerconsentcovers,
81
+ debugwaitbudgetallowed,
82
+ diffreviewgrade,
83
+ dryrunprojection,
84
+ editorsavegate,
85
+ emugate,
86
+ emulationretentionwindow,
87
+ emulationstackallowed,
88
+ environmentgrantgate,
89
+ environmentrequirements,
90
+ exportcontentreview,
91
+ gatebatchgate,
92
+ generatedvalueallowed,
93
+ hostpattern,
94
+ iscdpkind,
95
+ isdebugkind,
96
+ isformkind,
97
+ isnetwatchkind,
98
+ iscontrolkind,
99
+ isprofilekind,
100
+ issocketkind,
101
+ iswatchkind,
102
+ issessionkind,
103
+ isworkflowkind,
104
+ istriggeraction,
105
+ keepalivegate,
106
+ keepaliveintervalvalid,
107
+ killswitchgate,
108
+ agentscopegate,
109
+ budgetgate,
110
+ escalateholdgate,
111
+ reviewrequestgate,
112
+ pauseagentgate,
113
+ agentnamevalid,
114
+ fleetoperationgrade,
115
+ replayexportgate,
116
+ voteweightvalid,
117
+ messageegressgrade,
118
+ normalizeendpoint,
119
+ observationmodeof,
120
+ offscreencapabilitygate,
121
+ origincheckgate,
122
+ pauseretentionwindow,
123
+ passwordconsentgranted,
124
+ permissionnamevalid,
125
+ permissionstatevalid,
126
+ phishguardgate,
127
+ phishthresholdgate,
128
+ planallowlist,
129
+ profilegrantgranted,
130
+ profileretentionwindow,
131
+ proxygate,
132
+ queuelanesvalid,
133
+ ratelimitbudgetallowed,
134
+ ratelimitboundsvalid,
135
+ ratelimitgate,
136
+ resolvedrisk,
137
+ resolutionverdict,
138
+ restoreoriginsgranted,
139
+ restorereviewgranted,
140
+ reviewedkinds,
141
+ readonlyactionkinds,
142
+ rotationruleof,
143
+ runreviewgranted,
144
+ safedefaultsgate,
145
+ sandboxorigingate,
146
+ schemaguardgate,
147
+ serverbindgate,
148
+ serverenablementgate,
149
+ sessionfolderunique,
150
+ sessionnameunique,
151
+ sessionrestoregate,
152
+ snapshotretentionwindow,
153
+ socketgate,
154
+ sourcemapconsentcovers,
155
+ spamruleof,
156
+ spawngrade,
157
+ stackgate,
158
+ stepenvironmentvalid,
159
+ submitreviewgranted,
160
+ targetgate,
161
+ toolconsentrequired,
162
+ tooldispatchgate,
163
+ toolnamespacegate,
164
+ toolriskgrade,
165
+ toolversionfloor,
166
+ untrustedrendergate,
167
+ validatetoolcatalog,
168
+ vaultsecretgate,
169
+ workstealgrade,
170
+ workerpoolsizevalid,
171
+ isemulationkind,
172
+ locationconsentgate,
173
+ automationallowlistgate,
174
+ consentdurationvalid,
175
+ consentwindowgate,
176
+ logreadgate,
177
+ originprofilegate,
178
+ revokerungate,
179
+ sensitiveclassgate,
180
+ sensitivepipelingate,
181
+ sitenotesreadgate,
182
+ sitenoteswritegate,
183
+ scratchpadscopegate,
184
+ memoryreadscopegate,
185
+ semanticrecallscopegate,
186
+ summarywindowvalid,
187
+ sessionretentionvalid,
188
+ consentmemoryadvisorygate,
189
+ cancelrungate,
190
+ retrydispatchgate,
191
+ timelinegate,
192
+ costbudgetvalid,
193
+ egressconsentgate,
194
+ guardverdictgate,
195
+ localsensitivegrade,
196
+ planlint,
197
+ plandraftreviewgate,
198
+ provideregressgrade,
199
+ providervalid,
200
+ replanreviewgate,
201
+ timelineretentionwindow,
202
+ traceceilingof,
203
+ triggergate,
204
+ triggerorigins,
205
+ validatebreakpointcondition,
206
+ validatefieldmatch,
207
+ validateformrecord,
208
+ validatestep,
209
+ validatesiteoverride,
210
+ validateregexrule,
211
+ validatetargetref,
212
+ validatevaluegen,
213
+ watchdogconfigvalid,
214
+ watchgate,
215
+ workflowgate,
216
+ paletteactiongate,
217
+ taskinputproposalgate,
218
+ planreviewgate,
219
+ stepapprovegate,
220
+ diffpreviewgate,
221
+ onboardingconsentgate,
222
+ logbufferboundvalid,
223
+ logstreamegressgate,
224
+ quickactiongate,
225
+ omniboxtaskgate,
226
+ shortcutkeygate,
227
+ notificationcontentgate,
228
+ pickeroverlaygate,
229
+ shotpanelgate,
230
+ siteprofilegate,
231
+ importexportgate,
232
+ librarymanifestgate,
233
+ librarycapabilitygate,
234
+ librarygrantgate,
235
+ librarysensitivegate,
236
+ libraryquarantinegate,
237
+ libraryimportgate,
238
+ syncbridgeoptingate,
239
+ syncbridgescopegate,
240
+ runreplaygate,
241
+ outputcomparegate,
242
+ outputcomparereadonlygate,
243
+ backgroundrungate,
244
+ portablerulefamilies,
245
+ portablerulesetof,
246
+ portablerulesetgate,
247
+ portablecapabilitygate,
248
+ flowrungrantgate,
249
+ exportchaingate,
250
+ exportmaskgate,
251
+ headlessconsentgate,
252
+ headlesstelemetrygate,
253
+ platformmatrixgate,
254
+ adaptermappinggate,
255
+ capabilitydowngradegate,
256
+ lazyloadgate,
257
+ debouncewindowvalid,
258
+ batchqueryplangate,
259
+ incrsnapshotgate,
260
+ selcachegate,
261
+ streamparsegate,
262
+ chunkextractgate,
263
+ workerbackpressuregate,
264
+ virtlistwindowvalid,
265
+ perfprovenancegate,
266
+ lazybudgetvalid,
267
+ batchwindowvalid,
268
+ domainlimitsvalid,
269
+ politedelayvalid,
270
+ adaptivepollvalid,
271
+ runbudgetvalid,
272
+ budgetthresholdsvalid,
273
+ timeoutboundvalid,
274
+ timeoutrecordeventgate,
275
+ suspendwindowvalid,
276
+ sessionreusegate,
277
+ resumefingerprintgate,
278
+ logprunegate,
279
+ stepprefetchgate,
280
+ slowmofactorvalid,
281
+ replaycheck,
282
+ checkpointgate,
283
+ rollbackgate,
284
+ zombiegate,
285
+ rollbackorigingate,
286
+ heartbeatwindowvalid,
287
+ offlinegate,
288
+ queuedtaskexpirygate,
289
+ queuedepthvalid,
290
+ actionkindcatalog,
291
+ prefetchgate,
292
+ preconnectgate,
293
+ deeplinkgate,
294
+ reopentabgate,
295
+ pausenavconsentgate,
296
+ navratelimitgate,
297
+ clipboardgate,
298
+ safetygate,
299
+ batchsizelimitgate,
300
+ navigationobservationgrade,
301
+ trailexportgate,
302
+ trailorigingate,
303
+ streamgate,
304
+ transformgate,
305
+ dedupeconfiggate,
306
+ samplegate,
307
+ provgate,
308
+ resumegate,
309
+ pipelinetargetgate,
310
+ gridexportconfirmgate,
311
+ streamchunkgate,
312
+ provlogappendonlygate,
313
+ rowstampgate,
314
+ streamnamespacegate,
315
+ transportgate,
316
+ subscribegate,
317
+ postgate,
318
+ uploadgate,
319
+ cachegate,
320
+ ratelimitrespectgate,
321
+ correlationmappinggate,
322
+ pollchoices,
323
+ subscriptionboundgate,
324
+ apicallgrade,
325
+ transportcancelgate,
326
+ pollwaitbudgetgate,
327
+ visiongate,
328
+ ocrgate,
329
+ redactgate,
330
+ groundgate,
331
+ pairgate,
332
+ visionchoices,
333
+ visioncostgrade,
334
+ visionconsentgate,
335
+ visionsensitivegrade,
336
+ regionboundsgate,
337
+ framebudgetgate,
338
+ visioncacheexpirygate,
339
+ serverurlgate,
340
+ bridgeconsentgate,
341
+ bridgemembergate,
342
+ bridgecontentgate,
343
+ bridgepairingwindowvalid,
344
+ bridgeidlewindowvalid,
345
+ bridgeheartbeatvalid,
346
+ bridgeratecapvalid,
347
+ bridgekillswitchgate,
348
+ bridgeframeorigingate,
349
+ bridgechoices,
350
+ gatewaybaseurlgate,
351
+ gatewayprefixgate,
352
+ gatewayconsentgate,
353
+ gatewaykeyconsentgate,
354
+ gatewayretrycapvalid,
355
+ gatewaycachewindowvalid,
356
+ nativeinstallconsentgate,
357
+ nativetransportconsentgate,
358
+ nativesensitiveapprovalgate,
359
+ nativekillswitchgate,
360
+ nativeescapehatchgate,
361
+ nativeheadlessgate,
362
+ nativeidlewindowvalid,
363
+ nativeheartbeatintervalvalid,
364
+ nativeratecapvalid,
365
+ } from "./policy.js";
366
+ export * from "./protocol.js";
367
+ export * from "./types.js";
368
+ export type { actionrisk, loopstep } from "./types.js";
369
+ export { retryhintof } from "./session.js";