@aria-cli/tools 1.0.8 → 1.0.10
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/package.json +9 -6
- package/dist-cjs/.tsbuildinfo +0 -1
- package/dist-cjs/ask-user-interaction.d.ts +0 -10
- package/dist-cjs/ask-user-interaction.js +0 -28
- package/dist-cjs/ask-user-interaction.js.map +0 -1
- package/dist-cjs/cache/web-cache.d.ts +0 -52
- package/dist-cjs/cache/web-cache.js +0 -71
- package/dist-cjs/cache/web-cache.js.map +0 -1
- package/dist-cjs/definitions/arion.d.ts +0 -8
- package/dist-cjs/definitions/arion.js +0 -108
- package/dist-cjs/definitions/arion.js.map +0 -1
- package/dist-cjs/definitions/browser/browser.d.ts +0 -2
- package/dist-cjs/definitions/browser/browser.js +0 -422
- package/dist-cjs/definitions/browser/browser.js.map +0 -1
- package/dist-cjs/definitions/browser/index.d.ts +0 -1
- package/dist-cjs/definitions/browser/index.js +0 -9
- package/dist-cjs/definitions/browser/index.js.map +0 -1
- package/dist-cjs/definitions/browser/pw-downloads.d.ts +0 -13
- package/dist-cjs/definitions/browser/pw-downloads.js +0 -118
- package/dist-cjs/definitions/browser/pw-downloads.js.map +0 -1
- package/dist-cjs/definitions/browser/pw-interactions.d.ts +0 -78
- package/dist-cjs/definitions/browser/pw-interactions.js +0 -214
- package/dist-cjs/definitions/browser/pw-interactions.js.map +0 -1
- package/dist-cjs/definitions/browser/pw-responses.d.ts +0 -28
- package/dist-cjs/definitions/browser/pw-responses.js +0 -85
- package/dist-cjs/definitions/browser/pw-responses.js.map +0 -1
- package/dist-cjs/definitions/browser/pw-session.d.ts +0 -65
- package/dist-cjs/definitions/browser/pw-session.js +0 -327
- package/dist-cjs/definitions/browser/pw-session.js.map +0 -1
- package/dist-cjs/definitions/browser/pw-shared.d.ts +0 -22
- package/dist-cjs/definitions/browser/pw-shared.js +0 -73
- package/dist-cjs/definitions/browser/pw-shared.js.map +0 -1
- package/dist-cjs/definitions/browser/pw-snapshot.d.ts +0 -34
- package/dist-cjs/definitions/browser/pw-snapshot.js +0 -308
- package/dist-cjs/definitions/browser/pw-snapshot.js.map +0 -1
- package/dist-cjs/definitions/browser/pw-state.d.ts +0 -22
- package/dist-cjs/definitions/browser/pw-state.js +0 -71
- package/dist-cjs/definitions/browser/pw-state.js.map +0 -1
- package/dist-cjs/definitions/browser/types.d.ts +0 -277
- package/dist-cjs/definitions/browser/types.js +0 -6
- package/dist-cjs/definitions/browser/types.js.map +0 -1
- package/dist-cjs/definitions/code-intelligence.d.ts +0 -8
- package/dist-cjs/definitions/code-intelligence.js +0 -474
- package/dist-cjs/definitions/code-intelligence.js.map +0 -1
- package/dist-cjs/definitions/core.d.ts +0 -47
- package/dist-cjs/definitions/core.js +0 -134
- package/dist-cjs/definitions/core.js.map +0 -1
- package/dist-cjs/definitions/delegation.d.ts +0 -11
- package/dist-cjs/definitions/delegation.js +0 -516
- package/dist-cjs/definitions/delegation.js.map +0 -1
- package/dist-cjs/definitions/deploy.d.ts +0 -15
- package/dist-cjs/definitions/deploy.js +0 -69
- package/dist-cjs/definitions/deploy.js.map +0 -1
- package/dist-cjs/definitions/filesystem.d.ts +0 -9
- package/dist-cjs/definitions/filesystem.js +0 -200
- package/dist-cjs/definitions/filesystem.js.map +0 -1
- package/dist-cjs/definitions/frg.d.ts +0 -3
- package/dist-cjs/definitions/frg.js +0 -67
- package/dist-cjs/definitions/frg.js.map +0 -1
- package/dist-cjs/definitions/index.d.ts +0 -19
- package/dist-cjs/definitions/index.js +0 -44
- package/dist-cjs/definitions/index.js.map +0 -1
- package/dist-cjs/definitions/memory.d.ts +0 -8
- package/dist-cjs/definitions/memory.js +0 -127
- package/dist-cjs/definitions/memory.js.map +0 -1
- package/dist-cjs/definitions/messaging.d.ts +0 -11
- package/dist-cjs/definitions/messaging.js +0 -632
- package/dist-cjs/definitions/messaging.js.map +0 -1
- package/dist-cjs/definitions/meta.d.ts +0 -11
- package/dist-cjs/definitions/meta.js +0 -353
- package/dist-cjs/definitions/meta.js.map +0 -1
- package/dist-cjs/definitions/network.d.ts +0 -11
- package/dist-cjs/definitions/network.js +0 -163
- package/dist-cjs/definitions/network.js.map +0 -1
- package/dist-cjs/definitions/outlook.d.ts +0 -2
- package/dist-cjs/definitions/outlook.js +0 -281
- package/dist-cjs/definitions/outlook.js.map +0 -1
- package/dist-cjs/definitions/patch/apply-patch.d.ts +0 -11
- package/dist-cjs/definitions/patch/apply-patch.js +0 -192
- package/dist-cjs/definitions/patch/apply-patch.js.map +0 -1
- package/dist-cjs/definitions/patch/fuzzy-match.d.ts +0 -10
- package/dist-cjs/definitions/patch/fuzzy-match.js +0 -173
- package/dist-cjs/definitions/patch/fuzzy-match.js.map +0 -1
- package/dist-cjs/definitions/patch/index.d.ts +0 -1
- package/dist-cjs/definitions/patch/index.js +0 -6
- package/dist-cjs/definitions/patch/index.js.map +0 -1
- package/dist-cjs/definitions/patch/patch-parser.d.ts +0 -50
- package/dist-cjs/definitions/patch/patch-parser.js +0 -216
- package/dist-cjs/definitions/patch/patch-parser.js.map +0 -1
- package/dist-cjs/definitions/patch/sandbox-paths.d.ts +0 -18
- package/dist-cjs/definitions/patch/sandbox-paths.js +0 -114
- package/dist-cjs/definitions/patch/sandbox-paths.js.map +0 -1
- package/dist-cjs/definitions/process/index.d.ts +0 -1
- package/dist-cjs/definitions/process/index.js +0 -9
- package/dist-cjs/definitions/process/index.js.map +0 -1
- package/dist-cjs/definitions/process/process-registry.d.ts +0 -67
- package/dist-cjs/definitions/process/process-registry.js +0 -232
- package/dist-cjs/definitions/process/process-registry.js.map +0 -1
- package/dist-cjs/definitions/process/process.d.ts +0 -9
- package/dist-cjs/definitions/process/process.js +0 -390
- package/dist-cjs/definitions/process/process.js.map +0 -1
- package/dist-cjs/definitions/process/pty-keys.d.ts +0 -13
- package/dist-cjs/definitions/process/pty-keys.js +0 -260
- package/dist-cjs/definitions/process/pty-keys.js.map +0 -1
- package/dist-cjs/definitions/process/session-slug.d.ts +0 -1
- package/dist-cjs/definitions/process/session-slug.js +0 -146
- package/dist-cjs/definitions/process/session-slug.js.map +0 -1
- package/dist-cjs/definitions/quip.d.ts +0 -2
- package/dist-cjs/definitions/quip.js +0 -199
- package/dist-cjs/definitions/quip.js.map +0 -1
- package/dist-cjs/definitions/search.d.ts +0 -9
- package/dist-cjs/definitions/search.js +0 -64
- package/dist-cjs/definitions/search.js.map +0 -1
- package/dist-cjs/definitions/session-history.d.ts +0 -11
- package/dist-cjs/definitions/session-history.js +0 -73
- package/dist-cjs/definitions/session-history.js.map +0 -1
- package/dist-cjs/definitions/shell.d.ts +0 -8
- package/dist-cjs/definitions/shell.js +0 -185
- package/dist-cjs/definitions/shell.js.map +0 -1
- package/dist-cjs/definitions/slack.d.ts +0 -2
- package/dist-cjs/definitions/slack.js +0 -184
- package/dist-cjs/definitions/slack.js.map +0 -1
- package/dist-cjs/definitions/web.d.ts +0 -8
- package/dist-cjs/definitions/web.js +0 -113
- package/dist-cjs/definitions/web.js.map +0 -1
- package/dist-cjs/executors/apply-patch.d.ts +0 -51
- package/dist-cjs/executors/apply-patch.js +0 -939
- package/dist-cjs/executors/apply-patch.js.map +0 -1
- package/dist-cjs/executors/arion.d.ts +0 -50
- package/dist-cjs/executors/arion.js +0 -126
- package/dist-cjs/executors/arion.js.map +0 -1
- package/dist-cjs/executors/code-intelligence.d.ts +0 -138
- package/dist-cjs/executors/code-intelligence.js +0 -926
- package/dist-cjs/executors/code-intelligence.js.map +0 -1
- package/dist-cjs/executors/deploy.d.ts +0 -169
- package/dist-cjs/executors/deploy.js +0 -870
- package/dist-cjs/executors/deploy.js.map +0 -1
- package/dist-cjs/executors/filesystem.d.ts +0 -150
- package/dist-cjs/executors/filesystem.js +0 -1168
- package/dist-cjs/executors/filesystem.js.map +0 -1
- package/dist-cjs/executors/frg-freshness.d.ts +0 -93
- package/dist-cjs/executors/frg-freshness.js +0 -628
- package/dist-cjs/executors/frg-freshness.js.map +0 -1
- package/dist-cjs/executors/frg.d.ts +0 -27
- package/dist-cjs/executors/frg.js +0 -335
- package/dist-cjs/executors/frg.js.map +0 -1
- package/dist-cjs/executors/index.d.ts +0 -44
- package/dist-cjs/executors/index.js +0 -144
- package/dist-cjs/executors/index.js.map +0 -1
- package/dist-cjs/executors/learning-meta.d.ts +0 -87
- package/dist-cjs/executors/learning-meta.js +0 -1166
- package/dist-cjs/executors/learning-meta.js.map +0 -1
- package/dist-cjs/executors/lsp-client.d.ts +0 -38
- package/dist-cjs/executors/lsp-client.js +0 -311
- package/dist-cjs/executors/lsp-client.js.map +0 -1
- package/dist-cjs/executors/memory.d.ts +0 -203
- package/dist-cjs/executors/memory.js +0 -797
- package/dist-cjs/executors/memory.js.map +0 -1
- package/dist-cjs/executors/meta.d.ts +0 -73
- package/dist-cjs/executors/meta.js +0 -227
- package/dist-cjs/executors/meta.js.map +0 -1
- package/dist-cjs/executors/process-registry.d.ts +0 -98
- package/dist-cjs/executors/process-registry.js +0 -470
- package/dist-cjs/executors/process-registry.js.map +0 -1
- package/dist-cjs/executors/pty-session-store.d.ts +0 -14
- package/dist-cjs/executors/pty-session-store.js +0 -35
- package/dist-cjs/executors/pty-session-store.js.map +0 -1
- package/dist-cjs/executors/pty.d.ts +0 -133
- package/dist-cjs/executors/pty.js +0 -313
- package/dist-cjs/executors/pty.js.map +0 -1
- package/dist-cjs/executors/restart.d.ts +0 -13
- package/dist-cjs/executors/restart.js +0 -156
- package/dist-cjs/executors/restart.js.map +0 -1
- package/dist-cjs/executors/search-freshness.d.ts +0 -50
- package/dist-cjs/executors/search-freshness.js +0 -235
- package/dist-cjs/executors/search-freshness.js.map +0 -1
- package/dist-cjs/executors/search-types.d.ts +0 -52
- package/dist-cjs/executors/search-types.js +0 -57
- package/dist-cjs/executors/search-types.js.map +0 -1
- package/dist-cjs/executors/search.d.ts +0 -11
- package/dist-cjs/executors/search.js +0 -103
- package/dist-cjs/executors/search.js.map +0 -1
- package/dist-cjs/executors/self-diagnose.d.ts +0 -89
- package/dist-cjs/executors/self-diagnose.js +0 -435
- package/dist-cjs/executors/self-diagnose.js.map +0 -1
- package/dist-cjs/executors/session-history.d.ts +0 -75
- package/dist-cjs/executors/session-history.js +0 -321
- package/dist-cjs/executors/session-history.js.map +0 -1
- package/dist-cjs/executors/shell-safety.d.ts +0 -27
- package/dist-cjs/executors/shell-safety.js +0 -479
- package/dist-cjs/executors/shell-safety.js.map +0 -1
- package/dist-cjs/executors/shell.d.ts +0 -168
- package/dist-cjs/executors/shell.js +0 -1002
- package/dist-cjs/executors/shell.js.map +0 -1
- package/dist-cjs/executors/utils.d.ts +0 -20
- package/dist-cjs/executors/utils.js +0 -74
- package/dist-cjs/executors/utils.js.map +0 -1
- package/dist-cjs/executors/web.d.ts +0 -89
- package/dist-cjs/executors/web.js +0 -548
- package/dist-cjs/executors/web.js.map +0 -1
- package/dist-cjs/extraction/content-extraction.d.ts +0 -48
- package/dist-cjs/extraction/content-extraction.js +0 -244
- package/dist-cjs/extraction/content-extraction.js.map +0 -1
- package/dist-cjs/extraction/index.d.ts +0 -4
- package/dist-cjs/extraction/index.js +0 -9
- package/dist-cjs/extraction/index.js.map +0 -1
- package/dist-cjs/headless-control-contract.d.ts +0 -3182
- package/dist-cjs/headless-control-contract.js +0 -973
- package/dist-cjs/headless-control-contract.js.map +0 -1
- package/dist-cjs/index.d.ts +0 -62
- package/dist-cjs/index.js +0 -438
- package/dist-cjs/index.js.map +0 -1
- package/dist-cjs/local-control-http-auth.d.ts +0 -2
- package/dist-cjs/local-control-http-auth.js +0 -6
- package/dist-cjs/local-control-http-auth.js.map +0 -1
- package/dist-cjs/mcp/client.d.ts +0 -68
- package/dist-cjs/mcp/client.js +0 -186
- package/dist-cjs/mcp/client.js.map +0 -1
- package/dist-cjs/mcp/connection.d.ts +0 -54
- package/dist-cjs/mcp/connection.js +0 -485
- package/dist-cjs/mcp/connection.js.map +0 -1
- package/dist-cjs/mcp/index.d.ts +0 -10
- package/dist-cjs/mcp/index.js +0 -31
- package/dist-cjs/mcp/index.js.map +0 -1
- package/dist-cjs/mcp/jsonrpc.d.ts +0 -36
- package/dist-cjs/mcp/jsonrpc.js +0 -149
- package/dist-cjs/mcp/jsonrpc.js.map +0 -1
- package/dist-cjs/mcp/types.d.ts +0 -178
- package/dist-cjs/mcp/types.js +0 -9
- package/dist-cjs/mcp/types.js.map +0 -1
- package/dist-cjs/network-control-adapter.d.ts +0 -4
- package/dist-cjs/network-control-adapter.js +0 -78
- package/dist-cjs/network-control-adapter.js.map +0 -1
- package/dist-cjs/network-runtime/address-types.d.ts +0 -201
- package/dist-cjs/network-runtime/address-types.js +0 -169
- package/dist-cjs/network-runtime/address-types.js.map +0 -1
- package/dist-cjs/network-runtime/db-owner-fencing.d.ts +0 -43
- package/dist-cjs/network-runtime/db-owner-fencing.js +0 -77
- package/dist-cjs/network-runtime/db-owner-fencing.js.map +0 -1
- package/dist-cjs/network-runtime/delivery-receipts.d.ts +0 -117
- package/dist-cjs/network-runtime/delivery-receipts.js +0 -277
- package/dist-cjs/network-runtime/delivery-receipts.js.map +0 -1
- package/dist-cjs/network-runtime/direct-endpoint-authority.d.ts +0 -8
- package/dist-cjs/network-runtime/direct-endpoint-authority.js +0 -30
- package/dist-cjs/network-runtime/direct-endpoint-authority.js.map +0 -1
- package/dist-cjs/network-runtime/index.d.ts +0 -24
- package/dist-cjs/network-runtime/index.js +0 -173
- package/dist-cjs/network-runtime/index.js.map +0 -1
- package/dist-cjs/network-runtime/local-control-contract.d.ts +0 -758
- package/dist-cjs/network-runtime/local-control-contract.js +0 -634
- package/dist-cjs/network-runtime/local-control-contract.js.map +0 -1
- package/dist-cjs/network-runtime/node-store-contract.d.ts +0 -49
- package/dist-cjs/network-runtime/node-store-contract.js +0 -39
- package/dist-cjs/network-runtime/node-store-contract.js.map +0 -1
- package/dist-cjs/network-runtime/pair-route-contract.d.ts +0 -100
- package/dist-cjs/network-runtime/pair-route-contract.js +0 -81
- package/dist-cjs/network-runtime/pair-route-contract.js.map +0 -1
- package/dist-cjs/network-runtime/peer-capabilities.d.ts +0 -10
- package/dist-cjs/network-runtime/peer-capabilities.js +0 -38
- package/dist-cjs/network-runtime/peer-capabilities.js.map +0 -1
- package/dist-cjs/network-runtime/peer-principal-ref.d.ts +0 -9
- package/dist-cjs/network-runtime/peer-principal-ref.js +0 -16
- package/dist-cjs/network-runtime/peer-principal-ref.js.map +0 -1
- package/dist-cjs/network-runtime/peer-state-machine.d.ts +0 -70
- package/dist-cjs/network-runtime/peer-state-machine.js +0 -130
- package/dist-cjs/network-runtime/peer-state-machine.js.map +0 -1
- package/dist-cjs/network-runtime/protocol-schemas.d.ts +0 -328
- package/dist-cjs/network-runtime/protocol-schemas.js +0 -213
- package/dist-cjs/network-runtime/protocol-schemas.js.map +0 -1
- package/dist-cjs/network-runtime/runtime-bootstrap-contract.d.ts +0 -81
- package/dist-cjs/network-runtime/runtime-bootstrap-contract.js +0 -64
- package/dist-cjs/network-runtime/runtime-bootstrap-contract.js.map +0 -1
- package/dist-cjs/outlook/desktop-session.d.ts +0 -68
- package/dist-cjs/outlook/desktop-session.js +0 -319
- package/dist-cjs/outlook/desktop-session.js.map +0 -1
- package/dist-cjs/package.json +0 -3
- package/dist-cjs/policy.d.ts +0 -43
- package/dist-cjs/policy.js +0 -156
- package/dist-cjs/policy.js.map +0 -1
- package/dist-cjs/providers/brave.d.ts +0 -10
- package/dist-cjs/providers/brave.js +0 -67
- package/dist-cjs/providers/brave.js.map +0 -1
- package/dist-cjs/providers/duckduckgo.d.ts +0 -18
- package/dist-cjs/providers/duckduckgo.js +0 -181
- package/dist-cjs/providers/duckduckgo.js.map +0 -1
- package/dist-cjs/providers/exa.d.ts +0 -10
- package/dist-cjs/providers/exa.js +0 -68
- package/dist-cjs/providers/exa.js.map +0 -1
- package/dist-cjs/providers/firecrawl.d.ts +0 -10
- package/dist-cjs/providers/firecrawl.js +0 -60
- package/dist-cjs/providers/firecrawl.js.map +0 -1
- package/dist-cjs/providers/index.d.ts +0 -8
- package/dist-cjs/providers/index.js +0 -18
- package/dist-cjs/providers/index.js.map +0 -1
- package/dist-cjs/providers/jina.d.ts +0 -10
- package/dist-cjs/providers/jina.js +0 -54
- package/dist-cjs/providers/jina.js.map +0 -1
- package/dist-cjs/providers/router.d.ts +0 -21
- package/dist-cjs/providers/router.js +0 -101
- package/dist-cjs/providers/router.js.map +0 -1
- package/dist-cjs/providers/search-provider.d.ts +0 -35
- package/dist-cjs/providers/search-provider.js +0 -37
- package/dist-cjs/providers/search-provider.js.map +0 -1
- package/dist-cjs/providers/tavily.d.ts +0 -10
- package/dist-cjs/providers/tavily.js +0 -59
- package/dist-cjs/providers/tavily.js.map +0 -1
- package/dist-cjs/quip/desktop-session.d.ts +0 -69
- package/dist-cjs/quip/desktop-session.js +0 -354
- package/dist-cjs/quip/desktop-session.js.map +0 -1
- package/dist-cjs/registry/index.d.ts +0 -1
- package/dist-cjs/registry/index.js +0 -7
- package/dist-cjs/registry/index.js.map +0 -1
- package/dist-cjs/registry/registry.d.ts +0 -156
- package/dist-cjs/registry/registry.js +0 -762
- package/dist-cjs/registry/registry.js.map +0 -1
- package/dist-cjs/runtime-socket-local-control-client.d.ts +0 -10
- package/dist-cjs/runtime-socket-local-control-client.js +0 -368
- package/dist-cjs/runtime-socket-local-control-client.js.map +0 -1
- package/dist-cjs/security/dns-normalization.d.ts +0 -6
- package/dist-cjs/security/dns-normalization.js +0 -23
- package/dist-cjs/security/dns-normalization.js.map +0 -1
- package/dist-cjs/security/dns-pinning.d.ts +0 -27
- package/dist-cjs/security/dns-pinning.js +0 -161
- package/dist-cjs/security/dns-pinning.js.map +0 -1
- package/dist-cjs/security/external-content.d.ts +0 -40
- package/dist-cjs/security/external-content.js +0 -96
- package/dist-cjs/security/external-content.js.map +0 -1
- package/dist-cjs/security/ssrf.d.ts +0 -40
- package/dist-cjs/security/ssrf.js +0 -222
- package/dist-cjs/security/ssrf.js.map +0 -1
- package/dist-cjs/slack/desktop-session.d.ts +0 -69
- package/dist-cjs/slack/desktop-session.js +0 -367
- package/dist-cjs/slack/desktop-session.js.map +0 -1
- package/dist-cjs/tool-factory.d.ts +0 -46
- package/dist-cjs/tool-factory.js +0 -51
- package/dist-cjs/tool-factory.js.map +0 -1
- package/dist-cjs/types.d.ts +0 -1192
- package/dist-cjs/types.js +0 -9
- package/dist-cjs/types.js.map +0 -1
- package/dist-cjs/utils/retry.d.ts +0 -11
- package/dist-cjs/utils/retry.js +0 -170
- package/dist-cjs/utils/retry.js.map +0 -1
- package/dist-cjs/utils/safe-parse-json.d.ts +0 -26
- package/dist-cjs/utils/safe-parse-json.js +0 -165
- package/dist-cjs/utils/safe-parse-json.js.map +0 -1
- package/dist-cjs/utils/url.d.ts +0 -10
- package/dist-cjs/utils/url.js +0 -24
- package/dist-cjs/utils/url.js.map +0 -1
- package/src/__tests__/web-fetch-download.test.ts +0 -433
- package/src/__tests__/web-tools.test.ts +0 -619
- package/src/ask-user-interaction.ts +0 -33
- package/src/cache/web-cache.ts +0 -110
- package/src/definitions/arion.ts +0 -118
- package/src/definitions/browser/browser.ts +0 -502
- package/src/definitions/browser/index.ts +0 -5
- package/src/definitions/browser/pw-downloads.ts +0 -142
- package/src/definitions/browser/pw-interactions.ts +0 -282
- package/src/definitions/browser/pw-responses.ts +0 -98
- package/src/definitions/browser/pw-session.ts +0 -405
- package/src/definitions/browser/pw-shared.ts +0 -85
- package/src/definitions/browser/pw-snapshot.ts +0 -383
- package/src/definitions/browser/pw-state.ts +0 -101
- package/src/definitions/browser/types.ts +0 -203
- package/src/definitions/code-intelligence.ts +0 -526
- package/src/definitions/core.ts +0 -118
- package/src/definitions/delegation.ts +0 -567
- package/src/definitions/deploy.ts +0 -73
- package/src/definitions/filesystem.ts +0 -217
- package/src/definitions/frg.ts +0 -67
- package/src/definitions/index.ts +0 -28
- package/src/definitions/memory.ts +0 -150
- package/src/definitions/messaging.ts +0 -734
- package/src/definitions/meta.ts +0 -392
- package/src/definitions/network.ts +0 -179
- package/src/definitions/outlook.ts +0 -318
- package/src/definitions/patch/apply-patch.ts +0 -235
- package/src/definitions/patch/fuzzy-match.ts +0 -217
- package/src/definitions/patch/index.ts +0 -1
- package/src/definitions/patch/patch-parser.ts +0 -297
- package/src/definitions/patch/sandbox-paths.ts +0 -129
- package/src/definitions/process/index.ts +0 -5
- package/src/definitions/process/process-registry.ts +0 -303
- package/src/definitions/process/process.ts +0 -456
- package/src/definitions/process/pty-keys.ts +0 -298
- package/src/definitions/process/session-slug.ts +0 -147
- package/src/definitions/quip.ts +0 -225
- package/src/definitions/search.ts +0 -67
- package/src/definitions/session-history.ts +0 -79
- package/src/definitions/shell.ts +0 -202
- package/src/definitions/slack.ts +0 -211
- package/src/definitions/web.ts +0 -119
- package/src/executors/apply-patch.ts +0 -1035
- package/src/executors/arion.ts +0 -199
- package/src/executors/code-intelligence.ts +0 -1179
- package/src/executors/deploy.ts +0 -1066
- package/src/executors/filesystem.ts +0 -1428
- package/src/executors/frg-freshness.ts +0 -743
- package/src/executors/frg.ts +0 -394
- package/src/executors/index.ts +0 -280
- package/src/executors/learning-meta.ts +0 -1367
- package/src/executors/lsp-client.ts +0 -355
- package/src/executors/memory.ts +0 -978
- package/src/executors/meta.ts +0 -293
- package/src/executors/process-registry.ts +0 -570
- package/src/executors/pty-session-store.ts +0 -43
- package/src/executors/pty.ts +0 -342
- package/src/executors/restart.ts +0 -133
- package/src/executors/search-freshness.ts +0 -249
- package/src/executors/search-types.ts +0 -98
- package/src/executors/search.ts +0 -89
- package/src/executors/self-diagnose.ts +0 -552
- package/src/executors/session-history.ts +0 -435
- package/src/executors/shell-safety.ts +0 -519
- package/src/executors/shell.ts +0 -1243
- package/src/executors/utils.ts +0 -40
- package/src/executors/web.ts +0 -786
- package/src/extraction/content-extraction.ts +0 -281
- package/src/extraction/index.ts +0 -5
- package/src/headless-control-contract.ts +0 -1149
- package/src/index.ts +0 -788
- package/src/local-control-http-auth.ts +0 -2
- package/src/mcp/client.ts +0 -218
- package/src/mcp/connection.ts +0 -568
- package/src/mcp/index.ts +0 -11
- package/src/mcp/jsonrpc.ts +0 -195
- package/src/mcp/types.ts +0 -199
- package/src/network-control-adapter.ts +0 -88
- package/src/network-runtime/address-types.ts +0 -218
- package/src/network-runtime/db-owner-fencing.ts +0 -91
- package/src/network-runtime/delivery-receipts.ts +0 -372
- package/src/network-runtime/direct-endpoint-authority.ts +0 -35
- package/src/network-runtime/index.ts +0 -316
- package/src/network-runtime/local-control-contract.ts +0 -784
- package/src/network-runtime/node-store-contract.ts +0 -46
- package/src/network-runtime/pair-route-contract.ts +0 -97
- package/src/network-runtime/peer-capabilities.ts +0 -48
- package/src/network-runtime/peer-principal-ref.ts +0 -20
- package/src/network-runtime/peer-state-machine.ts +0 -160
- package/src/network-runtime/protocol-schemas.ts +0 -265
- package/src/network-runtime/runtime-bootstrap-contract.ts +0 -83
- package/src/outlook/desktop-session.ts +0 -409
- package/src/policy.ts +0 -171
- package/src/providers/brave.ts +0 -80
- package/src/providers/duckduckgo.ts +0 -199
- package/src/providers/exa.ts +0 -85
- package/src/providers/firecrawl.ts +0 -77
- package/src/providers/index.ts +0 -8
- package/src/providers/jina.ts +0 -70
- package/src/providers/router.ts +0 -121
- package/src/providers/search-provider.ts +0 -74
- package/src/providers/tavily.ts +0 -74
- package/src/quip/desktop-session.ts +0 -435
- package/src/registry/index.ts +0 -1
- package/src/registry/registry.ts +0 -905
- package/src/runtime-socket-local-control-client.ts +0 -632
- package/src/security/dns-normalization.ts +0 -34
- package/src/security/dns-pinning.ts +0 -138
- package/src/security/external-content.ts +0 -129
- package/src/security/ssrf.ts +0 -207
- package/src/slack/desktop-session.ts +0 -493
- package/src/tool-factory.ts +0 -91
- package/src/types.ts +0 -1341
- package/src/utils/retry.ts +0 -163
- package/src/utils/safe-parse-json.ts +0 -176
- package/src/utils/url.ts +0 -20
- package/tests/benchmarks/registry.bench.ts +0 -57
- package/tests/cache/web-cache.test.ts +0 -147
- package/tests/critical-integration.test.ts +0 -1465
- package/tests/definitions/apply-patch.test.ts +0 -586
- package/tests/definitions/browser.test.ts +0 -495
- package/tests/definitions/delegation-pause-resume.test.ts +0 -758
- package/tests/definitions/execution.test.ts +0 -671
- package/tests/definitions/messaging-inbox-scope.test.ts +0 -229
- package/tests/definitions/messaging.test.ts +0 -1468
- package/tests/definitions/outlook.test.ts +0 -30
- package/tests/definitions/process.test.ts +0 -469
- package/tests/definitions/slack.test.ts +0 -28
- package/tests/definitions/tool-inventory.test.ts +0 -218
- package/tests/e2e/delegation-quest-orchestration.e2e.test.ts +0 -433
- package/tests/e2e/memory-tool-discovery-contract.e2e.test.ts +0 -81
- package/tests/executors/apply-patch.test.ts +0 -538
- package/tests/executors/arion.test.ts +0 -309
- package/tests/executors/conversation-primitives.test.ts +0 -250
- package/tests/executors/deploy.test.ts +0 -746
- package/tests/executors/filesystem-tools.test.ts +0 -357
- package/tests/executors/filesystem.test.ts +0 -959
- package/tests/executors/frg-freshness.test.ts +0 -136
- package/tests/executors/frg-merge.test.ts +0 -70
- package/tests/executors/frg-session-content.test.ts +0 -40
- package/tests/executors/frg.test.ts +0 -56
- package/tests/executors/memory-bugfixes.test.ts +0 -257
- package/tests/executors/memory-real-memoria.integration.test.ts +0 -316
- package/tests/executors/memory.test.ts +0 -853
- package/tests/executors/meta-tools.test.ts +0 -411
- package/tests/executors/meta.test.ts +0 -683
- package/tests/executors/path-containment.test.ts +0 -51
- package/tests/executors/process-registry.test.ts +0 -505
- package/tests/executors/pty.test.ts +0 -664
- package/tests/executors/quest-security.test.ts +0 -249
- package/tests/executors/read-file-media.test.ts +0 -230
- package/tests/executors/recall-knowledge-schema.test.ts +0 -209
- package/tests/executors/recall-tags.test.ts +0 -278
- package/tests/executors/remember-null-safety.contract.test.ts +0 -41
- package/tests/executors/restart.test.ts +0 -67
- package/tests/executors/search-unified.test.ts +0 -381
- package/tests/executors/session-history.test.ts +0 -340
- package/tests/executors/session-transcript.test.ts +0 -561
- package/tests/executors/shell-abort.test.ts +0 -416
- package/tests/executors/shell-env-blocklist.test.ts +0 -648
- package/tests/executors/shell-env-process.test.ts +0 -245
- package/tests/executors/shell-process-registry.test.ts +0 -334
- package/tests/executors/shell-tools.test.ts +0 -393
- package/tests/executors/shell.test.ts +0 -690
- package/tests/executors/web-abort-vs-timeout.test.ts +0 -213
- package/tests/executors/web-integration.test.ts +0 -633
- package/tests/executors/web-symlink.test.ts +0 -18
- package/tests/executors/web.test.ts +0 -1400
- package/tests/executors/write-stdin.test.ts +0 -145
- package/tests/extraction/content-extraction.test.ts +0 -153
- package/tests/guards/tools-default-test-lane.integration.test.ts +0 -21
- package/tests/guards/tools-package-test-commands.e2e.test.ts +0 -43
- package/tests/guards/tools-test-lane-manifest.contract.test.ts +0 -76
- package/tests/guards/tools-vitest-workspace-alias.contract.test.ts +0 -63
- package/tests/helpers/async-waits.ts +0 -53
- package/tests/integration/headless-control-contract.integration.test.ts +0 -153
- package/tests/integration/memory-tool-schema-parity.integration.test.ts +0 -67
- package/tests/integration/meta-tools-round-trip.integration.test.ts +0 -506
- package/tests/integration/quest-round-trip.test.ts +0 -303
- package/tests/integration/registry-executor-flow.test.ts +0 -85
- package/tests/integration.test.ts +0 -177
- package/tests/loading-tier.test.ts +0 -126
- package/tests/mcp/client-reconnect.test.ts +0 -267
- package/tests/mcp/connection.test.ts +0 -846
- package/tests/mcp/injectable-logger.test.ts +0 -83
- package/tests/mcp/jsonrpc.test.ts +0 -109
- package/tests/mcp/lifecycle.test.ts +0 -879
- package/tests/network-runtime/address-types.contract.test.ts +0 -143
- package/tests/network-runtime/continuity-bind-schema.contract.test.ts +0 -203
- package/tests/network-runtime/local-control-contract.test.ts +0 -869
- package/tests/network-runtime/local-control-invite-token.contract.test.ts +0 -146
- package/tests/network-runtime/node-store-contract.test.ts +0 -11
- package/tests/network-runtime/pair-protocol-nodeid.contract.test.ts +0 -15
- package/tests/network-runtime/peer-state-machine.contract.test.ts +0 -148
- package/tests/network-runtime/protocol-schemas.contract.test.ts +0 -512
- package/tests/network-runtime/relay-pending-nodeid.contract.test.ts +0 -62
- package/tests/network-runtime/runtime-bootstrap-contract.test.ts +0 -227
- package/tests/network-runtime/runtime-socket-local-control-client.test.ts +0 -621
- package/tests/network-runtime/wait-for-message-script.test.ts +0 -288
- package/tests/parallel.test.ts +0 -71
- package/tests/policy.test.ts +0 -184
- package/tests/print-default-test-lane.ts +0 -14
- package/tests/print-test-lane-manifest.ts +0 -22
- package/tests/providers/brave.test.ts +0 -159
- package/tests/providers/duckduckgo.test.ts +0 -207
- package/tests/providers/exa.test.ts +0 -175
- package/tests/providers/firecrawl.test.ts +0 -168
- package/tests/providers/jina.test.ts +0 -144
- package/tests/providers/router.test.ts +0 -328
- package/tests/providers/tavily.test.ts +0 -165
- package/tests/registry/discovery.test.ts +0 -154
- package/tests/registry/injectable-logger.test.ts +0 -230
- package/tests/registry/input-validation.test.ts +0 -361
- package/tests/registry/interface-completeness.test.ts +0 -85
- package/tests/registry/mcp-integration.test.ts +0 -103
- package/tests/registry/mcp-read-only-hint.test.ts +0 -60
- package/tests/registry/memoria-discovery.test.ts +0 -390
- package/tests/registry/nested-validation.test.ts +0 -283
- package/tests/registry/pseudo-tool-filtering.test.ts +0 -258
- package/tests/registry/registration-lifecycle.test.ts +0 -133
- package/tests/registry-validation.test.ts +0 -424
- package/tests/registry.test.ts +0 -460
- package/tests/security/dns-pinning.test.ts +0 -162
- package/tests/security/external-content.test.ts +0 -144
- package/tests/security/ssrf.test.ts +0 -118
- package/tests/shell-safety-integration.test.ts +0 -32
- package/tests/shell-safety.test.ts +0 -365
- package/tests/slack/desktop-session.test.ts +0 -50
- package/tests/test-lane-manifest.ts +0 -440
- package/tests/test-utils.ts +0 -27
- package/tests/tool-factory.test.ts +0 -188
- package/tests/utils/retry.test.ts +0 -231
- package/tests/utils/url.test.ts +0 -63
- package/tsconfig.cjs.json +0 -24
- package/tsconfig.json +0 -12
- package/vitest.config.ts +0 -55
- package/vitest.e2e.config.ts +0 -24
- package/vitest.integration.config.ts +0 -24
- package/vitest.native.config.ts +0 -24
|
@@ -1,746 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Deploy tool executor tests (TDD — tests written before implementation of missing features)
|
|
3
|
-
*
|
|
4
|
-
* Tests cover:
|
|
5
|
-
* - OS detection parsing from SSH output
|
|
6
|
-
* - Linux distro detection (apt/dnf/apk)
|
|
7
|
-
* - Package manager + Node install command selection
|
|
8
|
-
* - Firewall command generation (ufw/iptables/firewalld/Windows)
|
|
9
|
-
* - TLS cert discovery logic
|
|
10
|
-
* - Config JSON generation
|
|
11
|
-
* - Health check URL construction
|
|
12
|
-
* - Auto-deny in daemon autorun mode
|
|
13
|
-
* - Target validation / injection prevention
|
|
14
|
-
* - Deploy output shape (including tlsType)
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
18
|
-
import type { ToolContext } from "../../src/types.js";
|
|
19
|
-
import {
|
|
20
|
-
detectOS,
|
|
21
|
-
detectLinuxDistro,
|
|
22
|
-
getNodeInstallCommand,
|
|
23
|
-
getFirewallCommands,
|
|
24
|
-
discoverTlsCerts,
|
|
25
|
-
buildConfigJson,
|
|
26
|
-
buildHealthCheckUrl,
|
|
27
|
-
validateRepoUrl,
|
|
28
|
-
validateBranch,
|
|
29
|
-
validateArionName,
|
|
30
|
-
validateSshKeyPath,
|
|
31
|
-
validateCommitHash,
|
|
32
|
-
getFirewallUndoCommands,
|
|
33
|
-
buildRollbackCommands,
|
|
34
|
-
deepMergeConfig,
|
|
35
|
-
getKeyPermissionCommands,
|
|
36
|
-
PINNED_PNPM_VERSION,
|
|
37
|
-
type OSInfo,
|
|
38
|
-
type LinuxDistro,
|
|
39
|
-
type TlsDiscoveryResult,
|
|
40
|
-
type DeployStep,
|
|
41
|
-
} from "../../src/executors/deploy.js";
|
|
42
|
-
import { executeDeploy } from "../../src/executors/deploy.js";
|
|
43
|
-
|
|
44
|
-
// ============================================================================
|
|
45
|
-
// OS Detection
|
|
46
|
-
// ============================================================================
|
|
47
|
-
|
|
48
|
-
describe("detectOS", () => {
|
|
49
|
-
it("should detect Linux from uname output", () => {
|
|
50
|
-
const result = detectOS("Linux");
|
|
51
|
-
expect(result.os).toBe("linux");
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
it("should detect macOS from uname output", () => {
|
|
55
|
-
const result = detectOS("Darwin");
|
|
56
|
-
expect(result.os).toBe("darwin");
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
it("should detect Windows from systeminfo-style output", () => {
|
|
60
|
-
const result = detectOS("MINGW64_NT-10.0-19045");
|
|
61
|
-
expect(result.os).toBe("windows");
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
it("should return unknown for unrecognized OS", () => {
|
|
65
|
-
const result = detectOS("FreeBSD");
|
|
66
|
-
expect(result.os).toBe("unknown");
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
it("should handle empty string", () => {
|
|
70
|
-
const result = detectOS("");
|
|
71
|
-
expect(result.os).toBe("unknown");
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
it("should handle UNKNOWN string from failed uname", () => {
|
|
75
|
-
const result = detectOS("UNKNOWN");
|
|
76
|
-
expect(result.os).toBe("unknown");
|
|
77
|
-
});
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
// ============================================================================
|
|
81
|
-
// Linux Distro Detection
|
|
82
|
-
// ============================================================================
|
|
83
|
-
|
|
84
|
-
describe("detectLinuxDistro", () => {
|
|
85
|
-
it("should detect Debian/Ubuntu (apt)", () => {
|
|
86
|
-
const osRelease = `NAME="Ubuntu"
|
|
87
|
-
VERSION="22.04.3 LTS (Jammy Jellyfish)"
|
|
88
|
-
ID=ubuntu
|
|
89
|
-
ID_LIKE=debian`;
|
|
90
|
-
const result = detectLinuxDistro(osRelease);
|
|
91
|
-
expect(result).toBe("apt");
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
it("should detect Fedora/RHEL (dnf)", () => {
|
|
95
|
-
const osRelease = `NAME="Fedora Linux"
|
|
96
|
-
VERSION="39 (Workstation Edition)"
|
|
97
|
-
ID=fedora`;
|
|
98
|
-
const result = detectLinuxDistro(osRelease);
|
|
99
|
-
expect(result).toBe("dnf");
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
it("should detect RHEL with yum fallback (dnf)", () => {
|
|
103
|
-
const osRelease = `NAME="Red Hat Enterprise Linux"
|
|
104
|
-
ID=rhel
|
|
105
|
-
ID_LIKE="fedora"`;
|
|
106
|
-
const result = detectLinuxDistro(osRelease);
|
|
107
|
-
expect(result).toBe("dnf");
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
it("should detect Alpine (apk)", () => {
|
|
111
|
-
const osRelease = `NAME="Alpine Linux"
|
|
112
|
-
ID=alpine`;
|
|
113
|
-
const result = detectLinuxDistro(osRelease);
|
|
114
|
-
expect(result).toBe("apk");
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
it("should detect Amazon Linux (dnf)", () => {
|
|
118
|
-
const osRelease = `NAME="Amazon Linux"
|
|
119
|
-
ID=amzn
|
|
120
|
-
ID_LIKE="centos rhel fedora"`;
|
|
121
|
-
const result = detectLinuxDistro(osRelease);
|
|
122
|
-
expect(result).toBe("dnf");
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
it("should detect SUSE (zypper -> dnf fallback)", () => {
|
|
126
|
-
const osRelease = `NAME="openSUSE Leap"
|
|
127
|
-
ID=opensuse-leap
|
|
128
|
-
ID_LIKE="suse opensuse"`;
|
|
129
|
-
const result = detectLinuxDistro(osRelease);
|
|
130
|
-
expect(result).toBe("dnf");
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
it("should fall back to apt for unknown distro", () => {
|
|
134
|
-
const result = detectLinuxDistro("");
|
|
135
|
-
expect(result).toBe("apt");
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
it("should handle Arch (pacman -> apt fallback)", () => {
|
|
139
|
-
const osRelease = `NAME="Arch Linux"
|
|
140
|
-
ID=arch`;
|
|
141
|
-
// We don't support pacman natively, so fallback to nvm-based install
|
|
142
|
-
const result = detectLinuxDistro(osRelease);
|
|
143
|
-
expect(result).toBe("apt"); // fallback
|
|
144
|
-
});
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
// ============================================================================
|
|
148
|
-
// Node Install Command Selection
|
|
149
|
-
// ============================================================================
|
|
150
|
-
|
|
151
|
-
describe("getNodeInstallCommand", () => {
|
|
152
|
-
it("should return nvm command for Linux apt", () => {
|
|
153
|
-
const cmd = getNodeInstallCommand({ os: "linux" }, "apt");
|
|
154
|
-
expect(cmd).toContain("nvm");
|
|
155
|
-
expect(cmd).toContain("install");
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
it("should return dnf command for Linux dnf", () => {
|
|
159
|
-
const cmd = getNodeInstallCommand({ os: "linux" }, "dnf");
|
|
160
|
-
expect(cmd).toContain("dnf");
|
|
161
|
-
expect(cmd).toContain("nodejs");
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
it("should return apk command for Linux apk (Alpine)", () => {
|
|
165
|
-
const cmd = getNodeInstallCommand({ os: "linux" }, "apk");
|
|
166
|
-
expect(cmd).toContain("apk");
|
|
167
|
-
expect(cmd).toContain("nodejs");
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
it("should return brew/nvm command for macOS", () => {
|
|
171
|
-
const cmd = getNodeInstallCommand({ os: "darwin" }, "apt");
|
|
172
|
-
expect(cmd).toMatch(/brew|nvm/);
|
|
173
|
-
});
|
|
174
|
-
|
|
175
|
-
it("should return winget command for Windows", () => {
|
|
176
|
-
const cmd = getNodeInstallCommand({ os: "windows" }, "apt");
|
|
177
|
-
expect(cmd).toContain("winget");
|
|
178
|
-
expect(cmd).toContain("NodeJS");
|
|
179
|
-
});
|
|
180
|
-
|
|
181
|
-
it("should throw for unknown OS", () => {
|
|
182
|
-
expect(() => getNodeInstallCommand({ os: "unknown" }, "apt")).toThrow(/unsupported/i);
|
|
183
|
-
});
|
|
184
|
-
});
|
|
185
|
-
|
|
186
|
-
// ============================================================================
|
|
187
|
-
// Firewall Command Generation
|
|
188
|
-
// ============================================================================
|
|
189
|
-
|
|
190
|
-
describe("getFirewallCommands", () => {
|
|
191
|
-
it("should generate ufw commands", () => {
|
|
192
|
-
const cmds = getFirewallCommands("ufw");
|
|
193
|
-
expect(cmds).toContain("ufw allow 443/tcp");
|
|
194
|
-
expect(cmds).toContain("ufw allow 51820/udp");
|
|
195
|
-
});
|
|
196
|
-
|
|
197
|
-
it("should generate iptables commands", () => {
|
|
198
|
-
const cmds = getFirewallCommands("iptables");
|
|
199
|
-
expect(cmds).toContain("iptables");
|
|
200
|
-
expect(cmds).toContain("443");
|
|
201
|
-
expect(cmds).toContain("51820");
|
|
202
|
-
});
|
|
203
|
-
|
|
204
|
-
it("should generate firewalld commands", () => {
|
|
205
|
-
const cmds = getFirewallCommands("firewalld");
|
|
206
|
-
expect(cmds).toContain("firewall-cmd");
|
|
207
|
-
expect(cmds).toContain("443/tcp");
|
|
208
|
-
expect(cmds).toContain("51820/udp");
|
|
209
|
-
});
|
|
210
|
-
|
|
211
|
-
it("should generate Windows firewall commands", () => {
|
|
212
|
-
const cmds = getFirewallCommands("windows");
|
|
213
|
-
expect(cmds).toContain("netsh");
|
|
214
|
-
expect(cmds).toContain("443");
|
|
215
|
-
expect(cmds).toContain("51820");
|
|
216
|
-
});
|
|
217
|
-
|
|
218
|
-
it("should return empty string for no firewall", () => {
|
|
219
|
-
const cmds = getFirewallCommands("none");
|
|
220
|
-
expect(cmds).toBe("");
|
|
221
|
-
});
|
|
222
|
-
});
|
|
223
|
-
|
|
224
|
-
// ============================================================================
|
|
225
|
-
// TLS Cert Discovery
|
|
226
|
-
// ============================================================================
|
|
227
|
-
|
|
228
|
-
describe("discoverTlsCerts", () => {
|
|
229
|
-
it("should detect existing Let's Encrypt certs", () => {
|
|
230
|
-
// Simulated SSH output from cert discovery script
|
|
231
|
-
const sshOutput = JSON.stringify({
|
|
232
|
-
found: true,
|
|
233
|
-
type: "letsencrypt",
|
|
234
|
-
cert: "/etc/letsencrypt/live/example.com/fullchain.pem",
|
|
235
|
-
key: "/etc/letsencrypt/live/example.com/privkey.pem",
|
|
236
|
-
});
|
|
237
|
-
const result = discoverTlsCerts(sshOutput);
|
|
238
|
-
expect(result.found).toBe(true);
|
|
239
|
-
expect(result.type).toBe("letsencrypt");
|
|
240
|
-
expect(result.cert).toContain("letsencrypt");
|
|
241
|
-
expect(result.key).toContain("letsencrypt");
|
|
242
|
-
});
|
|
243
|
-
|
|
244
|
-
it("should detect real CA certs in /etc/ssl", () => {
|
|
245
|
-
const sshOutput = JSON.stringify({
|
|
246
|
-
found: true,
|
|
247
|
-
type: "real-ca",
|
|
248
|
-
cert: "/etc/ssl/certs/server.crt",
|
|
249
|
-
key: "/etc/ssl/private/server.key",
|
|
250
|
-
});
|
|
251
|
-
const result = discoverTlsCerts(sshOutput);
|
|
252
|
-
expect(result.found).toBe(true);
|
|
253
|
-
expect(result.type).toBe("real-ca");
|
|
254
|
-
});
|
|
255
|
-
|
|
256
|
-
it("should return not-found when no certs exist", () => {
|
|
257
|
-
const sshOutput = JSON.stringify({ found: false });
|
|
258
|
-
const result = discoverTlsCerts(sshOutput);
|
|
259
|
-
expect(result.found).toBe(false);
|
|
260
|
-
expect(result.type).toBeUndefined();
|
|
261
|
-
});
|
|
262
|
-
|
|
263
|
-
it("should handle malformed JSON gracefully", () => {
|
|
264
|
-
const result = discoverTlsCerts("not json at all");
|
|
265
|
-
expect(result.found).toBe(false);
|
|
266
|
-
});
|
|
267
|
-
|
|
268
|
-
it("should handle empty string", () => {
|
|
269
|
-
const result = discoverTlsCerts("");
|
|
270
|
-
expect(result.found).toBe(false);
|
|
271
|
-
});
|
|
272
|
-
});
|
|
273
|
-
|
|
274
|
-
// ============================================================================
|
|
275
|
-
// Config JSON Generation
|
|
276
|
-
// ============================================================================
|
|
277
|
-
|
|
278
|
-
describe("buildConfigJson", () => {
|
|
279
|
-
it("should include arion_name", () => {
|
|
280
|
-
const config = buildConfigJson({ arionName: "alpha" });
|
|
281
|
-
expect(config.arion_name).toBe("alpha");
|
|
282
|
-
});
|
|
283
|
-
|
|
284
|
-
it("should include coordination_url when provided", () => {
|
|
285
|
-
const config = buildConfigJson({
|
|
286
|
-
arionName: "alpha",
|
|
287
|
-
coordinationUrl: "https://coord.example.com",
|
|
288
|
-
});
|
|
289
|
-
expect(config.coordination_url).toBe("https://coord.example.com");
|
|
290
|
-
});
|
|
291
|
-
|
|
292
|
-
it("should omit coordination_url when not provided", () => {
|
|
293
|
-
const config = buildConfigJson({ arionName: "alpha" });
|
|
294
|
-
expect(config).not.toHaveProperty("coordination_url");
|
|
295
|
-
});
|
|
296
|
-
|
|
297
|
-
it("should include TLS cert paths when provided", () => {
|
|
298
|
-
const config = buildConfigJson({
|
|
299
|
-
arionName: "alpha",
|
|
300
|
-
tlsCert: "/etc/ssl/certs/server.crt",
|
|
301
|
-
tlsKey: "/etc/ssl/private/server.key",
|
|
302
|
-
});
|
|
303
|
-
expect(config.tls).toEqual({
|
|
304
|
-
cert: "/etc/ssl/certs/server.crt",
|
|
305
|
-
key: "/etc/ssl/private/server.key",
|
|
306
|
-
});
|
|
307
|
-
});
|
|
308
|
-
|
|
309
|
-
it("should omit tls when no cert paths provided", () => {
|
|
310
|
-
const config = buildConfigJson({ arionName: "alpha" });
|
|
311
|
-
expect(config).not.toHaveProperty("tls");
|
|
312
|
-
});
|
|
313
|
-
});
|
|
314
|
-
|
|
315
|
-
// ============================================================================
|
|
316
|
-
// Health Check URL Construction
|
|
317
|
-
// ============================================================================
|
|
318
|
-
|
|
319
|
-
describe("buildHealthCheckUrl", () => {
|
|
320
|
-
it("should construct HTTPS URL for host", () => {
|
|
321
|
-
const url = buildHealthCheckUrl("10.0.0.1", 443);
|
|
322
|
-
expect(url).toBe("https://10.0.0.1:443/api/v1/network/peers");
|
|
323
|
-
});
|
|
324
|
-
|
|
325
|
-
it("should use default port 443", () => {
|
|
326
|
-
const url = buildHealthCheckUrl("example.com");
|
|
327
|
-
expect(url).toBe("https://example.com:443/api/v1/network/peers");
|
|
328
|
-
});
|
|
329
|
-
|
|
330
|
-
it("should handle custom port", () => {
|
|
331
|
-
const url = buildHealthCheckUrl("10.0.0.1", 8443);
|
|
332
|
-
expect(url).toBe("https://10.0.0.1:8443/api/v1/network/peers");
|
|
333
|
-
});
|
|
334
|
-
});
|
|
335
|
-
|
|
336
|
-
// ============================================================================
|
|
337
|
-
// Target Validation / Injection Prevention
|
|
338
|
-
// ============================================================================
|
|
339
|
-
|
|
340
|
-
describe("executeDeploy — target validation", () => {
|
|
341
|
-
let mockContext: ToolContext;
|
|
342
|
-
|
|
343
|
-
beforeEach(() => {
|
|
344
|
-
mockContext = {
|
|
345
|
-
workingDir: "/tmp",
|
|
346
|
-
env: {},
|
|
347
|
-
confirm: vi.fn().mockResolvedValue(true),
|
|
348
|
-
};
|
|
349
|
-
});
|
|
350
|
-
|
|
351
|
-
it("should reject empty target", async () => {
|
|
352
|
-
const result = await executeDeploy({ target: "" }, mockContext);
|
|
353
|
-
expect(result.success).toBe(false);
|
|
354
|
-
expect(result.message).toMatch(/target.*required/i);
|
|
355
|
-
});
|
|
356
|
-
|
|
357
|
-
it("should reject target with spaces (command injection)", async () => {
|
|
358
|
-
const result = await executeDeploy({ target: "user@host; rm -rf /" }, mockContext);
|
|
359
|
-
expect(result.success).toBe(false);
|
|
360
|
-
expect(result.message).toMatch(/invalid.*target/i);
|
|
361
|
-
});
|
|
362
|
-
|
|
363
|
-
it("should reject target with pipes (command injection)", async () => {
|
|
364
|
-
const result = await executeDeploy({ target: "user@host | cat /etc/passwd" }, mockContext);
|
|
365
|
-
expect(result.success).toBe(false);
|
|
366
|
-
expect(result.message).toMatch(/invalid.*target/i);
|
|
367
|
-
});
|
|
368
|
-
|
|
369
|
-
it("should reject target with semicolons", async () => {
|
|
370
|
-
const result = await executeDeploy({ target: "user@host;whoami" }, mockContext);
|
|
371
|
-
expect(result.success).toBe(false);
|
|
372
|
-
expect(result.message).toMatch(/invalid.*target/i);
|
|
373
|
-
});
|
|
374
|
-
|
|
375
|
-
it("should reject target with backticks", async () => {
|
|
376
|
-
const result = await executeDeploy({ target: "user@`whoami`" }, mockContext);
|
|
377
|
-
expect(result.success).toBe(false);
|
|
378
|
-
expect(result.message).toMatch(/invalid.*target/i);
|
|
379
|
-
});
|
|
380
|
-
|
|
381
|
-
it("should reject when user cancels confirmation", async () => {
|
|
382
|
-
(mockContext.confirm as ReturnType<typeof vi.fn>).mockResolvedValue(false);
|
|
383
|
-
const result = await executeDeploy({ target: "claude@10.0.0.1" }, mockContext);
|
|
384
|
-
expect(result.success).toBe(false);
|
|
385
|
-
expect(result.message).toMatch(/cancel/i);
|
|
386
|
-
});
|
|
387
|
-
});
|
|
388
|
-
|
|
389
|
-
// ============================================================================
|
|
390
|
-
// Input Validation (A1)
|
|
391
|
-
// ============================================================================
|
|
392
|
-
|
|
393
|
-
describe("input validation", () => {
|
|
394
|
-
it("rejects repo_url with shell metacharacters", () => {
|
|
395
|
-
const err = validateRepoUrl("https://evil.com/repo; rm -rf /");
|
|
396
|
-
expect(err).toContain("Invalid repo URL");
|
|
397
|
-
});
|
|
398
|
-
|
|
399
|
-
it("rejects repo_url with pipe injection", () => {
|
|
400
|
-
const err = validateRepoUrl("https://evil.com/repo | cat /etc/passwd");
|
|
401
|
-
expect(err).toContain("Invalid repo URL");
|
|
402
|
-
});
|
|
403
|
-
|
|
404
|
-
it("rejects repo_url with backtick injection", () => {
|
|
405
|
-
const err = validateRepoUrl("https://evil.com/`whoami`/repo");
|
|
406
|
-
expect(err).toContain("Invalid repo URL");
|
|
407
|
-
});
|
|
408
|
-
|
|
409
|
-
it("accepts valid HTTPS repo_url", () => {
|
|
410
|
-
expect(validateRepoUrl("https://github.com/aria-ai/aria.git")).toBeNull();
|
|
411
|
-
});
|
|
412
|
-
|
|
413
|
-
it("accepts valid HTTPS repo_url without .git suffix", () => {
|
|
414
|
-
expect(validateRepoUrl("https://github.com/aria-ai/aria")).toBeNull();
|
|
415
|
-
});
|
|
416
|
-
|
|
417
|
-
it("returns null for empty repo_url", () => {
|
|
418
|
-
expect(validateRepoUrl("")).toBeNull();
|
|
419
|
-
});
|
|
420
|
-
|
|
421
|
-
it("rejects branch with shell injection", () => {
|
|
422
|
-
const err = validateBranch("main; rm -rf /");
|
|
423
|
-
expect(err).toContain("Invalid branch");
|
|
424
|
-
});
|
|
425
|
-
|
|
426
|
-
it("rejects branch with path traversal", () => {
|
|
427
|
-
const err = validateBranch("../../etc/passwd");
|
|
428
|
-
expect(err).toContain("Invalid branch");
|
|
429
|
-
});
|
|
430
|
-
|
|
431
|
-
it("rejects branch with backtick injection", () => {
|
|
432
|
-
const err = validateBranch("main`whoami`");
|
|
433
|
-
expect(err).toContain("Invalid branch");
|
|
434
|
-
});
|
|
435
|
-
|
|
436
|
-
it("accepts valid branch name", () => {
|
|
437
|
-
expect(validateBranch("feature/my-branch")).toBeNull();
|
|
438
|
-
});
|
|
439
|
-
|
|
440
|
-
it("accepts branch with dots", () => {
|
|
441
|
-
expect(validateBranch("release/v1.2.3")).toBeNull();
|
|
442
|
-
});
|
|
443
|
-
|
|
444
|
-
it("returns null for empty branch", () => {
|
|
445
|
-
expect(validateBranch("")).toBeNull();
|
|
446
|
-
});
|
|
447
|
-
|
|
448
|
-
it("rejects arion_name with backticks", () => {
|
|
449
|
-
const err = validateArionName("test`whoami`");
|
|
450
|
-
expect(err).toContain("Invalid arion name");
|
|
451
|
-
});
|
|
452
|
-
|
|
453
|
-
it("rejects arion_name with semicolons", () => {
|
|
454
|
-
const err = validateArionName("test;whoami");
|
|
455
|
-
expect(err).toContain("Invalid arion name");
|
|
456
|
-
});
|
|
457
|
-
|
|
458
|
-
it("rejects arion_name with spaces", () => {
|
|
459
|
-
const err = validateArionName("test name");
|
|
460
|
-
expect(err).toContain("Invalid arion name");
|
|
461
|
-
});
|
|
462
|
-
|
|
463
|
-
it("accepts valid arion_name with alphanumeric, underscores, hyphens", () => {
|
|
464
|
-
expect(validateArionName("my-arion-01")).toBeNull();
|
|
465
|
-
});
|
|
466
|
-
|
|
467
|
-
it("accepts valid arion_name with underscores", () => {
|
|
468
|
-
expect(validateArionName("my_arion_01")).toBeNull();
|
|
469
|
-
});
|
|
470
|
-
|
|
471
|
-
it("returns null for empty arion_name", () => {
|
|
472
|
-
expect(validateArionName("")).toBeNull();
|
|
473
|
-
});
|
|
474
|
-
|
|
475
|
-
it("rejects ssh_key_path with traversal", () => {
|
|
476
|
-
const err = validateSshKeyPath("../../etc/shadow");
|
|
477
|
-
expect(err).toContain("Invalid SSH key path");
|
|
478
|
-
});
|
|
479
|
-
|
|
480
|
-
it("rejects ssh_key_path with shell chars", () => {
|
|
481
|
-
const err = validateSshKeyPath("/tmp/key; cat /etc/passwd");
|
|
482
|
-
expect(err).toContain("Invalid SSH key path");
|
|
483
|
-
});
|
|
484
|
-
|
|
485
|
-
it("rejects ssh_key_path with pipe", () => {
|
|
486
|
-
const err = validateSshKeyPath("/tmp/key | cat /etc/passwd");
|
|
487
|
-
expect(err).toContain("Invalid SSH key path");
|
|
488
|
-
});
|
|
489
|
-
|
|
490
|
-
it("rejects ssh_key_path with backticks", () => {
|
|
491
|
-
const err = validateSshKeyPath("/tmp/`whoami`/key");
|
|
492
|
-
expect(err).toContain("Invalid SSH key path");
|
|
493
|
-
});
|
|
494
|
-
|
|
495
|
-
it("accepts valid ssh_key_path", () => {
|
|
496
|
-
expect(validateSshKeyPath("/home/user/.ssh/id_ed25519")).toBeNull();
|
|
497
|
-
});
|
|
498
|
-
|
|
499
|
-
it("accepts ssh_key_path with tilde", () => {
|
|
500
|
-
expect(validateSshKeyPath("~/.ssh/id_ed25519")).toBeNull();
|
|
501
|
-
});
|
|
502
|
-
|
|
503
|
-
it("returns null for empty ssh_key_path", () => {
|
|
504
|
-
expect(validateSshKeyPath("")).toBeNull();
|
|
505
|
-
});
|
|
506
|
-
});
|
|
507
|
-
|
|
508
|
-
// ============================================================================
|
|
509
|
-
// Rollback Mechanism (A2)
|
|
510
|
-
// ============================================================================
|
|
511
|
-
|
|
512
|
-
describe("rollback", () => {
|
|
513
|
-
it("getFirewallUndoCommands returns reverse commands for ufw", () => {
|
|
514
|
-
const undo = getFirewallUndoCommands("ufw");
|
|
515
|
-
expect(undo).toContain("ufw delete allow 443/tcp");
|
|
516
|
-
expect(undo).toContain("ufw delete allow 51820/udp");
|
|
517
|
-
});
|
|
518
|
-
|
|
519
|
-
it("getFirewallUndoCommands returns reverse commands for iptables", () => {
|
|
520
|
-
const undo = getFirewallUndoCommands("iptables");
|
|
521
|
-
expect(undo).toContain("iptables -D INPUT");
|
|
522
|
-
});
|
|
523
|
-
|
|
524
|
-
it("getFirewallUndoCommands returns reverse commands for firewalld", () => {
|
|
525
|
-
const undo = getFirewallUndoCommands("firewalld");
|
|
526
|
-
expect(undo).toContain("firewall-cmd --permanent --remove-port=443/tcp");
|
|
527
|
-
expect(undo).toContain("firewall-cmd --permanent --remove-port=51820/udp");
|
|
528
|
-
expect(undo).toContain("firewall-cmd --reload");
|
|
529
|
-
});
|
|
530
|
-
|
|
531
|
-
it("getFirewallUndoCommands returns empty string for none", () => {
|
|
532
|
-
expect(getFirewallUndoCommands("none")).toBe("");
|
|
533
|
-
});
|
|
534
|
-
|
|
535
|
-
it("buildRollbackCommands reverses steps in order", () => {
|
|
536
|
-
const steps: DeployStep[] = [
|
|
537
|
-
{ name: "firewall", undoCmd: "ufw delete allow 443/tcp" },
|
|
538
|
-
{ name: "config", undoCmd: "rm -f ~/.aria/config.json" },
|
|
539
|
-
];
|
|
540
|
-
const cmds = buildRollbackCommands(steps);
|
|
541
|
-
expect(cmds[0]).toContain("rm -f"); // config first (reverse)
|
|
542
|
-
expect(cmds[1]).toContain("ufw delete"); // firewall second
|
|
543
|
-
});
|
|
544
|
-
|
|
545
|
-
it("buildRollbackCommands returns empty array for empty steps", () => {
|
|
546
|
-
expect(buildRollbackCommands([])).toEqual([]);
|
|
547
|
-
});
|
|
548
|
-
|
|
549
|
-
it("buildRollbackCommands skips steps with empty undoCmd", () => {
|
|
550
|
-
const steps: DeployStep[] = [
|
|
551
|
-
{ name: "step1", undoCmd: "echo undo1" },
|
|
552
|
-
{ name: "step2", undoCmd: "" },
|
|
553
|
-
{ name: "step3", undoCmd: "echo undo3" },
|
|
554
|
-
];
|
|
555
|
-
const cmds = buildRollbackCommands(steps);
|
|
556
|
-
expect(cmds).toHaveLength(2);
|
|
557
|
-
expect(cmds[0]).toContain("undo3"); // step3 reversed first
|
|
558
|
-
expect(cmds[1]).toContain("undo1"); // step1 reversed second
|
|
559
|
-
});
|
|
560
|
-
});
|
|
561
|
-
|
|
562
|
-
// ============================================================================
|
|
563
|
-
// Idempotency — Deep Merge Config (A3)
|
|
564
|
-
// ============================================================================
|
|
565
|
-
|
|
566
|
-
describe("idempotency", () => {
|
|
567
|
-
it("deepMergeConfig preserves nested objects", () => {
|
|
568
|
-
const existing = { tls: { cert: "/old", extra: true }, name: "old" };
|
|
569
|
-
const update = { tls: { cert: "/new" }, name: "new" };
|
|
570
|
-
const result = deepMergeConfig(existing, update);
|
|
571
|
-
expect(result.tls.cert).toBe("/new");
|
|
572
|
-
expect(result.tls.extra).toBe(true); // preserved
|
|
573
|
-
expect(result.name).toBe("new");
|
|
574
|
-
});
|
|
575
|
-
|
|
576
|
-
it("deepMergeConfig adds new top-level keys", () => {
|
|
577
|
-
const existing = { name: "old" };
|
|
578
|
-
const update = { port: 443 };
|
|
579
|
-
const result = deepMergeConfig(existing, update);
|
|
580
|
-
expect(result.name).toBe("old");
|
|
581
|
-
expect(result.port).toBe(443);
|
|
582
|
-
});
|
|
583
|
-
|
|
584
|
-
it("deepMergeConfig handles empty existing config", () => {
|
|
585
|
-
const result = deepMergeConfig({}, { name: "new" });
|
|
586
|
-
expect(result.name).toBe("new");
|
|
587
|
-
});
|
|
588
|
-
|
|
589
|
-
it("deepMergeConfig does not mutate inputs", () => {
|
|
590
|
-
const existing = { tls: { cert: "/old" } };
|
|
591
|
-
const update = { tls: { cert: "/new" } };
|
|
592
|
-
deepMergeConfig(existing, update);
|
|
593
|
-
expect(existing.tls.cert).toBe("/old"); // unchanged
|
|
594
|
-
});
|
|
595
|
-
});
|
|
596
|
-
|
|
597
|
-
// ============================================================================
|
|
598
|
-
// Key Permissions (A3)
|
|
599
|
-
// ============================================================================
|
|
600
|
-
|
|
601
|
-
describe("key permissions", () => {
|
|
602
|
-
it("getKeyPermissionCommands returns chmod 600 for signing key", () => {
|
|
603
|
-
const cmds = getKeyPermissionCommands();
|
|
604
|
-
expect(cmds).toContain("chmod 600 ~/.aria/signing-key.json");
|
|
605
|
-
});
|
|
606
|
-
|
|
607
|
-
it("getKeyPermissionCommands returns chmod 600 for config", () => {
|
|
608
|
-
const cmds = getKeyPermissionCommands();
|
|
609
|
-
expect(cmds).toContain("chmod 600 ~/.aria/config.json");
|
|
610
|
-
});
|
|
611
|
-
});
|
|
612
|
-
|
|
613
|
-
// ============================================================================
|
|
614
|
-
// Deploy Output Shape
|
|
615
|
-
// ============================================================================
|
|
616
|
-
|
|
617
|
-
describe("DeployOutput shape", () => {
|
|
618
|
-
it("should include tlsType field in output", async () => {
|
|
619
|
-
// This validates the type definition includes tlsType
|
|
620
|
-
const output = {
|
|
621
|
-
success: true,
|
|
622
|
-
host: "10.0.0.1",
|
|
623
|
-
port: 443,
|
|
624
|
-
fingerprint: "abc123",
|
|
625
|
-
arionName: "alpha",
|
|
626
|
-
tlsType: "letsencrypt" as const,
|
|
627
|
-
};
|
|
628
|
-
expect(output.tlsType).toBe("letsencrypt");
|
|
629
|
-
expect(["real-ca", "letsencrypt", "private-ca"]).toContain(output.tlsType);
|
|
630
|
-
});
|
|
631
|
-
});
|
|
632
|
-
|
|
633
|
-
// ============================================================================
|
|
634
|
-
// Commit Hash Validation (Supply Chain Hardening)
|
|
635
|
-
// ============================================================================
|
|
636
|
-
|
|
637
|
-
describe("validateCommitHash", () => {
|
|
638
|
-
it("accepts valid full-length SHA-1 hash", () => {
|
|
639
|
-
expect(validateCommitHash("a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2")).toBeNull();
|
|
640
|
-
});
|
|
641
|
-
|
|
642
|
-
it("accepts valid short hash (7 chars)", () => {
|
|
643
|
-
expect(validateCommitHash("a1b2c3d")).toBeNull();
|
|
644
|
-
});
|
|
645
|
-
|
|
646
|
-
it("accepts valid SHA-256 length hash (64 chars)", () => {
|
|
647
|
-
expect(
|
|
648
|
-
validateCommitHash("a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2"),
|
|
649
|
-
).toBeNull();
|
|
650
|
-
});
|
|
651
|
-
|
|
652
|
-
it("rejects uppercase hex (prevents mixed-case ambiguity)", () => {
|
|
653
|
-
const err = validateCommitHash("A1B2C3D4E5F6A1B2C3D4E5F6A1B2C3D4E5F6A1B2");
|
|
654
|
-
expect(err).toContain("Invalid commit hash");
|
|
655
|
-
});
|
|
656
|
-
|
|
657
|
-
it("rejects non-hex characters", () => {
|
|
658
|
-
const err = validateCommitHash("g1b2c3d4e5f6zzzz");
|
|
659
|
-
expect(err).toContain("Invalid commit hash");
|
|
660
|
-
});
|
|
661
|
-
|
|
662
|
-
it("rejects hash too short (< 7 chars)", () => {
|
|
663
|
-
const err = validateCommitHash("a1b2c3");
|
|
664
|
-
expect(err).toContain("Invalid commit hash");
|
|
665
|
-
});
|
|
666
|
-
|
|
667
|
-
it("rejects hash too long (> 64 chars)", () => {
|
|
668
|
-
const err = validateCommitHash("a".repeat(65));
|
|
669
|
-
expect(err).toContain("Invalid commit hash");
|
|
670
|
-
});
|
|
671
|
-
|
|
672
|
-
it("rejects shell injection via semicolons", () => {
|
|
673
|
-
const err = validateCommitHash("a1b2c3d; rm -rf /");
|
|
674
|
-
expect(err).toContain("Invalid commit hash");
|
|
675
|
-
});
|
|
676
|
-
|
|
677
|
-
it("rejects shell injection via backticks", () => {
|
|
678
|
-
const err = validateCommitHash("a1b2c3d`whoami`");
|
|
679
|
-
expect(err).toContain("Invalid commit hash");
|
|
680
|
-
});
|
|
681
|
-
|
|
682
|
-
it("rejects shell injection via $() substitution", () => {
|
|
683
|
-
const err = validateCommitHash("a1b2c3d$(cat /etc/passwd)");
|
|
684
|
-
expect(err).toContain("Invalid commit hash");
|
|
685
|
-
});
|
|
686
|
-
|
|
687
|
-
it("rejects empty-ish whitespace", () => {
|
|
688
|
-
const err = validateCommitHash(" a1b2c3d ");
|
|
689
|
-
expect(err).toContain("Invalid commit hash");
|
|
690
|
-
});
|
|
691
|
-
|
|
692
|
-
it("returns null for empty string (optional param)", () => {
|
|
693
|
-
expect(validateCommitHash("")).toBeNull();
|
|
694
|
-
});
|
|
695
|
-
});
|
|
696
|
-
|
|
697
|
-
// ============================================================================
|
|
698
|
-
// Pinned pnpm Version (Supply Chain Hardening)
|
|
699
|
-
// ============================================================================
|
|
700
|
-
|
|
701
|
-
describe("PINNED_PNPM_VERSION", () => {
|
|
702
|
-
it("is a valid semver-like version string", () => {
|
|
703
|
-
expect(PINNED_PNPM_VERSION).toMatch(/^\d+\.\d+\.\d+$/);
|
|
704
|
-
});
|
|
705
|
-
|
|
706
|
-
it("is not 'latest' or a range", () => {
|
|
707
|
-
expect(PINNED_PNPM_VERSION).not.toBe("latest");
|
|
708
|
-
expect(PINNED_PNPM_VERSION).not.toContain("^");
|
|
709
|
-
expect(PINNED_PNPM_VERSION).not.toContain("~");
|
|
710
|
-
expect(PINNED_PNPM_VERSION).not.toContain("*");
|
|
711
|
-
});
|
|
712
|
-
});
|
|
713
|
-
|
|
714
|
-
// ============================================================================
|
|
715
|
-
// Supply Chain: commit_hash param in tool definition schema
|
|
716
|
-
// ============================================================================
|
|
717
|
-
|
|
718
|
-
describe("executeDeploy — commit_hash validation", () => {
|
|
719
|
-
let mockContext: ToolContext;
|
|
720
|
-
|
|
721
|
-
beforeEach(() => {
|
|
722
|
-
mockContext = {
|
|
723
|
-
workingDir: "/tmp",
|
|
724
|
-
env: {},
|
|
725
|
-
confirm: vi.fn().mockResolvedValue(true),
|
|
726
|
-
};
|
|
727
|
-
});
|
|
728
|
-
|
|
729
|
-
it("should reject invalid commit_hash before SSH", async () => {
|
|
730
|
-
const result = await executeDeploy(
|
|
731
|
-
{ target: "user@host", commit_hash: "not-a-hash!" },
|
|
732
|
-
mockContext,
|
|
733
|
-
);
|
|
734
|
-
expect(result.success).toBe(false);
|
|
735
|
-
expect(result.message).toMatch(/invalid commit hash/i);
|
|
736
|
-
});
|
|
737
|
-
|
|
738
|
-
it("should reject commit_hash with shell injection", async () => {
|
|
739
|
-
const result = await executeDeploy(
|
|
740
|
-
{ target: "user@host", commit_hash: "abc1234; rm -rf /" },
|
|
741
|
-
mockContext,
|
|
742
|
-
);
|
|
743
|
-
expect(result.success).toBe(false);
|
|
744
|
-
expect(result.message).toMatch(/invalid commit hash/i);
|
|
745
|
-
});
|
|
746
|
-
});
|