@asterxsk/kiln 0.1.0 → 0.3.0
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/README.md +155 -170
- package/agent/AGENTS.md +67 -67
- package/agent/README.md +5 -5
- package/agent/extensions/ask-user/index.ts +418 -418
- package/agent/extensions/ask-user/install.ps1 +4 -0
- package/agent/extensions/ask-user/install.sh +3 -0
- package/agent/extensions/ask-user/package-lock.json +769 -769
- package/agent/extensions/ask-user/package.json +19 -19
- package/agent/extensions/ask-user/prompt.ts +45 -45
- package/agent/extensions/ask-user/tsconfig.json +7 -7
- package/agent/extensions/background-terminals/docs/implementation-guide.md +942 -942
- package/agent/extensions/background-terminals/index.ts +627 -627
- package/agent/extensions/background-terminals/install.ps1 +4 -0
- package/agent/extensions/background-terminals/install.sh +3 -0
- package/agent/extensions/background-terminals/manager.test.ts +735 -735
- package/agent/extensions/background-terminals/output.test.ts +109 -109
- package/agent/extensions/background-terminals/package-lock.json +769 -769
- package/agent/extensions/background-terminals/package.json +17 -17
- package/agent/extensions/background-terminals/prompt.test.ts +125 -125
- package/agent/extensions/background-terminals/ps.test.ts +82 -82
- package/agent/extensions/background-terminals/result-delivery.test.ts +44 -44
- package/agent/extensions/background-terminals/src/domain.ts +87 -87
- package/agent/extensions/background-terminals/src/manager.ts +907 -907
- package/agent/extensions/background-terminals/src/output.ts +84 -84
- package/agent/extensions/background-terminals/src/prompt.ts +142 -142
- package/agent/extensions/background-terminals/src/result-delivery.ts +27 -27
- package/agent/extensions/background-terminals/src/runtime.ts +36 -36
- package/agent/extensions/background-terminals/src/ui/output-view.ts +79 -79
- package/agent/extensions/background-terminals/src/ui/ps.ts +621 -621
- package/agent/extensions/background-terminals/tsconfig.json +7 -7
- package/agent/extensions/destructive/install.ps1 +4 -0
- package/agent/extensions/destructive/install.sh +3 -0
- package/agent/extensions/file-search/index.spec.ts +443 -443
- package/agent/extensions/file-search/index.ts +459 -459
- package/agent/extensions/file-search/install.ps1 +4 -0
- package/agent/extensions/file-search/install.sh +3 -0
- package/agent/extensions/file-search/package-lock.json +2253 -2253
- package/agent/extensions/file-search/package.json +23 -23
- package/agent/extensions/file-search/src/args.ts +122 -122
- package/agent/extensions/file-search/src/binaries.ts +422 -422
- package/agent/extensions/file-search/src/output.ts +126 -126
- package/agent/extensions/file-search/src/process.ts +146 -146
- package/agent/extensions/file-search/src/prompt.ts +52 -52
- package/agent/extensions/file-search/tsconfig.json +7 -7
- package/agent/extensions/goal/install.ps1 +4 -0
- package/agent/extensions/goal/install.sh +3 -0
- package/agent/extensions/herdr-agent-state.ts +257 -0
- package/agent/extensions/kiln-update/README.md +25 -0
- package/agent/extensions/kiln-update/index.ts +99 -0
- package/agent/extensions/kiln-update/install.ps1 +27 -0
- package/agent/extensions/kiln-update/install.sh +24 -0
- package/agent/extensions/modelconf/PLAN.md +915 -915
- package/agent/extensions/modelconf/index.ts +296 -296
- package/agent/extensions/modelconf/install.ps1 +4 -0
- package/agent/extensions/modelconf/install.sh +3 -0
- package/agent/extensions/modelconf/src/ui/ModelConfView.ts +1101 -1101
- package/agent/extensions/pi-web-access/CHANGELOG.md +690 -690
- package/agent/extensions/pi-web-access/LICENSE +21 -21
- package/agent/extensions/pi-web-access/README.md +470 -470
- package/agent/extensions/pi-web-access/SECURITY.md +5 -5
- package/agent/extensions/pi-web-access/activity.ts +101 -101
- package/agent/extensions/pi-web-access/auth-fetch.ts +148 -148
- package/agent/extensions/pi-web-access/brightdata-unlocker.ts +272 -272
- package/agent/extensions/pi-web-access/chrome-cookies.ts +669 -669
- package/agent/extensions/pi-web-access/content-find.ts +139 -139
- package/agent/extensions/pi-web-access/credential-source.ts +191 -191
- package/agent/extensions/pi-web-access/data-uri-sanitize.ts +406 -406
- package/agent/extensions/pi-web-access/datalab-pdf-extract.ts +568 -568
- package/agent/extensions/pi-web-access/declared-web-links.ts +173 -173
- package/agent/extensions/pi-web-access/evidence/CONTRACT-EVIDENCE.md +496 -496
- package/agent/extensions/pi-web-access/evidence/contract-probe.mjs +140 -140
- package/agent/extensions/pi-web-access/exa.ts +526 -526
- package/agent/extensions/pi-web-access/extract.ts +1196 -1196
- package/agent/extensions/pi-web-access/feature-config.ts +29 -29
- package/agent/extensions/pi-web-access/fetch-params.ts +111 -111
- package/agent/extensions/pi-web-access/gemini-adc.ts +298 -298
- package/agent/extensions/pi-web-access/gemini-api.ts +353 -353
- package/agent/extensions/pi-web-access/gemini-pdf-extract.ts +108 -108
- package/agent/extensions/pi-web-access/gemini-url-context.ts +128 -128
- package/agent/extensions/pi-web-access/gemini-web-config.ts +101 -101
- package/agent/extensions/pi-web-access/gemini-web.ts +487 -487
- package/agent/extensions/pi-web-access/github-api.ts +197 -197
- package/agent/extensions/pi-web-access/github-extract.ts +746 -746
- package/agent/extensions/pi-web-access/github-issue-pr.ts +700 -700
- package/agent/extensions/pi-web-access/index.ts +1737 -1737
- package/agent/extensions/pi-web-access/package-lock.json +5808 -5808
- package/agent/extensions/pi-web-access/package.json +64 -64
- package/agent/extensions/pi-web-access/page-query.ts +96 -96
- package/agent/extensions/pi-web-access/pdf-extract.ts +409 -409
- package/agent/extensions/pi-web-access/promise-try.d.ts +7 -7
- package/agent/extensions/pi-web-access/query-rewrite.ts +51 -51
- package/agent/extensions/pi-web-access/render-search-error.ts +170 -170
- package/agent/extensions/pi-web-access/rsc-extract.ts +338 -338
- package/agent/extensions/pi-web-access/source-check.ts +282 -282
- package/agent/extensions/pi-web-access/ssrf-protection.ts +526 -526
- package/agent/extensions/pi-web-access/storage.ts +521 -521
- package/agent/extensions/pi-web-access/summary-model-scope.ts +125 -125
- package/agent/extensions/pi-web-access/test/auth-fetch.test.mjs +208 -208
- package/agent/extensions/pi-web-access/test/brightdata-unlocker.test.mjs +840 -840
- package/agent/extensions/pi-web-access/test/chrome-cookie-extraction.test.mjs +441 -441
- package/agent/extensions/pi-web-access/test/config-path.test.mjs +283 -283
- package/agent/extensions/pi-web-access/test/content-find.test.mjs +25 -25
- package/agent/extensions/pi-web-access/test/credential-source.test.mjs +118 -118
- package/agent/extensions/pi-web-access/test/data-uri-sanitize.test.mjs +210 -210
- package/agent/extensions/pi-web-access/test/datalab-pdf-extract.test.mjs +552 -552
- package/agent/extensions/pi-web-access/test/declared-web-links.test.mjs +212 -212
- package/agent/extensions/pi-web-access/test/fetch-answer-storage.test.mjs +40 -40
- package/agent/extensions/pi-web-access/test/fetch-cache-storage.test.mjs +334 -334
- package/agent/extensions/pi-web-access/test/fetch-content-domain-policy.test.mjs +95 -95
- package/agent/extensions/pi-web-access/test/fetch-modes.test.mjs +53 -53
- package/agent/extensions/pi-web-access/test/fetch-not-found-guidance.test.mjs +92 -92
- package/agent/extensions/pi-web-access/test/fetch-params.test.mjs +86 -86
- package/agent/extensions/pi-web-access/test/fetch-render-call.test.mjs +34 -34
- package/agent/extensions/pi-web-access/test/fetch-routing.test.mjs +173 -173
- package/agent/extensions/pi-web-access/test/gemini-adc-auth.test.mjs +257 -257
- package/agent/extensions/pi-web-access/test/gemini-api-transport.test.mjs +170 -170
- package/agent/extensions/pi-web-access/test/gemini-pdf-extract.test.mjs +133 -133
- package/agent/extensions/pi-web-access/test/gemini-web-cookie-opt-in.test.mjs +178 -178
- package/agent/extensions/pi-web-access/test/gemini-web-header-overflow.test.mjs +148 -148
- package/agent/extensions/pi-web-access/test/get-search-content.test.mjs +223 -223
- package/agent/extensions/pi-web-access/test/github-extract.test.mjs +378 -378
- package/agent/extensions/pi-web-access/test/github-issue-pr.test.mjs +565 -565
- package/agent/extensions/pi-web-access/test/inline-content-config.test.mjs +99 -99
- package/agent/extensions/pi-web-access/test/lazy-extract-load.test.mjs +118 -118
- package/agent/extensions/pi-web-access/test/local-video-oversize.test.mjs +52 -52
- package/agent/extensions/pi-web-access/test/package-typebox-dependency.test.mjs +50 -50
- package/agent/extensions/pi-web-access/test/page-query.test.mjs +51 -51
- package/agent/extensions/pi-web-access/test/pdf-config.test.mjs +140 -140
- package/agent/extensions/pi-web-access/test/pdf-extract.test.mjs +500 -500
- package/agent/extensions/pi-web-access/test/proxy-transport.test.mjs +286 -286
- package/agent/extensions/pi-web-access/test/query-rewrite.test.mjs +52 -52
- package/agent/extensions/pi-web-access/test/rsc-fallback.test.mjs +102 -102
- package/agent/extensions/pi-web-access/test/search-error-render.test.mjs +152 -152
- package/agent/extensions/pi-web-access/test/search-providers.test.mjs +274 -274
- package/agent/extensions/pi-web-access/test/source-check.test.mjs +179 -179
- package/agent/extensions/pi-web-access/test/ssrf-allow-ranges-config.test.mjs +205 -205
- package/agent/extensions/pi-web-access/test/ssrf-protection.test.mjs +456 -456
- package/agent/extensions/pi-web-access/test/tool-registration-config.test.mjs +182 -182
- package/agent/extensions/pi-web-access/test/youtube-extract-errors.test.mjs +64 -64
- package/agent/extensions/pi-web-access/tsconfig.json +11 -11
- package/agent/extensions/pi-web-access/utils.ts +451 -451
- package/agent/extensions/pi-web-access/video-extract.ts +392 -392
- package/agent/extensions/pi-web-access/youtube-extract.ts +328 -328
- package/agent/extensions/shared/activity-status.ts +31 -31
- package/agent/extensions/shared/child-session.test.ts +270 -270
- package/agent/extensions/shared/child-session.ts +148 -148
- package/agent/extensions/shared/context-utilization.test.ts +48 -48
- package/agent/extensions/shared/context-utilization.ts +47 -47
- package/agent/extensions/shared/dashboard-state.ts +99 -99
- package/agent/extensions/shared/install.ps1 +4 -0
- package/agent/extensions/shared/install.sh +3 -0
- package/agent/extensions/shared/tool-call-timeout.test.ts +117 -117
- package/agent/extensions/shared/tool-call-timeout.ts +104 -104
- package/agent/extensions/skillsconf/install.ps1 +4 -0
- package/agent/extensions/skillsconf/install.sh +3 -0
- package/agent/extensions/statusline/index.ts +282 -0
- package/agent/extensions/statusline/install.ps1 +27 -0
- package/agent/extensions/statusline/install.sh +24 -0
- package/agent/extensions/subagents/by-the-way.test.ts +29 -29
- package/agent/extensions/subagents/claude.test.ts +119 -119
- package/agent/extensions/subagents/codex.test.ts +102 -102
- package/agent/extensions/subagents/context-usage.test.ts +107 -107
- package/agent/extensions/subagents/docs/design-plan.md +568 -568
- package/agent/extensions/subagents/docs/effect-v4-extension-guide.md +354 -354
- package/agent/extensions/subagents/docs/effect-v4-notes.md +571 -571
- package/agent/extensions/subagents/index.ts +779 -779
- package/agent/extensions/subagents/install.ps1 +4 -0
- package/agent/extensions/subagents/install.sh +3 -0
- package/agent/extensions/subagents/manager.test.ts +276 -276
- package/agent/extensions/subagents/package-lock.json +2244 -2244
- package/agent/extensions/subagents/package.json +19 -19
- package/agent/extensions/subagents/result-delivery.test.ts +27 -27
- package/agent/extensions/subagents/src/backend.ts +73 -73
- package/agent/extensions/subagents/src/backends/claude.ts +701 -701
- package/agent/extensions/subagents/src/backends/codex.ts +1060 -1060
- package/agent/extensions/subagents/src/backends/pi.ts +575 -575
- package/agent/extensions/subagents/src/backends/stub.ts +300 -300
- package/agent/extensions/subagents/src/by-the-way.ts +21 -21
- package/agent/extensions/subagents/src/domain.ts +253 -253
- package/agent/extensions/subagents/src/format.ts +74 -74
- package/agent/extensions/subagents/src/manager.ts +736 -736
- package/agent/extensions/subagents/src/prompt.ts +92 -92
- package/agent/extensions/subagents/src/result-delivery.ts +20 -20
- package/agent/extensions/subagents/src/runtime.ts +53 -53
- package/agent/extensions/subagents/src/ui/takeover.ts +583 -583
- package/agent/extensions/subagents/src/ui/transcript.ts +201 -201
- package/agent/extensions/subagents/takeover.test.ts +29 -29
- package/agent/extensions/subagents/tsconfig.json +7 -7
- package/agent/extensions/taste/install.ps1 +4 -0
- package/agent/extensions/taste/install.sh +3 -0
- package/agent/extensions/todo/AGENTS.md +38 -38
- package/agent/extensions/todo/LICENSE +21 -21
- package/agent/extensions/todo/config.ts +55 -55
- package/agent/extensions/todo/index.ts +151 -151
- package/agent/extensions/todo/install.ps1 +4 -0
- package/agent/extensions/todo/install.sh +3 -0
- package/agent/extensions/todo/locales/de.json +17 -17
- package/agent/extensions/todo/locales/en.json +15 -15
- package/agent/extensions/todo/locales/es.json +17 -17
- package/agent/extensions/todo/locales/fr.json +17 -17
- package/agent/extensions/todo/locales/pt-BR.json +17 -17
- package/agent/extensions/todo/locales/pt.json +17 -17
- package/agent/extensions/todo/locales/ru.json +17 -17
- package/agent/extensions/todo/locales/uk.json +17 -17
- package/agent/extensions/todo/locales/zh.json +17 -17
- package/agent/extensions/todo/package-lock.json +3358 -3358
- package/agent/extensions/todo/package.json +67 -67
- package/agent/extensions/todo/state/i18n-bridge.ts +64 -64
- package/agent/extensions/todo/state/invariants.ts +20 -20
- package/agent/extensions/todo/state/replay.ts +38 -38
- package/agent/extensions/todo/state/selectors.ts +107 -107
- package/agent/extensions/todo/state/state-reducer.ts +326 -326
- package/agent/extensions/todo/state/state.ts +18 -18
- package/agent/extensions/todo/state/store.ts +82 -82
- package/agent/extensions/todo/state/task-graph.ts +57 -57
- package/agent/extensions/todo/todo-overlay.ts +200 -200
- package/agent/extensions/todo/todo.ts +155 -155
- package/agent/extensions/todo/tool/response-envelope.ts +109 -109
- package/agent/extensions/todo/tool/types.ts +206 -206
- package/agent/extensions/todo/view/format.ts +177 -177
- package/agent/extensions/trim-context/install.ps1 +4 -0
- package/agent/extensions/trim-context/install.sh +3 -0
- package/agent/keybindings.json +7 -7
- package/agent/version.txt +1 -0
- package/agent.bak.20260905-190020/AGENTS.md +67 -0
- package/agent.bak.20260905-190020/README.md +5 -0
- package/agent.bak.20260905-190020/extensions/ask-user/index.ts +418 -0
- package/agent.bak.20260905-190020/extensions/ask-user/package-lock.json +769 -0
- package/agent.bak.20260905-190020/extensions/ask-user/package.json +19 -0
- package/agent.bak.20260905-190020/extensions/ask-user/prompt.ts +45 -0
- package/agent.bak.20260905-190020/extensions/ask-user/tsconfig.json +7 -0
- package/agent.bak.20260905-190020/extensions/background-terminals/docs/implementation-guide.md +942 -0
- package/agent.bak.20260905-190020/extensions/background-terminals/index.ts +629 -0
- package/agent.bak.20260905-190020/extensions/background-terminals/install.ps1 +23 -0
- package/agent.bak.20260905-190020/extensions/background-terminals/install.sh +21 -0
- package/agent.bak.20260905-190020/extensions/background-terminals/package-lock.json +769 -0
- package/agent.bak.20260905-190020/extensions/background-terminals/package.json +17 -0
- package/agent.bak.20260905-190020/extensions/background-terminals/src/domain.ts +87 -0
- package/agent.bak.20260905-190020/extensions/background-terminals/src/manager.ts +907 -0
- package/agent.bak.20260905-190020/extensions/background-terminals/src/output.ts +84 -0
- package/agent.bak.20260905-190020/extensions/background-terminals/src/prompt.ts +142 -0
- package/agent.bak.20260905-190020/extensions/background-terminals/src/result-delivery.ts +27 -0
- package/agent.bak.20260905-190020/extensions/background-terminals/src/runtime.ts +36 -0
- package/agent.bak.20260905-190020/extensions/background-terminals/src/ui/output-view.ts +79 -0
- package/agent.bak.20260905-190020/extensions/background-terminals/src/ui/ps.ts +621 -0
- package/agent.bak.20260905-190020/extensions/background-terminals/src/widget-order.ts +121 -0
- package/agent.bak.20260905-190020/extensions/background-terminals/test/manager.test.ts +735 -0
- package/agent.bak.20260905-190020/extensions/background-terminals/test/output.test.ts +109 -0
- package/agent.bak.20260905-190020/extensions/background-terminals/test/prompt.test.ts +125 -0
- package/agent.bak.20260905-190020/extensions/background-terminals/test/ps.test.ts +82 -0
- package/agent.bak.20260905-190020/extensions/background-terminals/test/result-delivery.test.ts +44 -0
- package/agent.bak.20260905-190020/extensions/background-terminals/tsconfig.json +7 -0
- package/agent.bak.20260905-190020/extensions/destructive/README.md +34 -0
- package/agent.bak.20260905-190020/extensions/destructive/index.ts +124 -0
- package/agent.bak.20260905-190020/extensions/destructive/install.ps1 +23 -0
- package/agent.bak.20260905-190020/extensions/destructive/install.sh +21 -0
- package/agent.bak.20260905-190020/extensions/file-search/index.ts +459 -0
- package/agent.bak.20260905-190020/extensions/file-search/install.ps1 +23 -0
- package/agent.bak.20260905-190020/extensions/file-search/install.sh +21 -0
- package/agent.bak.20260905-190020/extensions/file-search/package-lock.json +2253 -0
- package/agent.bak.20260905-190020/extensions/file-search/package.json +23 -0
- package/agent.bak.20260905-190020/extensions/file-search/src/args.ts +122 -0
- package/agent.bak.20260905-190020/extensions/file-search/src/binaries.ts +422 -0
- package/agent.bak.20260905-190020/extensions/file-search/src/output.ts +126 -0
- package/agent.bak.20260905-190020/extensions/file-search/src/process.ts +146 -0
- package/agent.bak.20260905-190020/extensions/file-search/src/prompt.ts +52 -0
- package/agent.bak.20260905-190020/extensions/file-search/test/index.spec.ts +443 -0
- package/agent.bak.20260905-190020/extensions/file-search/tsconfig.json +7 -0
- package/agent.bak.20260905-190020/extensions/goal/README.md +50 -0
- package/agent.bak.20260905-190020/extensions/goal/index.ts +155 -0
- package/agent.bak.20260905-190020/extensions/goal/install.ps1 +23 -0
- package/agent.bak.20260905-190020/extensions/goal/install.sh +21 -0
- package/agent.bak.20260905-190020/extensions/kiln-update/README.md +25 -0
- package/agent.bak.20260905-190020/extensions/kiln-update/index.ts +99 -0
- package/agent.bak.20260905-190020/extensions/kiln-update/install.ps1 +23 -0
- package/agent.bak.20260905-190020/extensions/kiln-update/install.sh +21 -0
- package/agent.bak.20260905-190020/extensions/modelconf/PLAN.md +915 -0
- package/agent.bak.20260905-190020/extensions/modelconf/README.md +66 -0
- package/agent.bak.20260905-190020/extensions/modelconf/index.ts +296 -0
- package/agent.bak.20260905-190020/extensions/modelconf/install.ps1 +23 -0
- package/agent.bak.20260905-190020/extensions/modelconf/install.sh +21 -0
- package/agent.bak.20260905-190020/extensions/modelconf/package-lock.json +1809 -0
- package/agent.bak.20260905-190020/extensions/modelconf/package.json +13 -0
- package/agent.bak.20260905-190020/extensions/modelconf/src/fuzzy.ts +26 -0
- package/agent.bak.20260905-190020/extensions/modelconf/src/glob.ts +13 -0
- package/agent.bak.20260905-190020/extensions/modelconf/src/persistence.test.ts +46 -0
- package/agent.bak.20260905-190020/extensions/modelconf/src/persistence.ts +164 -0
- package/agent.bak.20260905-190020/extensions/modelconf/src/ui/ModelConfView.test.ts +75 -0
- package/agent.bak.20260905-190020/extensions/modelconf/src/ui/ModelConfView.ts +1101 -0
- package/agent.bak.20260905-190020/extensions/modelconf/tsconfig.json +15 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/CHANGELOG.md +690 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/LICENSE +21 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/README.md +470 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/SECURITY.md +5 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/activity.ts +101 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/auth-fetch.ts +148 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/banner.png +0 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/brightdata-unlocker.ts +272 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/chrome-cookies.ts +669 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/content-find.ts +139 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/credential-source.ts +191 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/data-uri-sanitize.ts +406 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/datalab-pdf-extract.ts +568 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/declared-web-links.ts +173 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/evidence/CONTRACT-EVIDENCE.md +496 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/evidence/contract-probe.mjs +140 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/exa.ts +526 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/extract.ts +1196 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/feature-config.ts +29 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/fetch-params.ts +111 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/gemini-adc.ts +298 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/gemini-api.ts +353 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/gemini-pdf-extract.ts +108 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/gemini-search.ts +21 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/gemini-url-context.ts +128 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/gemini-web-config.ts +101 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/gemini-web.ts +487 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/github-api.ts +197 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/github-extract.ts +746 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/github-issue-pr.ts +700 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/index.ts +1737 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/package-lock.json +5808 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/package.json +64 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/page-query.ts +96 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/pdf-extract.ts +409 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/pi-web-fetch-demo.mp4 +0 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/promise-try.d.ts +7 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/query-rewrite.ts +51 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/render-search-error.ts +170 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/rsc-extract.ts +338 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/search-types.ts +20 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/source-check.ts +282 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/ssrf-protection.ts +526 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/storage.ts +521 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/summary-model-scope.ts +125 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/auth-fetch.test.mjs +208 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/brightdata-unlocker.test.mjs +840 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/chrome-cookie-extraction.test.mjs +441 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/config-path.test.mjs +283 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/content-find.test.mjs +25 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/credential-source.test.mjs +118 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/data-uri-sanitize.test.mjs +210 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/datalab-pdf-extract.test.mjs +552 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/declared-web-links.test.mjs +212 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/fetch-answer-storage.test.mjs +40 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/fetch-cache-storage.test.mjs +334 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/fetch-content-domain-policy.test.mjs +95 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/fetch-modes.test.mjs +53 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/fetch-not-found-guidance.test.mjs +92 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/fetch-params.test.mjs +86 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/fetch-render-call.test.mjs +34 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/fetch-routing.test.mjs +173 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/gemini-adc-auth.test.mjs +257 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/gemini-api-transport.test.mjs +170 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/gemini-pdf-extract.test.mjs +133 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/gemini-web-cookie-opt-in.test.mjs +178 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/gemini-web-header-overflow.test.mjs +148 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/get-search-content.test.mjs +223 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/github-extract.test.mjs +378 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/github-issue-pr.test.mjs +565 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/inline-content-config.test.mjs +99 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/lazy-extract-load.test.mjs +118 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/local-video-oversize.test.mjs +52 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/package-typebox-dependency.test.mjs +50 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/page-query.test.mjs +51 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/pdf-config.test.mjs +140 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/pdf-extract.test.mjs +500 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/proxy-transport.test.mjs +286 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/query-rewrite.test.mjs +52 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/rsc-fallback.test.mjs +102 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/search-error-render.test.mjs +152 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/search-providers.test.mjs +274 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/source-check.test.mjs +179 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/ssrf-allow-ranges-config.test.mjs +205 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/ssrf-protection.test.mjs +456 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/summary-model-scope.test.mjs +106 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/tool-registration-config.test.mjs +182 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/web-search-answer-render.test.mjs +66 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/test/youtube-extract-errors.test.mjs +64 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/tsconfig.json +11 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/utils.ts +451 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/video-extract.ts +392 -0
- package/agent.bak.20260905-190020/extensions/pi-web-access/youtube-extract.ts +328 -0
- package/agent.bak.20260905-190020/extensions/shared/activity-status.ts +31 -0
- package/agent.bak.20260905-190020/extensions/shared/child-session.ts +148 -0
- package/agent.bak.20260905-190020/extensions/shared/context-utilization.ts +47 -0
- package/agent.bak.20260905-190020/extensions/shared/dashboard-state.ts +99 -0
- package/agent.bak.20260905-190020/extensions/shared/install.ps1 +23 -0
- package/agent.bak.20260905-190020/extensions/shared/install.sh +21 -0
- package/agent.bak.20260905-190020/extensions/shared/test/child-session.test.ts +270 -0
- package/agent.bak.20260905-190020/extensions/shared/test/context-utilization.test.ts +48 -0
- package/agent.bak.20260905-190020/extensions/shared/test/tool-call-timeout.test.ts +117 -0
- package/agent.bak.20260905-190020/extensions/shared/test/widget-order.test.ts +167 -0
- package/agent.bak.20260905-190020/extensions/shared/tool-call-timeout.ts +104 -0
- package/agent.bak.20260905-190020/extensions/skillsconf/README.md +74 -0
- package/agent.bak.20260905-190020/extensions/skillsconf/index.ts +92 -0
- package/agent.bak.20260905-190020/extensions/skillsconf/install.ps1 +23 -0
- package/agent.bak.20260905-190020/extensions/skillsconf/install.sh +21 -0
- package/agent.bak.20260905-190020/extensions/skillsconf/package-lock.json +1809 -0
- package/agent.bak.20260905-190020/extensions/skillsconf/package.json +18 -0
- package/agent.bak.20260905-190020/extensions/skillsconf/src/delete-skill.test.ts +64 -0
- package/agent.bak.20260905-190020/extensions/skillsconf/src/delete-skill.ts +45 -0
- package/agent.bak.20260905-190020/extensions/skillsconf/src/filter.test.ts +80 -0
- package/agent.bak.20260905-190020/extensions/skillsconf/src/filter.ts +74 -0
- package/agent.bak.20260905-190020/extensions/skillsconf/src/fuzzy.ts +26 -0
- package/agent.bak.20260905-190020/extensions/skillsconf/src/persistence.test.ts +72 -0
- package/agent.bak.20260905-190020/extensions/skillsconf/src/persistence.ts +169 -0
- package/agent.bak.20260905-190020/extensions/skillsconf/src/ui/SkillConfView.test.ts +337 -0
- package/agent.bak.20260905-190020/extensions/skillsconf/src/ui/SkillConfView.ts +758 -0
- package/agent.bak.20260905-190020/extensions/skillsconf/src/ui/text-input.ts +91 -0
- package/agent.bak.20260905-190020/extensions/skillsconf/src/ui/tui-helpers.ts +144 -0
- package/agent.bak.20260905-190020/extensions/skillsconf/tsconfig.json +15 -0
- package/agent.bak.20260905-190020/extensions/statusline/install.ps1 +23 -0
- package/agent.bak.20260905-190020/extensions/statusline/install.sh +21 -0
- package/agent.bak.20260905-190020/extensions/subagents/docs/design-plan.md +568 -0
- package/agent.bak.20260905-190020/extensions/subagents/docs/effect-v4-extension-guide.md +354 -0
- package/agent.bak.20260905-190020/extensions/subagents/docs/effect-v4-notes.md +571 -0
- package/agent.bak.20260905-190020/extensions/subagents/index.ts +826 -0
- package/agent.bak.20260905-190020/extensions/subagents/install.ps1 +23 -0
- package/agent.bak.20260905-190020/extensions/subagents/install.sh +21 -0
- package/agent.bak.20260905-190020/extensions/subagents/package-lock.json +2244 -0
- package/agent.bak.20260905-190020/extensions/subagents/package.json +19 -0
- package/agent.bak.20260905-190020/extensions/subagents/src/backend.ts +73 -0
- package/agent.bak.20260905-190020/extensions/subagents/src/backends/claude.ts +701 -0
- package/agent.bak.20260905-190020/extensions/subagents/src/backends/codex.ts +1060 -0
- package/agent.bak.20260905-190020/extensions/subagents/src/backends/pi.ts +575 -0
- package/agent.bak.20260905-190020/extensions/subagents/src/backends/stub.ts +300 -0
- package/agent.bak.20260905-190020/extensions/subagents/src/by-the-way.ts +21 -0
- package/agent.bak.20260905-190020/extensions/subagents/src/domain.ts +253 -0
- package/agent.bak.20260905-190020/extensions/subagents/src/format.ts +74 -0
- package/agent.bak.20260905-190020/extensions/subagents/src/manager.ts +736 -0
- package/agent.bak.20260905-190020/extensions/subagents/src/prompt.ts +92 -0
- package/agent.bak.20260905-190020/extensions/subagents/src/result-delivery.ts +20 -0
- package/agent.bak.20260905-190020/extensions/subagents/src/runtime.ts +53 -0
- package/agent.bak.20260905-190020/extensions/subagents/src/ui/takeover.ts +583 -0
- package/agent.bak.20260905-190020/extensions/subagents/src/ui/transcript.ts +201 -0
- package/agent.bak.20260905-190020/extensions/subagents/src/widget-order.ts +121 -0
- package/agent.bak.20260905-190020/extensions/subagents/test/by-the-way.test.ts +29 -0
- package/agent.bak.20260905-190020/extensions/subagents/test/claude.test.ts +119 -0
- package/agent.bak.20260905-190020/extensions/subagents/test/codex.test.ts +102 -0
- package/agent.bak.20260905-190020/extensions/subagents/test/context-usage.test.ts +107 -0
- package/agent.bak.20260905-190020/extensions/subagents/test/manager.test.ts +276 -0
- package/agent.bak.20260905-190020/extensions/subagents/test/result-delivery.test.ts +27 -0
- package/agent.bak.20260905-190020/extensions/subagents/test/takeover.test.ts +29 -0
- package/agent.bak.20260905-190020/extensions/subagents/tsconfig.json +7 -0
- package/agent.bak.20260905-190020/extensions/taste/index.ts +443 -0
- package/agent.bak.20260905-190020/extensions/taste/install.ps1 +23 -0
- package/agent.bak.20260905-190020/extensions/taste/install.sh +21 -0
- package/agent.bak.20260905-190020/extensions/todo/AGENTS.md +38 -0
- package/agent.bak.20260905-190020/extensions/todo/LICENSE +21 -0
- package/agent.bak.20260905-190020/extensions/todo/config.ts +55 -0
- package/agent.bak.20260905-190020/extensions/todo/index.ts +151 -0
- package/agent.bak.20260905-190020/extensions/todo/install.ps1 +23 -0
- package/agent.bak.20260905-190020/extensions/todo/install.sh +21 -0
- package/agent.bak.20260905-190020/extensions/todo/locales/de.json +17 -0
- package/agent.bak.20260905-190020/extensions/todo/locales/en.json +15 -0
- package/agent.bak.20260905-190020/extensions/todo/locales/es.json +17 -0
- package/agent.bak.20260905-190020/extensions/todo/locales/fr.json +17 -0
- package/agent.bak.20260905-190020/extensions/todo/locales/pt-BR.json +17 -0
- package/agent.bak.20260905-190020/extensions/todo/locales/pt.json +17 -0
- package/agent.bak.20260905-190020/extensions/todo/locales/ru.json +17 -0
- package/agent.bak.20260905-190020/extensions/todo/locales/uk.json +17 -0
- package/agent.bak.20260905-190020/extensions/todo/locales/zh.json +17 -0
- package/agent.bak.20260905-190020/extensions/todo/package-lock.json +3358 -0
- package/agent.bak.20260905-190020/extensions/todo/package.json +67 -0
- package/agent.bak.20260905-190020/extensions/todo/state/i18n-bridge.ts +64 -0
- package/agent.bak.20260905-190020/extensions/todo/state/invariants.ts +20 -0
- package/agent.bak.20260905-190020/extensions/todo/state/replay.ts +38 -0
- package/agent.bak.20260905-190020/extensions/todo/state/selectors.ts +107 -0
- package/agent.bak.20260905-190020/extensions/todo/state/state-reducer.ts +326 -0
- package/agent.bak.20260905-190020/extensions/todo/state/state.ts +18 -0
- package/agent.bak.20260905-190020/extensions/todo/state/store.ts +82 -0
- package/agent.bak.20260905-190020/extensions/todo/state/task-graph.ts +57 -0
- package/agent.bak.20260905-190020/extensions/todo/todo-overlay.ts +204 -0
- package/agent.bak.20260905-190020/extensions/todo/todo.ts +155 -0
- package/agent.bak.20260905-190020/extensions/todo/tool/response-envelope.ts +109 -0
- package/agent.bak.20260905-190020/extensions/todo/tool/types.ts +206 -0
- package/agent.bak.20260905-190020/extensions/todo/view/format.ts +177 -0
- package/agent.bak.20260905-190020/extensions/todo/widget-order.ts +121 -0
- package/agent.bak.20260905-190020/extensions/trim-context/README.md +54 -0
- package/agent.bak.20260905-190020/extensions/trim-context/index.ts +487 -0
- package/agent.bak.20260905-190020/extensions/trim-context/install.ps1 +23 -0
- package/agent.bak.20260905-190020/extensions/trim-context/install.sh +21 -0
- package/agent.bak.20260905-190020/keybindings.json +7 -0
- package/bin/kiln.js +588 -358
- package/package.json +27 -21
- package/agent/install.ps1 +0 -527
- package/agent/install.sh +0 -511
- /package/{agent/extensions/status line → agent.bak.20260905-190020/extensions/ask-user}/install.ps1 +0 -0
- /package/{agent/extensions/status line → agent.bak.20260905-190020/extensions/ask-user}/install.sh +0 -0
- /package/{agent/extensions/status line → agent.bak.20260905-190020/extensions/statusline}/index.ts +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
# Security Policy
|
|
2
|
-
|
|
3
|
-
Please report suspected vulnerabilities through GitHub private vulnerability reporting for this repository. Do not post exploit details, secrets, or proof-of-concept payloads in public issues or pull requests.
|
|
4
|
-
|
|
5
|
-
If private vulnerability reporting is unavailable for your account or this repository, open a minimal public issue asking for a private contact path without including technical details.
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
Please report suspected vulnerabilities through GitHub private vulnerability reporting for this repository. Do not post exploit details, secrets, or proof-of-concept payloads in public issues or pull requests.
|
|
4
|
+
|
|
5
|
+
If private vulnerability reporting is unavailable for your account or this repository, open a minimal public issue asking for a private contact path without including technical details.
|
|
@@ -1,101 +1,101 @@
|
|
|
1
|
-
// Types
|
|
2
|
-
export interface ActivityEntry {
|
|
3
|
-
id: string;
|
|
4
|
-
type: "api" | "fetch";
|
|
5
|
-
startTime: number;
|
|
6
|
-
endTime?: number;
|
|
7
|
-
|
|
8
|
-
// For API calls
|
|
9
|
-
query?: string;
|
|
10
|
-
|
|
11
|
-
// For URL fetches
|
|
12
|
-
url?: string;
|
|
13
|
-
|
|
14
|
-
// Result - status is number (HTTP code) or null (pending/network error)
|
|
15
|
-
status: number | null;
|
|
16
|
-
error?: string;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export interface RateLimitInfo {
|
|
20
|
-
used: number;
|
|
21
|
-
max: number;
|
|
22
|
-
oldestTimestamp: number | null;
|
|
23
|
-
windowMs: number;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export class ActivityMonitor {
|
|
27
|
-
private entries: ActivityEntry[] = [];
|
|
28
|
-
private readonly maxEntries = 10;
|
|
29
|
-
private listeners = new Set<() => void>();
|
|
30
|
-
private rateLimitInfo: RateLimitInfo = { used: 0, max: 10, oldestTimestamp: null, windowMs: 60000 };
|
|
31
|
-
private nextId = 1;
|
|
32
|
-
|
|
33
|
-
logStart(partial: Omit<ActivityEntry, "id" | "startTime" | "status">): string {
|
|
34
|
-
const id = `act-${this.nextId++}`;
|
|
35
|
-
const entry: ActivityEntry = {
|
|
36
|
-
...partial,
|
|
37
|
-
id,
|
|
38
|
-
startTime: Date.now(),
|
|
39
|
-
status: null,
|
|
40
|
-
};
|
|
41
|
-
this.entries.push(entry);
|
|
42
|
-
if (this.entries.length > this.maxEntries) {
|
|
43
|
-
this.entries.shift();
|
|
44
|
-
}
|
|
45
|
-
this.notify();
|
|
46
|
-
return id;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
logComplete(id: string, status: number): void {
|
|
50
|
-
const entry = this.entries.find((e) => e.id === id);
|
|
51
|
-
if (entry) {
|
|
52
|
-
entry.endTime = Date.now();
|
|
53
|
-
entry.status = status;
|
|
54
|
-
this.notify();
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
logError(id: string, error: string): void {
|
|
59
|
-
const entry = this.entries.find((e) => e.id === id);
|
|
60
|
-
if (entry) {
|
|
61
|
-
entry.endTime = Date.now();
|
|
62
|
-
entry.error = error;
|
|
63
|
-
this.notify();
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
getEntries(): readonly ActivityEntry[] {
|
|
68
|
-
return this.entries;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
getRateLimitInfo(): RateLimitInfo {
|
|
72
|
-
return this.rateLimitInfo;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
updateRateLimit(info: RateLimitInfo): void {
|
|
76
|
-
this.rateLimitInfo = info;
|
|
77
|
-
this.notify();
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
onUpdate(callback: () => void): () => void {
|
|
81
|
-
this.listeners.add(callback);
|
|
82
|
-
return () => this.listeners.delete(callback);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
clear(): void {
|
|
86
|
-
this.entries = [];
|
|
87
|
-
this.rateLimitInfo = { used: 0, max: 10, oldestTimestamp: null, windowMs: 60000 };
|
|
88
|
-
this.notify();
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
private notify(): void {
|
|
92
|
-
for (const cb of this.listeners) {
|
|
93
|
-
try {
|
|
94
|
-
cb();
|
|
95
|
-
} catch {
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
export const activityMonitor = new ActivityMonitor();
|
|
1
|
+
// Types
|
|
2
|
+
export interface ActivityEntry {
|
|
3
|
+
id: string;
|
|
4
|
+
type: "api" | "fetch";
|
|
5
|
+
startTime: number;
|
|
6
|
+
endTime?: number;
|
|
7
|
+
|
|
8
|
+
// For API calls
|
|
9
|
+
query?: string;
|
|
10
|
+
|
|
11
|
+
// For URL fetches
|
|
12
|
+
url?: string;
|
|
13
|
+
|
|
14
|
+
// Result - status is number (HTTP code) or null (pending/network error)
|
|
15
|
+
status: number | null;
|
|
16
|
+
error?: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface RateLimitInfo {
|
|
20
|
+
used: number;
|
|
21
|
+
max: number;
|
|
22
|
+
oldestTimestamp: number | null;
|
|
23
|
+
windowMs: number;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export class ActivityMonitor {
|
|
27
|
+
private entries: ActivityEntry[] = [];
|
|
28
|
+
private readonly maxEntries = 10;
|
|
29
|
+
private listeners = new Set<() => void>();
|
|
30
|
+
private rateLimitInfo: RateLimitInfo = { used: 0, max: 10, oldestTimestamp: null, windowMs: 60000 };
|
|
31
|
+
private nextId = 1;
|
|
32
|
+
|
|
33
|
+
logStart(partial: Omit<ActivityEntry, "id" | "startTime" | "status">): string {
|
|
34
|
+
const id = `act-${this.nextId++}`;
|
|
35
|
+
const entry: ActivityEntry = {
|
|
36
|
+
...partial,
|
|
37
|
+
id,
|
|
38
|
+
startTime: Date.now(),
|
|
39
|
+
status: null,
|
|
40
|
+
};
|
|
41
|
+
this.entries.push(entry);
|
|
42
|
+
if (this.entries.length > this.maxEntries) {
|
|
43
|
+
this.entries.shift();
|
|
44
|
+
}
|
|
45
|
+
this.notify();
|
|
46
|
+
return id;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
logComplete(id: string, status: number): void {
|
|
50
|
+
const entry = this.entries.find((e) => e.id === id);
|
|
51
|
+
if (entry) {
|
|
52
|
+
entry.endTime = Date.now();
|
|
53
|
+
entry.status = status;
|
|
54
|
+
this.notify();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
logError(id: string, error: string): void {
|
|
59
|
+
const entry = this.entries.find((e) => e.id === id);
|
|
60
|
+
if (entry) {
|
|
61
|
+
entry.endTime = Date.now();
|
|
62
|
+
entry.error = error;
|
|
63
|
+
this.notify();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
getEntries(): readonly ActivityEntry[] {
|
|
68
|
+
return this.entries;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
getRateLimitInfo(): RateLimitInfo {
|
|
72
|
+
return this.rateLimitInfo;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
updateRateLimit(info: RateLimitInfo): void {
|
|
76
|
+
this.rateLimitInfo = info;
|
|
77
|
+
this.notify();
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
onUpdate(callback: () => void): () => void {
|
|
81
|
+
this.listeners.add(callback);
|
|
82
|
+
return () => this.listeners.delete(callback);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
clear(): void {
|
|
86
|
+
this.entries = [];
|
|
87
|
+
this.rateLimitInfo = { used: 0, max: 10, oldestTimestamp: null, windowMs: 60000 };
|
|
88
|
+
this.notify();
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
private notify(): void {
|
|
92
|
+
for (const cb of this.listeners) {
|
|
93
|
+
try {
|
|
94
|
+
cb();
|
|
95
|
+
} catch {
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export const activityMonitor = new ActivityMonitor();
|
|
@@ -1,148 +1,148 @@
|
|
|
1
|
-
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
-
import { getWebSearchConfigPath } from "./utils.ts";
|
|
3
|
-
|
|
4
|
-
const WEB_SEARCH_CONFIG_PATH = getWebSearchConfigPath();
|
|
5
|
-
const AUTH_PROFILE_NAME_PATTERN = /^[A-Za-z][A-Za-z0-9_-]{0,63}$/;
|
|
6
|
-
|
|
7
|
-
export type AuthFetchRequest = true | string;
|
|
8
|
-
export type AuthFetchCache = "session" | "off";
|
|
9
|
-
|
|
10
|
-
export interface AuthFetchProfile {
|
|
11
|
-
name: string;
|
|
12
|
-
hosts: string[];
|
|
13
|
-
chromeProfile?: string;
|
|
14
|
-
redirects: "same-origin";
|
|
15
|
-
cache: AuthFetchCache;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
interface AuthFetchConfigRoot {
|
|
19
|
-
authFetch?: unknown;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export function resolveAuthFetchProfile(request: AuthFetchRequest): AuthFetchProfile {
|
|
23
|
-
const profiles = loadAuthFetchProfiles();
|
|
24
|
-
if (profiles.length === 0) {
|
|
25
|
-
throw new Error(`auth requires at least one authFetch profile in ${WEB_SEARCH_CONFIG_PATH}`);
|
|
26
|
-
}
|
|
27
|
-
if (request === true) {
|
|
28
|
-
if (profiles.length !== 1) {
|
|
29
|
-
throw new Error("auth: true requires exactly one authFetch profile; use a profile name instead");
|
|
30
|
-
}
|
|
31
|
-
return profiles[0];
|
|
32
|
-
}
|
|
33
|
-
const name = request.trim();
|
|
34
|
-
const profile = profiles.find(candidate => candidate.name === name);
|
|
35
|
-
if (!profile) throw new Error(`Unknown authFetch profile: ${name}`);
|
|
36
|
-
return profile;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export function assertAuthFetchUrl(profile: AuthFetchProfile, rawUrl: string): URL {
|
|
40
|
-
let url: URL;
|
|
41
|
-
try {
|
|
42
|
-
url = new URL(rawUrl);
|
|
43
|
-
} catch (err) {
|
|
44
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
45
|
-
throw new Error(`Authenticated fetch requires an HTTPS URL: ${message}`);
|
|
46
|
-
}
|
|
47
|
-
if (url.protocol !== "https:") throw new Error("Authenticated fetch requires an HTTPS URL");
|
|
48
|
-
const hostname = normalizeHostname(url.hostname);
|
|
49
|
-
if (!profile.hosts.some(host => hostMatches(hostname, host))) {
|
|
50
|
-
throw new Error(`URL host ${hostname} is not allowed by authFetch profile ${profile.name}`);
|
|
51
|
-
}
|
|
52
|
-
return url;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export function authFetchRedirectGuard(profile: AuthFetchProfile, from: URL, to: URL): void {
|
|
56
|
-
if (profile.redirects === "same-origin" && to.origin !== from.origin) {
|
|
57
|
-
throw new Error(`Authenticated fetch refused cross-origin redirect: ${from.origin} -> ${to.origin}`);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
function loadAuthFetchProfiles(): AuthFetchProfile[] {
|
|
62
|
-
if (!existsSync(WEB_SEARCH_CONFIG_PATH)) return [];
|
|
63
|
-
const raw = readFileSync(WEB_SEARCH_CONFIG_PATH, "utf-8");
|
|
64
|
-
let parsed: AuthFetchConfigRoot;
|
|
65
|
-
try {
|
|
66
|
-
const value: unknown = JSON.parse(raw);
|
|
67
|
-
if (!value || typeof value !== "object" || Array.isArray(value)) throw new Error("expected a JSON object");
|
|
68
|
-
parsed = value as AuthFetchConfigRoot;
|
|
69
|
-
} catch (err) {
|
|
70
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
71
|
-
throw new Error(`Failed to parse ${WEB_SEARCH_CONFIG_PATH}: ${message}`);
|
|
72
|
-
}
|
|
73
|
-
if (parsed.authFetch === undefined || parsed.authFetch === null) return [];
|
|
74
|
-
if (typeof parsed.authFetch !== "object" || Array.isArray(parsed.authFetch)) {
|
|
75
|
-
throw new Error(`authFetch in ${WEB_SEARCH_CONFIG_PATH} must be an object`);
|
|
76
|
-
}
|
|
77
|
-
return Object.entries(parsed.authFetch as Record<string, unknown>).map(([name, value]) => parseProfile(name, value));
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
function parseProfile(name: string, value: unknown): AuthFetchProfile {
|
|
81
|
-
if (!AUTH_PROFILE_NAME_PATTERN.test(name)) {
|
|
82
|
-
throw new Error(`authFetch profile name ${JSON.stringify(name)} must start with a letter and contain only letters, numbers, underscores, or hyphens`);
|
|
83
|
-
}
|
|
84
|
-
if (Array.isArray(value)) {
|
|
85
|
-
return { name, hosts: parseHosts(value, `authFetch.${name}`), redirects: "same-origin", cache: "session" };
|
|
86
|
-
}
|
|
87
|
-
if (!value || typeof value !== "object") {
|
|
88
|
-
throw new Error(`authFetch.${name} in ${WEB_SEARCH_CONFIG_PATH} must be an array of hosts or an object`);
|
|
89
|
-
}
|
|
90
|
-
const config = value as Record<string, unknown>;
|
|
91
|
-
if (!Array.isArray(config.hosts)) {
|
|
92
|
-
throw new Error(`authFetch.${name}.hosts in ${WEB_SEARCH_CONFIG_PATH} must be a non-empty array of hostnames`);
|
|
93
|
-
}
|
|
94
|
-
const redirects = config.redirects ?? "same-origin";
|
|
95
|
-
if (redirects !== "same-origin") {
|
|
96
|
-
throw new Error(`authFetch.${name}.redirects in ${WEB_SEARCH_CONFIG_PATH} must be "same-origin"`);
|
|
97
|
-
}
|
|
98
|
-
const cache = config.cache ?? "session";
|
|
99
|
-
if (cache !== "session" && cache !== "off") {
|
|
100
|
-
throw new Error(`authFetch.${name}.cache in ${WEB_SEARCH_CONFIG_PATH} must be "session" or "off"`);
|
|
101
|
-
}
|
|
102
|
-
const chromeProfile = parseChromeProfile(config.chromeProfile, `authFetch.${name}.chromeProfile`);
|
|
103
|
-
return {
|
|
104
|
-
name,
|
|
105
|
-
hosts: parseHosts(config.hosts, `authFetch.${name}.hosts`),
|
|
106
|
-
...(chromeProfile ? { chromeProfile } : {}),
|
|
107
|
-
redirects,
|
|
108
|
-
cache,
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
function parseHosts(value: unknown[], label: string): string[] {
|
|
113
|
-
if (value.length === 0) throw new Error(`${label} in ${WEB_SEARCH_CONFIG_PATH} must be a non-empty array of hostnames`);
|
|
114
|
-
const hosts = value.map((entry) => {
|
|
115
|
-
if (typeof entry !== "string") throw new Error(`${label} in ${WEB_SEARCH_CONFIG_PATH} must contain only hostnames`);
|
|
116
|
-
return parseHost(entry, label);
|
|
117
|
-
});
|
|
118
|
-
return [...new Set(hosts)];
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
function parseHost(value: string, label: string): string {
|
|
122
|
-
const host = normalizeHostname(value.trim());
|
|
123
|
-
if (!host || host.startsWith(".") || host.endsWith(".") || /\s|[\\/?:#@*]/.test(host)) {
|
|
124
|
-
throw new Error(`${label} in ${WEB_SEARCH_CONFIG_PATH} contains an invalid hostname: ${JSON.stringify(value)}`);
|
|
125
|
-
}
|
|
126
|
-
if (host.length > 253 || !/^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)*[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/i.test(host)) {
|
|
127
|
-
throw new Error(`${label} in ${WEB_SEARCH_CONFIG_PATH} contains an invalid hostname: ${JSON.stringify(value)}`);
|
|
128
|
-
}
|
|
129
|
-
return host;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
function parseChromeProfile(value: unknown, label: string): string | undefined {
|
|
133
|
-
if (value === undefined || value === null) return undefined;
|
|
134
|
-
if (typeof value !== "string") throw new Error(`${label} in ${WEB_SEARCH_CONFIG_PATH} must be a string`);
|
|
135
|
-
const normalized = value.trim();
|
|
136
|
-
if (!normalized || normalized === "." || normalized === ".." || normalized.includes("/") || normalized.includes("\\")) {
|
|
137
|
-
throw new Error(`${label} in ${WEB_SEARCH_CONFIG_PATH} must be a profile directory name, not a path`);
|
|
138
|
-
}
|
|
139
|
-
return normalized;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
function normalizeHostname(hostname: string): string {
|
|
143
|
-
return hostname.toLowerCase().replace(/^\[|\]$/g, "").replace(/\.$/, "");
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
function hostMatches(hostname: string, allowedHost: string): boolean {
|
|
147
|
-
return hostname === allowedHost || hostname.endsWith(`.${allowedHost}`);
|
|
148
|
-
}
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { getWebSearchConfigPath } from "./utils.ts";
|
|
3
|
+
|
|
4
|
+
const WEB_SEARCH_CONFIG_PATH = getWebSearchConfigPath();
|
|
5
|
+
const AUTH_PROFILE_NAME_PATTERN = /^[A-Za-z][A-Za-z0-9_-]{0,63}$/;
|
|
6
|
+
|
|
7
|
+
export type AuthFetchRequest = true | string;
|
|
8
|
+
export type AuthFetchCache = "session" | "off";
|
|
9
|
+
|
|
10
|
+
export interface AuthFetchProfile {
|
|
11
|
+
name: string;
|
|
12
|
+
hosts: string[];
|
|
13
|
+
chromeProfile?: string;
|
|
14
|
+
redirects: "same-origin";
|
|
15
|
+
cache: AuthFetchCache;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
interface AuthFetchConfigRoot {
|
|
19
|
+
authFetch?: unknown;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function resolveAuthFetchProfile(request: AuthFetchRequest): AuthFetchProfile {
|
|
23
|
+
const profiles = loadAuthFetchProfiles();
|
|
24
|
+
if (profiles.length === 0) {
|
|
25
|
+
throw new Error(`auth requires at least one authFetch profile in ${WEB_SEARCH_CONFIG_PATH}`);
|
|
26
|
+
}
|
|
27
|
+
if (request === true) {
|
|
28
|
+
if (profiles.length !== 1) {
|
|
29
|
+
throw new Error("auth: true requires exactly one authFetch profile; use a profile name instead");
|
|
30
|
+
}
|
|
31
|
+
return profiles[0];
|
|
32
|
+
}
|
|
33
|
+
const name = request.trim();
|
|
34
|
+
const profile = profiles.find(candidate => candidate.name === name);
|
|
35
|
+
if (!profile) throw new Error(`Unknown authFetch profile: ${name}`);
|
|
36
|
+
return profile;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function assertAuthFetchUrl(profile: AuthFetchProfile, rawUrl: string): URL {
|
|
40
|
+
let url: URL;
|
|
41
|
+
try {
|
|
42
|
+
url = new URL(rawUrl);
|
|
43
|
+
} catch (err) {
|
|
44
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
45
|
+
throw new Error(`Authenticated fetch requires an HTTPS URL: ${message}`);
|
|
46
|
+
}
|
|
47
|
+
if (url.protocol !== "https:") throw new Error("Authenticated fetch requires an HTTPS URL");
|
|
48
|
+
const hostname = normalizeHostname(url.hostname);
|
|
49
|
+
if (!profile.hosts.some(host => hostMatches(hostname, host))) {
|
|
50
|
+
throw new Error(`URL host ${hostname} is not allowed by authFetch profile ${profile.name}`);
|
|
51
|
+
}
|
|
52
|
+
return url;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export function authFetchRedirectGuard(profile: AuthFetchProfile, from: URL, to: URL): void {
|
|
56
|
+
if (profile.redirects === "same-origin" && to.origin !== from.origin) {
|
|
57
|
+
throw new Error(`Authenticated fetch refused cross-origin redirect: ${from.origin} -> ${to.origin}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function loadAuthFetchProfiles(): AuthFetchProfile[] {
|
|
62
|
+
if (!existsSync(WEB_SEARCH_CONFIG_PATH)) return [];
|
|
63
|
+
const raw = readFileSync(WEB_SEARCH_CONFIG_PATH, "utf-8");
|
|
64
|
+
let parsed: AuthFetchConfigRoot;
|
|
65
|
+
try {
|
|
66
|
+
const value: unknown = JSON.parse(raw);
|
|
67
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) throw new Error("expected a JSON object");
|
|
68
|
+
parsed = value as AuthFetchConfigRoot;
|
|
69
|
+
} catch (err) {
|
|
70
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
71
|
+
throw new Error(`Failed to parse ${WEB_SEARCH_CONFIG_PATH}: ${message}`);
|
|
72
|
+
}
|
|
73
|
+
if (parsed.authFetch === undefined || parsed.authFetch === null) return [];
|
|
74
|
+
if (typeof parsed.authFetch !== "object" || Array.isArray(parsed.authFetch)) {
|
|
75
|
+
throw new Error(`authFetch in ${WEB_SEARCH_CONFIG_PATH} must be an object`);
|
|
76
|
+
}
|
|
77
|
+
return Object.entries(parsed.authFetch as Record<string, unknown>).map(([name, value]) => parseProfile(name, value));
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function parseProfile(name: string, value: unknown): AuthFetchProfile {
|
|
81
|
+
if (!AUTH_PROFILE_NAME_PATTERN.test(name)) {
|
|
82
|
+
throw new Error(`authFetch profile name ${JSON.stringify(name)} must start with a letter and contain only letters, numbers, underscores, or hyphens`);
|
|
83
|
+
}
|
|
84
|
+
if (Array.isArray(value)) {
|
|
85
|
+
return { name, hosts: parseHosts(value, `authFetch.${name}`), redirects: "same-origin", cache: "session" };
|
|
86
|
+
}
|
|
87
|
+
if (!value || typeof value !== "object") {
|
|
88
|
+
throw new Error(`authFetch.${name} in ${WEB_SEARCH_CONFIG_PATH} must be an array of hosts or an object`);
|
|
89
|
+
}
|
|
90
|
+
const config = value as Record<string, unknown>;
|
|
91
|
+
if (!Array.isArray(config.hosts)) {
|
|
92
|
+
throw new Error(`authFetch.${name}.hosts in ${WEB_SEARCH_CONFIG_PATH} must be a non-empty array of hostnames`);
|
|
93
|
+
}
|
|
94
|
+
const redirects = config.redirects ?? "same-origin";
|
|
95
|
+
if (redirects !== "same-origin") {
|
|
96
|
+
throw new Error(`authFetch.${name}.redirects in ${WEB_SEARCH_CONFIG_PATH} must be "same-origin"`);
|
|
97
|
+
}
|
|
98
|
+
const cache = config.cache ?? "session";
|
|
99
|
+
if (cache !== "session" && cache !== "off") {
|
|
100
|
+
throw new Error(`authFetch.${name}.cache in ${WEB_SEARCH_CONFIG_PATH} must be "session" or "off"`);
|
|
101
|
+
}
|
|
102
|
+
const chromeProfile = parseChromeProfile(config.chromeProfile, `authFetch.${name}.chromeProfile`);
|
|
103
|
+
return {
|
|
104
|
+
name,
|
|
105
|
+
hosts: parseHosts(config.hosts, `authFetch.${name}.hosts`),
|
|
106
|
+
...(chromeProfile ? { chromeProfile } : {}),
|
|
107
|
+
redirects,
|
|
108
|
+
cache,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function parseHosts(value: unknown[], label: string): string[] {
|
|
113
|
+
if (value.length === 0) throw new Error(`${label} in ${WEB_SEARCH_CONFIG_PATH} must be a non-empty array of hostnames`);
|
|
114
|
+
const hosts = value.map((entry) => {
|
|
115
|
+
if (typeof entry !== "string") throw new Error(`${label} in ${WEB_SEARCH_CONFIG_PATH} must contain only hostnames`);
|
|
116
|
+
return parseHost(entry, label);
|
|
117
|
+
});
|
|
118
|
+
return [...new Set(hosts)];
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function parseHost(value: string, label: string): string {
|
|
122
|
+
const host = normalizeHostname(value.trim());
|
|
123
|
+
if (!host || host.startsWith(".") || host.endsWith(".") || /\s|[\\/?:#@*]/.test(host)) {
|
|
124
|
+
throw new Error(`${label} in ${WEB_SEARCH_CONFIG_PATH} contains an invalid hostname: ${JSON.stringify(value)}`);
|
|
125
|
+
}
|
|
126
|
+
if (host.length > 253 || !/^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)*[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/i.test(host)) {
|
|
127
|
+
throw new Error(`${label} in ${WEB_SEARCH_CONFIG_PATH} contains an invalid hostname: ${JSON.stringify(value)}`);
|
|
128
|
+
}
|
|
129
|
+
return host;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function parseChromeProfile(value: unknown, label: string): string | undefined {
|
|
133
|
+
if (value === undefined || value === null) return undefined;
|
|
134
|
+
if (typeof value !== "string") throw new Error(`${label} in ${WEB_SEARCH_CONFIG_PATH} must be a string`);
|
|
135
|
+
const normalized = value.trim();
|
|
136
|
+
if (!normalized || normalized === "." || normalized === ".." || normalized.includes("/") || normalized.includes("\\")) {
|
|
137
|
+
throw new Error(`${label} in ${WEB_SEARCH_CONFIG_PATH} must be a profile directory name, not a path`);
|
|
138
|
+
}
|
|
139
|
+
return normalized;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function normalizeHostname(hostname: string): string {
|
|
143
|
+
return hostname.toLowerCase().replace(/^\[|\]$/g, "").replace(/\.$/, "");
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function hostMatches(hostname: string, allowedHost: string): boolean {
|
|
147
|
+
return hostname === allowedHost || hostname.endsWith(`.${allowedHost}`);
|
|
148
|
+
}
|