@wenathlan/devthink 2.0.15 → 2.0.19
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.
- package/CHANGELOG.md +45 -0
- package/{dist/bridge.d.ts → bridge.d.ts} +1 -1
- package/bridge.d.ts.map +1 -0
- package/bridge.js +1877 -0
- package/bun.d.ts.map +1 -0
- package/bun.js +52329 -0
- package/caps/background.json +712 -0
- package/caps/cli.json +360 -0
- package/caps/library.json +3611 -0
- package/caps/mcp.json +126 -0
- package/caps/pagebridge.json +377 -0
- package/caps/popup.json +51 -0
- package/caps/sidepanel.json +522 -0
- package/checksums.txt +142 -0
- package/cli.d.ts.map +1 -0
- package/{dist/cli.js → cli.js} +2 -2
- package/companion.d.ts.map +1 -0
- package/companion.js +389 -0
- package/crossbrowser.d.ts.map +1 -0
- package/crossbrowser.js +1191 -0
- package/dashdone.d.ts.map +1 -0
- package/dashdone.js +368 -0
- package/deno.d.ts.map +1 -0
- package/deno.js +52325 -0
- package/devthink.umd.js +52346 -0
- package/fixtures/bun.ts +7 -0
- package/fixtures/cjs.js +6 -0
- package/fixtures/deno.ts +6 -0
- package/fixtures/example-org-pagestate.json +22 -0
- package/fixtures/importers/automa-workflow.json +18 -0
- package/fixtures/importers/selenium-side.json +20 -0
- package/fixtures/importers/tabular-plan.csv +7 -0
- package/fixtures/importers/uivision-macro.json +10 -0
- package/fixtures/importers/v1-plan.json +13 -0
- package/fixtures/mcp-client.mjs +14 -0
- package/fixtures/pages/checkout.html +192 -0
- package/fixtures/pages/dashboard.html +110 -0
- package/fixtures/pages/feed.html +113 -0
- package/fixtures/pages/product-grid.html +150 -0
- package/fixtures/plans/form-inventory-plan.json +11 -0
- package/fixtures/plans/release-notes-plan.json +11 -0
- package/fixtures/recipes/agentscompete.json +11 -0
- package/fixtures/recipes/agentsforms.json +11 -0
- package/fixtures/recipes/agentsmonitor.json +11 -0
- package/fixtures/recipes/agentsreview.json +29 -0
- package/fixtures/recipes/agentswarm.json +11 -0
- package/fixtures/recipes/fillcalendar.json +12 -0
- package/fixtures/recipes/fillcheckout.json +13 -0
- package/fixtures/recipes/filldependentdropdowns.json +12 -0
- package/fixtures/recipes/fillfromcsv.json +13 -0
- package/fixtures/recipes/fillloginform.json +12 -0
- package/fixtures/recipes/fillmultistepwizard.json +13 -0
- package/fixtures/recipes/fillregistration.json +12 -0
- package/fixtures/recipes/fillsearchfilters.json +12 -0
- package/fixtures/recipes/filltypeahead.json +11 -0
- package/fixtures/recipes/monitoralerts.json +12 -0
- package/fixtures/recipes/monitoravailability.json +11 -0
- package/fixtures/recipes/monitornetworkquiet.json +12 -0
- package/fixtures/recipes/monitorpagechanges.json +11 -0
- package/fixtures/recipes/monitorpricechange.json +11 -0
- package/fixtures/recipes/monitorschedule.json +12 -0
- package/fixtures/recipes/scrapedynamicprices.json +13 -0
- package/fixtures/recipes/scrapeimagegallery.json +12 -0
- package/fixtures/recipes/scrapeinfinitefeed.json +13 -0
- package/fixtures/recipes/scrapenestedlists.json +12 -0
- package/fixtures/recipes/scrapeproductgrid.json +12 -0
- package/fixtures/recipes/scrapereviews.json +12 -0
- package/fixtures/recipes/scrapesearchresults.json +12 -0
- package/fixtures/recipes/scrapetablepagination.json +12 -0
- package/fixtures/recipes/testaccessibility.json +34 -0
- package/fixtures/recipes/testconsoleerrors.json +12 -0
- package/fixtures/recipes/testdeeplinks.json +12 -0
- package/fixtures/recipes/testformvalidation.json +13 -0
- package/fixtures/recipes/testlayoutshift.json +12 -0
- package/fixtures/recipes/testlinkcheck.json +12 -0
- package/fixtures/recipes/testloadtiming.json +12 -0
- package/fixtures/recipes/testvisualdiff.json +12 -0
- package/fixtures/workflows/changelog-digest-workflow.json +13 -0
- package/fixtures/workflows/form-survey-workflow.json +13 -0
- package/gallery.json +706 -0
- package/hardening.d.ts.map +1 -0
- package/hardening.js +188 -0
- package/headless.d.ts.map +1 -0
- package/headless.js +11522 -0
- package/http.d.ts.map +1 -0
- package/http.js +2165 -0
- package/index.cjs +54682 -0
- package/index.d.ts.map +1 -0
- package/index.js +52310 -0
- package/index.neutral.js +46343 -0
- package/{web/manifest.json → manifest.json} +1 -1
- package/mcp.d.ts.map +1 -0
- package/mcp.js +20515 -0
- package/memory.d.ts.map +1 -0
- package/{memory.ts → memory.js} +2310 -3834
- package/nativehost.template.json +10 -0
- package/node.cjs +54686 -0
- package/node.d.ts.map +1 -0
- package/pack.d.ts.map +1 -0
- package/pack.js +805 -0
- package/package.json +83 -176
- package/policy.d.ts.map +1 -0
- package/{policy.ts → policy.js} +4679 -5073
- package/progress.d.ts.map +1 -0
- package/progress.js +645 -0
- package/protocol.d.ts.map +1 -0
- package/protocol.js +8334 -0
- package/schemas/audit.schema.json +226 -0
- package/schemas/capability.schema.json +113 -0
- package/schemas/envelope.schema.json +162 -0
- package/schemas/memory.schema.json +51 -0
- package/schemas/observation.schema.json +113 -0
- package/schemas/plan.schema.json +208 -0
- package/schemas/progress.schema.json +126 -0
- package/schemas/proposal.schema.json +68 -0
- package/schemas/session.schema.json +82 -0
- package/schemas/tool.schema.json +94 -0
- package/server.d.ts.map +1 -0
- package/server.js +28877 -0
- package/umd-example.html +18 -0
- package/umd.d.ts.map +1 -0
- package/accounts.ts +0 -2087
- package/agent.ts +0 -2331
- package/antigravity.ts +0 -2139
- package/apifreeze.ts +0 -4146
- package/auth.ts +0 -642
- package/background.ts +0 -16837
- package/bridge.ts +0 -2080
- package/build.ts +0 -54
- package/bun.ts +0 -26
- package/capture.ts +0 -1614
- package/checksecrets.ts +0 -72
- package/cjs.ts +0 -9
- package/cli.ts +0 -3500
- package/commands.ts +0 -1101
- package/companion.ts +0 -450
- package/compatibility.ts +0 -37
- package/config.ts +0 -3137
- package/constants.ts +0 -943
- package/core.ts +0 -1473
- package/crossbrowser.ts +0 -1359
- package/dashdone.ts +0 -605
- package/data.ts +0 -943
- package/database.ts +0 -133
- package/debug.ts +0 -850
- package/deno.ts +0 -27
- package/devthink.ts +0 -707
- package/dist/accounts.d.ts +0 -409
- package/dist/agent.d.ts +0 -837
- package/dist/antigravity.d.ts +0 -380
- package/dist/apifreeze.d.ts +0 -113
- package/dist/auth.d.ts +0 -224
- package/dist/capture.d.ts +0 -595
- package/dist/cjs.d.ts +0 -6
- package/dist/commands.d.ts +0 -310
- package/dist/compatibility.d.ts +0 -17
- package/dist/config.d.ts +0 -1853
- package/dist/constants.d.ts +0 -637
- package/dist/core.d.ts +0 -361
- package/dist/data.d.ts +0 -330
- package/dist/database.d.ts +0 -24
- package/dist/debug.d.ts +0 -270
- package/dist/engine.d.ts +0 -74
- package/dist/environments.d.ts +0 -244
- package/dist/evidence.d.ts +0 -277
- package/dist/export.d.ts +0 -311
- package/dist/fingerprint.d.ts +0 -594
- package/dist/flow.d.ts +0 -300
- package/dist/gates.d.ts +0 -103
- package/dist/identity.d.ts +0 -51
- package/dist/ids.d.ts +0 -7
- package/dist/llm.d.ts +0 -652
- package/dist/models.d.ts +0 -1807
- package/dist/net.d.ts +0 -325
- package/dist/neutral.d.ts +0 -41
- package/dist/oauth.d.ts +0 -703
- package/dist/page.d.ts +0 -1166
- package/dist/perf.d.ts +0 -481
- package/dist/plan.d.ts +0 -134
- package/dist/project.d.ts +0 -395
- package/dist/providers.d.ts +0 -37
- package/dist/quota.d.ts +0 -453
- package/dist/recovery.d.ts +0 -621
- package/dist/request.d.ts +0 -1492
- package/dist/run.d.ts +0 -779
- package/dist/runtime.d.ts +0 -212
- package/dist/search.d.ts +0 -375
- package/dist/security.d.ts +0 -534
- package/dist/serve.d.ts +0 -136
- package/dist/session.d.ts +0 -296
- package/dist/storage.d.ts +0 -53
- package/dist/streaming.d.ts +0 -1119
- package/dist/swarm.d.ts +0 -328
- package/dist/tools.d.ts +0 -170
- package/dist/types.d.ts +0 -8357
- package/dist/utils.d.ts +0 -82
- package/dist/version.d.ts +0 -7
- package/dist/versionregistry.d.ts +0 -406
- package/dist/views.d.ts +0 -579
- package/dist/workbenchsession.d.ts +0 -69
- package/dist/workflow.d.ts +0 -649
- package/docs/readme.md +0 -92
- package/docs/schemas/antigravity.json +0 -192
- package/engine.ts +0 -1524
- package/environments.ts +0 -1005
- package/evidence.ts +0 -643
- package/export.ts +0 -889
- package/fingerprint.ts +0 -1458
- package/flow.ts +0 -1190
- package/gates.ts +0 -307
- package/gateway.ts +0 -34
- package/hardening.ts +0 -191
- package/headless.ts +0 -369
- package/http.ts +0 -2110
- package/identity.ts +0 -246
- package/ids.ts +0 -26
- package/index.ts +0 -369
- package/llm.ts +0 -2682
- package/mcp.ts +0 -1835
- package/models.ts +0 -3805
- package/modes.ts +0 -43
- package/net.ts +0 -1214
- package/neutral.ts +0 -362
- package/node.ts +0 -26
- package/oauth.ts +0 -2216
- package/offscreen.ts +0 -170
- package/pack.ts +0 -956
- package/page.ts +0 -7824
- package/pagebridge.ts +0 -1116
- package/perf.ts +0 -957
- package/plan.ts +0 -672
- package/plugin.ts +0 -76
- package/prisma.config.ts +0 -27
- package/progress.ts +0 -1308
- package/project.ts +0 -1291
- package/protocol.ts +0 -4187
- package/providers.ts +0 -246
- package/quota.ts +0 -1887
- package/recovery.ts +0 -2433
- package/request.ts +0 -4482
- package/run.ts +0 -2135
- package/runtime.ts +0 -526
- package/search.ts +0 -1760
- package/security.ts +0 -1673
- package/serve.ts +0 -419
- package/server.ts +0 -5538
- package/session.ts +0 -1162
- package/storage.ts +0 -182
- package/streaming.ts +0 -4101
- package/swarm.ts +0 -884
- package/sync.ts +0 -56
- package/tests/agentcert.test.ts +0 -128
- package/tests/agentfleet.test.ts +0 -214
- package/tests/agentreview.test.ts +0 -241
- package/tests/agentstream.test.ts +0 -335
- package/tests/agentwork.test.ts +0 -356
- package/tests/apifreeze.test.ts +0 -290
- package/tests/apimap.test.ts +0 -112
- package/tests/approvalgate.test.ts +0 -175
- package/tests/artifactmanifest.test.ts +0 -204
- package/tests/attentionfeed.test.ts +0 -163
- package/tests/backgroundruns.test.ts +0 -100
- package/tests/batchscheduling.test.ts +0 -131
- package/tests/blackboard.test.ts +0 -238
- package/tests/bridge.test.ts +0 -1088
- package/tests/browsercoverage.test.ts +0 -134
- package/tests/browserpolyfills.test.ts +0 -124
- package/tests/build.mjs +0 -1260
- package/tests/clientauth.test.ts +0 -223
- package/tests/clitools.test.ts +0 -578
- package/tests/confirmgates.test.ts +0 -190
- package/tests/containerpack.test.ts +0 -143
- package/tests/controlflow.test.ts +0 -2120
- package/tests/coordination.test.ts +0 -345
- package/tests/copyscreen.test.ts +0 -139
- package/tests/core.test.ts +0 -417
- package/tests/costcert.test.ts +0 -95
- package/tests/crossbrowser.test.ts +0 -115
- package/tests/cspaudit.test.ts +0 -79
- package/tests/dashdone.test.ts +0 -615
- package/tests/datagrid.test.ts +0 -137
- package/tests/doccheck.test.ts +0 -107
- package/tests/dombatch.test.ts +0 -109
- package/tests/emulation.test.ts +0 -282
- package/tests/environments.test.ts +0 -259
- package/tests/evidenceviews.test.ts +0 -88
- package/tests/exporttools.test.ts +0 -185
- package/tests/firefoxprep.test.ts +0 -134
- package/tests/flowlibrary.test.ts +0 -242
- package/tests/flowrun.test.ts +0 -303
- package/tests/forensics.test.ts +0 -439
- package/tests/gateway.test.ts +0 -939
- package/tests/headlesslib.test.ts +0 -171
- package/tests/httpstream.test.ts +0 -277
- package/tests/immutablelog.test.ts +0 -157
- package/tests/inboundguard.test.ts +0 -177
- package/tests/lazyload.test.ts +0 -72
- package/tests/librarymodes.test.ts +0 -623
- package/tests/llm.test.ts +0 -696
- package/tests/manifest.test.ts +0 -226
- package/tests/maskinputs.test.ts +0 -150
- package/tests/matrixverify.test.ts +0 -111
- package/tests/mavenpack.test.ts +0 -75
- package/tests/mcpserver.test.ts +0 -704
- package/tests/memory.test.ts +0 -4155
- package/tests/memorycare.test.ts +0 -230
- package/tests/migrateplan.test.ts +0 -349
- package/tests/minimization.test.ts +0 -414
- package/tests/modelroute.test.ts +0 -112
- package/tests/multiagent.test.ts +0 -440
- package/tests/nativebridge.test.ts +0 -807
- package/tests/navigation.test.ts +0 -284
- package/tests/nugetpack.test.ts +0 -83
- package/tests/orchestration.test.ts +0 -449
- package/tests/originpolicy.test.ts +0 -405
- package/tests/outputcompare.test.ts +0 -97
- package/tests/package.test.ts +0 -91
- package/tests/pagebridge.test.ts +0 -5909
- package/tests/pentest.test.ts +0 -75
- package/tests/perfrecords.test.ts +0 -257
- package/tests/permdiff.test.ts +0 -85
- package/tests/phishguard.test.ts +0 -128
- package/tests/pickerviews.test.ts +0 -155
- package/tests/pipelines.test.ts +0 -381
- package/tests/planlint.test.ts +0 -240
- package/tests/planreview.test.ts +0 -383
- package/tests/platformtargets.test.ts +0 -56
- package/tests/policy.test.ts +0 -8284
- package/tests/portability.test.ts +0 -96
- package/tests/progress.test.ts +0 -1036
- package/tests/promptlibrary.test.ts +0 -116
- package/tests/protocol.test.ts +0 -4793
- package/tests/publishingpipeline.test.ts +0 -314
- package/tests/quickactions.test.ts +0 -164
- package/tests/readiness.test.ts +0 -78
- package/tests/recipes.test.ts +0 -163
- package/tests/redactshots.test.ts +0 -216
- package/tests/registernvidiakeys.ts +0 -51
- package/tests/relayserve.test.ts +0 -304
- package/tests/releasenotes.test.ts +0 -276
- package/tests/resilience.test.ts +0 -467
- package/tests/resourceaware.test.ts +0 -187
- package/tests/runbudget.test.ts +0 -125
- package/tests/runhistory.test.ts +0 -299
- package/tests/runreplay.test.ts +0 -113
- package/tests/runresume.test.ts +0 -184
- package/tests/runstate.test.ts +0 -288
- package/tests/runtimeadapters.test.ts +0 -251
- package/tests/safariskeleton.test.ts +0 -115
- package/tests/sandboxframe.test.ts +0 -196
- package/tests/sbom.test.ts +0 -105
- package/tests/secretvault.test.ts +0 -188
- package/tests/selcache.test.ts +0 -111
- package/tests/sessioninterface.test.ts +0 -791
- package/tests/sessions.test.ts +0 -591
- package/tests/siteprefs.test.ts +0 -228
- package/tests/snapshotdelta.test.ts +0 -165
- package/tests/statusviews.test.ts +0 -237
- package/tests/stepmeter.test.ts +0 -200
- package/tests/streamparse.test.ts +0 -163
- package/tests/stylepruning.test.ts +0 -90
- package/tests/surfaces.test.ts +0 -282
- package/tests/sweep.test.ts +0 -78
- package/tests/syncbridge.test.ts +0 -164
- package/tests/taskqueue.test.ts +0 -206
- package/tests/toolcalls.test.ts +0 -336
- package/tests/toolcatalog.test.ts +0 -201
- package/tests/torture-agent.test.ts +0 -706
- package/tests/torture-auth.test.ts +0 -461
- package/tests/torture-commands.test.ts +0 -895
- package/tests/torture-data.test.ts +0 -923
- package/tests/torture-environments.test.ts +0 -285
- package/tests/torture-export.test.ts +0 -263
- package/tests/torture-http.test.ts +0 -1379
- package/tests/torture-llm.test.ts +0 -808
- package/tests/torture-memory.test.ts +0 -1084
- package/tests/torture-plan.test.ts +0 -829
- package/tests/torture-run.test.ts +0 -626
- package/tests/torture-session.test.ts +0 -928
- package/tests/torture-swarm.test.ts +0 -1245
- package/tests/torture-tools.test.ts +0 -964
- package/tests/torture-workflow.test.ts +0 -2354
- package/tests/tourviews.test.ts +0 -52
- package/tests/transparency.test.ts +0 -147
- package/tests/trigger.test.ts +0 -941
- package/tests/v1sunset.test.ts +0 -428
- package/tests/virtlist.test.ts +0 -94
- package/tests/vision.test.ts +0 -540
- package/tests/vsixpack.test.ts +0 -145
- package/tests/webapi.test.ts +0 -523
- package/tests/workflow.test.ts +0 -1785
- package/tests/workfloweditor.test.ts +0 -759
- package/tests/xpipack.test.ts +0 -128
- package/tools.ts +0 -734
- package/types.ts +0 -9908
- package/umd.ts +0 -9
- package/utils.ts +0 -249
- package/version.ts +0 -8
- package/versionregistry.ts +0 -1310
- package/views.ts +0 -2153
- package/vitest.config.ts +0 -12
- package/web/App.tsx +0 -78
- package/web/README.md +0 -47
- package/web/capacitor.config.ts +0 -46
- package/web/const.ts +0 -19
- package/web/control.shell.tsx +0 -66
- package/web/dashboardpage.ts +0 -554
- package/web/db.ts +0 -493
- package/web/design.html +0 -541
- package/web/gatewayview/Gateway.tsx +0 -345
- package/web/gatewayview/config.ts +0 -1042
- package/web/gatewayview/definition.ts +0 -174
- package/web/icons.ts +0 -15
- package/web/optionspage.ts +0 -691
- package/web/popup.ts +0 -1651
- package/web/schema.prisma +0 -176
- package/web/sidepanel.ts +0 -7941
- package/web/sitemanifest.json +0 -13
- package/web/terminal-ui.tsx +0 -622
- package/web/transparencypage.ts +0 -541
- package/web/vite.config.ts +0 -39
- package/web/workspace.ts +0 -23
- package/workbenchmemory.ts +0 -104
- package/workbenchsession.ts +0 -304
- package/workflow.ts +0 -4495
- /package/{dist/bun.d.ts → bun.d.ts} +0 -0
- /package/{dist/cli.d.ts → cli.d.ts} +0 -0
- /package/{dist/companion.d.ts → companion.d.ts} +0 -0
- /package/{dist/crossbrowser.d.ts → crossbrowser.d.ts} +0 -0
- /package/{dist/dashdone.d.ts → dashdone.d.ts} +0 -0
- /package/{dist/deno.d.ts → deno.d.ts} +0 -0
- /package/{dist/hardening.d.ts → hardening.d.ts} +0 -0
- /package/{dist/headless.d.ts → headless.d.ts} +0 -0
- /package/{dist/http.d.ts → http.d.ts} +0 -0
- /package/{dist/index.d.ts → index.d.ts} +0 -0
- /package/{dist/mcp.d.ts → mcp.d.ts} +0 -0
- /package/{dist/memory.d.ts → memory.d.ts} +0 -0
- /package/{dist/node.d.ts → node.d.ts} +0 -0
- /package/{dist/pack.d.ts → pack.d.ts} +0 -0
- /package/{dist/policy.d.ts → policy.d.ts} +0 -0
- /package/{dist/progress.d.ts → progress.d.ts} +0 -0
- /package/{dist/protocol.d.ts → protocol.d.ts} +0 -0
- /package/{dist/server.d.ts → server.d.ts} +0 -0
- /package/{dist/umd.d.ts → umd.d.ts} +0 -0
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "vitest";
|
|
2
|
-
import {
|
|
3
|
-
credspayload,
|
|
4
|
-
deletepayload,
|
|
5
|
-
gateforstep,
|
|
6
|
-
gatekindfor,
|
|
7
|
-
gateprompttext,
|
|
8
|
-
gatestateof,
|
|
9
|
-
nobatchresolution,
|
|
10
|
-
opengate,
|
|
11
|
-
paypayload,
|
|
12
|
-
resolvegate,
|
|
13
|
-
} from "../gates.js";
|
|
14
|
-
|
|
15
|
-
const now = 1_800_000_000_000;
|
|
16
|
-
|
|
17
|
-
describe("confirmgates", () => {
|
|
18
|
-
it("maps the sensitive classes to their gated families", () => {
|
|
19
|
-
expect(gatekindfor(["payment"])).toBe("confirmpay");
|
|
20
|
-
expect(gatekindfor(["delete"])).toBe("confirmdelete");
|
|
21
|
-
expect(gatekindfor(["credential"])).toBe("confirmcreds");
|
|
22
|
-
expect(gatekindfor(["publish"])).toBeUndefined();
|
|
23
|
-
expect(gatekindfor([])).toBeUndefined();
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
it("shows the amount, payee origin and target element on confirmpay gates", () => {
|
|
27
|
-
const payload = paypayload({ amount: "49.90", payeeorigin: "https://shop.example", target: "#pay" });
|
|
28
|
-
expect(payload).toEqual({ amount: "49.90", payeeorigin: "https://shop.example", target: "#pay" });
|
|
29
|
-
const minimal = paypayload({ payeeorigin: "https://shop.example" });
|
|
30
|
-
expect(minimal).toEqual({ payeeorigin: "https://shop.example" });
|
|
31
|
-
const gate = opengate({
|
|
32
|
-
kind: "confirmpay",
|
|
33
|
-
stepid: "step",
|
|
34
|
-
runid: "run",
|
|
35
|
-
origin: "https://shop.example",
|
|
36
|
-
payload,
|
|
37
|
-
now,
|
|
38
|
-
});
|
|
39
|
-
expect(gate.state).toBe("open");
|
|
40
|
-
expect(gateprompttext(gate)).toMatch(/49\.90/);
|
|
41
|
-
expect(gateprompttext(gate)).toMatch(/https:\/\/shop\.example/);
|
|
42
|
-
expect(gateprompttext(gate)).toMatch(/distinct human action/);
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
it("shows the target, scope and irreversibility on confirmdelete gates", () => {
|
|
46
|
-
const gate = opengate({
|
|
47
|
-
kind: "confirmdelete",
|
|
48
|
-
stepid: "step",
|
|
49
|
-
runid: "run",
|
|
50
|
-
origin: "https://shop.example",
|
|
51
|
-
payload: deletepayload({
|
|
52
|
-
target: "#orders",
|
|
53
|
-
scope: "the order history",
|
|
54
|
-
irreversibility: "The deletion destroys the order history the site cannot restore.",
|
|
55
|
-
}),
|
|
56
|
-
now,
|
|
57
|
-
});
|
|
58
|
-
expect(gateprompttext(gate)).toMatch(/#orders/);
|
|
59
|
-
expect(gateprompttext(gate)).toMatch(/order history/);
|
|
60
|
-
expect(gateprompttext(gate)).toMatch(/cannot restore/);
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
it("shows the credential label only on confirmcreds gates and never the value", () => {
|
|
64
|
-
const payload = credspayload("Bank login");
|
|
65
|
-
expect(payload).toEqual({ label: "Bank login" });
|
|
66
|
-
expect(() => credspayload(" ")).toThrow(/label/);
|
|
67
|
-
const gate = opengate({
|
|
68
|
-
kind: "confirmcreds",
|
|
69
|
-
stepid: "step",
|
|
70
|
-
runid: "run",
|
|
71
|
-
origin: "https://bank.example",
|
|
72
|
-
payload,
|
|
73
|
-
now,
|
|
74
|
-
});
|
|
75
|
-
expect(gateprompttext(gate)).toMatch(/Bank login/);
|
|
76
|
-
expect(gateprompttext(gate)).toMatch(/value stays behind the vault/);
|
|
77
|
-
expect(gateprompttext(gate)).not.toMatch(/hunter2/);
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
it("resolves exactly one open gate through one explicit human action and stays terminal", () => {
|
|
81
|
-
const gate = opengate({
|
|
82
|
-
kind: "confirmpay",
|
|
83
|
-
stepid: "step",
|
|
84
|
-
runid: "run",
|
|
85
|
-
origin: "https://shop.example",
|
|
86
|
-
payload: paypayload({ payeeorigin: "https://shop.example" }),
|
|
87
|
-
now,
|
|
88
|
-
});
|
|
89
|
-
const resolved = resolvegate({
|
|
90
|
-
gates: [gate],
|
|
91
|
-
gateid: gate.gateid,
|
|
92
|
-
decision: "resolved",
|
|
93
|
-
actor: "user",
|
|
94
|
-
now: now + 1200,
|
|
95
|
-
});
|
|
96
|
-
expect(resolved.resolution?.decision).toBe("resolved");
|
|
97
|
-
expect(resolved.resolution?.actor).toBe("user");
|
|
98
|
-
const updated = resolved.gates?.[0];
|
|
99
|
-
expect(updated?.state).toBe("resolved");
|
|
100
|
-
expect(updated?.resolvedat).toBe(now + 1200);
|
|
101
|
-
const again = resolvegate({
|
|
102
|
-
gates: resolved.gates ?? [],
|
|
103
|
-
gateid: gate.gateid,
|
|
104
|
-
decision: "refused",
|
|
105
|
-
actor: "user",
|
|
106
|
-
now: now + 1500,
|
|
107
|
-
});
|
|
108
|
-
expect(again.resolution).toBeUndefined();
|
|
109
|
-
expect(again.gates?.[0]?.state).toBe("resolved");
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
it("refuses resolutions without an acting user and batch approvals", () => {
|
|
113
|
-
const gate = opengate({
|
|
114
|
-
kind: "confirmdelete",
|
|
115
|
-
stepid: "step",
|
|
116
|
-
runid: "run",
|
|
117
|
-
origin: "https://shop.example",
|
|
118
|
-
payload: deletepayload({ scope: "history", irreversibility: "gone" }),
|
|
119
|
-
now,
|
|
120
|
-
});
|
|
121
|
-
expect(() => resolvegate({ gates: [gate], gateid: gate.gateid, decision: "resolved", actor: "", now })).toThrow(
|
|
122
|
-
/acting user/,
|
|
123
|
-
);
|
|
124
|
-
expect(nobatchresolution(["one"]).allowed).toBe(true);
|
|
125
|
-
expect(nobatchresolution(["one", "two"]).allowed).toBe(false);
|
|
126
|
-
expect(nobatchresolution(["one", "two"]).reason).toMatch(/no batch approval/);
|
|
127
|
-
expect(nobatchresolution([]).allowed).toBe(false);
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
it("reads the gate state of one step: none, open, resolved or refused", () => {
|
|
131
|
-
expect(gatestateof([], "step").state).toBe("none");
|
|
132
|
-
const gate = opengate({
|
|
133
|
-
kind: "confirmpay",
|
|
134
|
-
stepid: "step",
|
|
135
|
-
runid: "run",
|
|
136
|
-
origin: "https://shop.example",
|
|
137
|
-
payload: paypayload({ payeeorigin: "https://shop.example" }),
|
|
138
|
-
now,
|
|
139
|
-
});
|
|
140
|
-
expect(gatestateof([gate], "step").state).toBe("open");
|
|
141
|
-
const resolved = resolvegate({ gates: [gate], gateid: gate.gateid, decision: "refused", actor: "user", now });
|
|
142
|
-
expect(gatestateof(resolved.gates ?? [], "step").state).toBe("refused");
|
|
143
|
-
expect(gatestateof(resolved.gates ?? [], "other").state).toBe("none");
|
|
144
|
-
});
|
|
145
|
-
|
|
146
|
-
it("builds the gate of one gated step from its reviewed shape", () => {
|
|
147
|
-
const paystep = {
|
|
148
|
-
id: "pay",
|
|
149
|
-
kind: "fillcard" as const,
|
|
150
|
-
target: "#card",
|
|
151
|
-
options: JSON.stringify({ amount: "12.00", payeeorigin: "https://shop.example" }),
|
|
152
|
-
};
|
|
153
|
-
const paygate = gateforstep({
|
|
154
|
-
step: paystep,
|
|
155
|
-
classes: ["payment"],
|
|
156
|
-
runid: "run",
|
|
157
|
-
origin: "https://shop.example",
|
|
158
|
-
now,
|
|
159
|
-
});
|
|
160
|
-
expect(paygate?.kind).toBe("confirmpay");
|
|
161
|
-
expect(paygate?.payload.amount).toBe("12.00");
|
|
162
|
-
expect(paygate?.payload.payeeorigin).toBe("https://shop.example");
|
|
163
|
-
const deletestep = { id: "del", kind: "discardtab" as const, target: "#orders" };
|
|
164
|
-
const deletegate = gateforstep({
|
|
165
|
-
step: deletestep,
|
|
166
|
-
classes: ["delete"],
|
|
167
|
-
runid: "run",
|
|
168
|
-
origin: "https://shop.example",
|
|
169
|
-
now,
|
|
170
|
-
});
|
|
171
|
-
expect(deletegate?.kind).toBe("confirmdelete");
|
|
172
|
-
expect(deletegate?.payload.scope).toBe("https://shop.example");
|
|
173
|
-
const credstep = { id: "cred", kind: "consentpassword" as const, target: "#login" };
|
|
174
|
-
const credgate = gateforstep({
|
|
175
|
-
step: credstep,
|
|
176
|
-
classes: ["credential"],
|
|
177
|
-
runid: "run",
|
|
178
|
-
origin: "https://bank.example",
|
|
179
|
-
credentiallabel: "Bank login",
|
|
180
|
-
now,
|
|
181
|
-
});
|
|
182
|
-
expect(credgate?.payload).toEqual({ label: "Bank login" });
|
|
183
|
-
expect(
|
|
184
|
-
gateforstep({ step: credstep, classes: ["credential"], runid: "run", origin: "https://bank.example", now }),
|
|
185
|
-
).toBeUndefined();
|
|
186
|
-
expect(
|
|
187
|
-
gateforstep({ step: paystep, classes: ["publish"], runid: "run", origin: "https://shop.example", now }),
|
|
188
|
-
).toBeUndefined();
|
|
189
|
-
});
|
|
190
|
-
});
|
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
import { access, constants, readFile } from "node:fs/promises";
|
|
2
|
-
import { describe, expect, it } from "vitest";
|
|
3
|
-
import { containerexposedsurfaces, containerrunnerentry } from "../pack.js";
|
|
4
|
-
|
|
5
|
-
describe("containerpack", () => {
|
|
6
|
-
it("keeps THE Dockerfile and retires the compose stack and every second container script", async () => {
|
|
7
|
-
const dockerfile = await readFile("Dockerfile", "utf8");
|
|
8
|
-
expect(dockerfile.length).toBeGreaterThan(0);
|
|
9
|
-
await expect(access("compose.yml", constants.F_OK)).rejects.toThrow();
|
|
10
|
-
await expect(access("containerfile", constants.F_OK)).rejects.toThrow();
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
it("builds the multi stage image with the dependency layer, the validated builder, the lean runtime and the folded binary target", async () => {
|
|
14
|
-
const dockerfile = await readFile("Dockerfile", "utf8");
|
|
15
|
-
/* the build stages pin to the native build platform (the saddle
|
|
16
|
-
container doctrine: the toolchain installs native and the library build
|
|
17
|
-
runs at native speed — the prisma dmmf json corrupts under the qemu
|
|
18
|
-
emulation of the emulated legs) while the runtime stages stay per leg. */
|
|
19
|
-
expect(dockerfile).toContain("FROM --platform=$BUILDPLATFORM ${NODE_IMAGE} AS deps");
|
|
20
|
-
expect(dockerfile).toContain("FROM --platform=$BUILDPLATFORM ${NODE_IMAGE} AS builder");
|
|
21
|
-
expect(dockerfile).toContain("COPY --from=builder /work /work");
|
|
22
|
-
expect(dockerfile).toContain("FROM --platform=$BUILDPLATFORM ${NODE_IMAGE} AS binary-builder");
|
|
23
|
-
expect(dockerfile).toContain("FROM gcr.io/distroless/cc-debian12:nonroot AS binary-runtime");
|
|
24
|
-
/* the runtime base is its own arg: the four-arch family surface rides
|
|
25
|
-
the trixie slim line (the only 26.8.x tag whose manifest answers amd64,
|
|
26
|
-
arm64, ppc64le and s390x) while the build stages keep the toolchain
|
|
27
|
-
line pinned to the engines floor. */
|
|
28
|
-
expect(dockerfile).toContain('ARG NODE_RUNTIME_IMAGE="node:26.8.1-trixie-slim"');
|
|
29
|
-
expect(dockerfile).toContain("FROM ${NODE_RUNTIME_IMAGE} AS runtime");
|
|
30
|
-
/* the runner stage closes the file: it stays the default build target
|
|
31
|
-
(a plain docker build and the publish lanes build the runner image, the
|
|
32
|
-
single-binary surface stays behind its own --target) */
|
|
33
|
-
const fromLines = [...dockerfile.matchAll(/^FROM .*$/gm)].map((match) => match[0]);
|
|
34
|
-
expect(fromLines.at(-1)).toBe("FROM ${NODE_RUNTIME_IMAGE} AS runtime");
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
it("resolves the compiled binary target from TARGETARCH so the arm64 image never carries an x64 binary", async () => {
|
|
38
|
-
const dockerfile = await readFile("Dockerfile", "utf8");
|
|
39
|
-
expect(dockerfile).toContain("ARG TARGETARCH");
|
|
40
|
-
expect(dockerfile).toContain('arm64|aarch64) buntarget="bun-linux-arm64"');
|
|
41
|
-
expect(dockerfile).toContain('buntarget="bun-linux-x64"');
|
|
42
|
-
expect(dockerfile).not.toContain("--target=bun-linux-x64");
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
it("runs the library build and the deterministic build checks in the builder before the runtime ships", async () => {
|
|
46
|
-
const dockerfile = await readFile("Dockerfile", "utf8");
|
|
47
|
-
expect(dockerfile).toContain("RUN node tests/build.mjs");
|
|
48
|
-
expect(dockerfile).toContain("RUN node dist/cli.js manifest");
|
|
49
|
-
expect(dockerfile).toContain(
|
|
50
|
-
"RUN node dist/cli.js headless dist/fixtures/plans/release-notes-plan.json --fixtures dist/fixtures",
|
|
51
|
-
);
|
|
52
|
-
expect(dockerfile).toContain("RUN node tests/nativesmoke.mjs");
|
|
53
|
-
expect(dockerfile).toContain("RUN node tests/packageextension.mjs");
|
|
54
|
-
expect(dockerfile).toContain("web/manifest.json");
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
it("runs the vitest suite in the builder with the qemu scaled timeouts before the runtime ships", async () => {
|
|
58
|
-
const dockerfile = await readFile("Dockerfile", "utf8");
|
|
59
|
-
expect(dockerfile).toContain(
|
|
60
|
-
'RUN if [ "$(uname -m)" = "aarch64" ]; then export DEVTHINK_TEST_TIMEOUT_MS=120000 DEVTHINK_TEST_BUDGET_MS=10000; fi',
|
|
61
|
-
);
|
|
62
|
-
const vitestconfig = await readFile("vitest.config.ts", "utf8");
|
|
63
|
-
expect(vitestconfig).toContain("Number(process.env.DEVTHINK_TEST_TIMEOUT_MS ?? 5000)");
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
it("scales the smoke boot budget for the emulated legs so the four-arch build never flakes on qemu", async () => {
|
|
67
|
-
const dockerfile = await readFile("Dockerfile", "utf8");
|
|
68
|
-
expect(dockerfile).toContain("node container.mjs --check & runnerpid=$!");
|
|
69
|
-
expect(dockerfile).toContain("the container runner died during the smoke boot");
|
|
70
|
-
expect(dockerfile).toContain('case "${TARGETARCH}" in ppc64le|s390x) smokebudget=90 ;; esac');
|
|
71
|
-
expect(dockerfile).toContain("the container runner never answered /healthz within ${smokebudget}s");
|
|
72
|
-
expect(dockerfile).toContain('wait "${runnerpid}"');
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
it("exposes the static site, the socket relay and the mcp server behind the operator chosen environment", async () => {
|
|
76
|
-
const dockerfile = await readFile("Dockerfile", "utf8");
|
|
77
|
-
for (const surface of containerexposedsurfaces()) {
|
|
78
|
-
expect(dockerfile).toContain(surface.bindenv);
|
|
79
|
-
expect(dockerfile).toContain(surface.portenv);
|
|
80
|
-
}
|
|
81
|
-
expect(containerrunnerentry()).toBe("node container.mjs");
|
|
82
|
-
expect(dockerfile).toContain("DEVTHINK_RELAY_PATH=/relay");
|
|
83
|
-
expect(dockerfile).toContain("DEVTHINK_MCP_BIND=127.0.0.1");
|
|
84
|
-
expect(dockerfile).toContain("EXPOSE 8080 7436");
|
|
85
|
-
expect(dockerfile).toContain('ENTRYPOINT ["node", "container.mjs"]');
|
|
86
|
-
expect(dockerfile).toContain("COPY --from=builder --chown=10000:10000 /work/dist/site /app/dist/site");
|
|
87
|
-
expect(dockerfile).toContain("COPY --from=builder --chown=10000:10000 /work/dist/cli.js /app/dist/cli.js");
|
|
88
|
-
expect(dockerfile).toContain("COPY --from=builder --chown=10000:10000 /work/dist/http.js /app/dist/http.js");
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
it("absorbs the retired compose behaviors into the one container file", async () => {
|
|
92
|
-
const dockerfile = await readFile("Dockerfile", "utf8");
|
|
93
|
-
for (const flag of [
|
|
94
|
-
"--read-only",
|
|
95
|
-
"--cap-drop ALL",
|
|
96
|
-
"no-new-privileges:true",
|
|
97
|
-
"--pids-limit 512",
|
|
98
|
-
"--network none",
|
|
99
|
-
"--tmpfs /tmp:size=2g,mode=1777",
|
|
100
|
-
]) {
|
|
101
|
-
expect(dockerfile).toContain(flag);
|
|
102
|
-
}
|
|
103
|
-
expect(dockerfile).toContain("DEVTHINK_MEMORY_ENGINE=ram");
|
|
104
|
-
expect(dockerfile).toContain('DEVTHINK_PLATFORM=""');
|
|
105
|
-
expect(dockerfile).toContain('DEVTHINK_CDN_URL=""');
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
it("runs the image as the non root devthink user with a live healthcheck and the OCI labels of the DevThink identity", async () => {
|
|
109
|
-
const dockerfile = await readFile("Dockerfile", "utf8");
|
|
110
|
-
expect(dockerfile).toContain("groupadd --gid 10000 devthink");
|
|
111
|
-
expect(dockerfile).toContain("useradd --uid 10000 --gid 10000");
|
|
112
|
-
expect(dockerfile).toMatch(/HEALTHCHECK --interval=30s --timeout=10s --start-period=15s --retries=3/);
|
|
113
|
-
expect(dockerfile).toContain("/healthz");
|
|
114
|
-
expect(dockerfile).toContain('org.opencontainers.image.version="${DEVTHINK_VERSION}"');
|
|
115
|
-
expect(dockerfile).toContain('org.opencontainers.image.source="https://github.com/wenathlan/devthink"');
|
|
116
|
-
expect(dockerfile).not.toMatch(/:latest\b/);
|
|
117
|
-
});
|
|
118
|
-
|
|
119
|
-
it("publishes the image with version tags only, the registry buildcache and the four architecture family surface", async () => {
|
|
120
|
-
const publish = await readFile(".github/workflows/publishghcr.yml", "utf8");
|
|
121
|
-
expect(publish).not.toContain(":latest");
|
|
122
|
-
expect(publish).toContain("target: runtime");
|
|
123
|
-
expect(publish).toContain("devthink-buildcache");
|
|
124
|
-
expect(publish).toContain("type=gha");
|
|
125
|
-
expect(publish).toContain("mode=max");
|
|
126
|
-
/* the four-arch family union the saddle publish lane established
|
|
127
|
-
(amd64, arm64, ppc64le, s390x) with the qemu pin for the emulated
|
|
128
|
-
legs and the index assertion that fixes the published surface. */
|
|
129
|
-
expect(publish).toContain("platforms: linux/arm64,linux/ppc64le,linux/s390x");
|
|
130
|
-
expect(publish).toContain("platforms: linux/amd64,linux/arm64,linux/ppc64le,linux/s390x");
|
|
131
|
-
expect(publish).toContain('. == ["amd64", "arm64", "ppc64le", "s390x"]');
|
|
132
|
-
expect(publish).toContain("provenance: mode=max");
|
|
133
|
-
expect(publish).toContain("sbom: true");
|
|
134
|
-
expect(publish).toContain("aquasecurity/trivy-action@v0.36.0");
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
it("builds the release container archive from THE Dockerfile", async () => {
|
|
138
|
-
const container = await readFile(".github/workflows/container.yml", "utf8");
|
|
139
|
-
expect(container).toContain("docker build");
|
|
140
|
-
expect(container).toContain("--build-arg DEVTHINK_VERSION=");
|
|
141
|
-
expect(container).toContain("docker save");
|
|
142
|
-
});
|
|
143
|
-
});
|