cli-jaw 2.2.15 → 2.2.17
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 +23 -2
- package/dist/bin/cli-jaw.js +39 -0
- package/dist/bin/cli-jaw.js.map +1 -1
- package/dist/bin/commands/_shared/dashboard-client.js +42 -0
- package/dist/bin/commands/_shared/dashboard-client.js.map +1 -0
- package/dist/bin/commands/_shared/search-format.js +40 -0
- package/dist/bin/commands/_shared/search-format.js.map +1 -0
- package/dist/bin/commands/chat-search.js +5 -3
- package/dist/bin/commands/chat-search.js.map +1 -1
- package/dist/bin/commands/dashboard-chat.js +14 -31
- package/dist/bin/commands/dashboard-chat.js.map +1 -1
- package/dist/bin/commands/dashboard-memory.js +12 -49
- package/dist/bin/commands/dashboard-memory.js.map +1 -1
- package/dist/bin/commands/doctor.js +56 -11
- package/dist/bin/commands/doctor.js.map +1 -1
- package/dist/bin/commands/init.js +31 -1
- package/dist/bin/commands/init.js.map +1 -1
- package/dist/bin/commands/memory.js +5 -1
- package/dist/bin/commands/memory.js.map +1 -1
- package/dist/bin/commands/provider.js +23 -0
- package/dist/bin/commands/provider.js.map +1 -1
- package/dist/bin/commands/slack.js +57 -3
- package/dist/bin/commands/slack.js.map +1 -1
- package/dist/bin/commands/tui/input-handler.js +1 -1
- package/dist/bin/commands/tui/input-handler.js.map +1 -1
- package/dist/bin/commands/tui/slash-command-runner.js +4 -5
- package/dist/bin/commands/tui/slash-command-runner.js.map +1 -1
- package/dist/bin/postinstall.js +16 -18
- package/dist/bin/postinstall.js.map +1 -1
- package/dist/lib/media-kind.js +28 -0
- package/dist/lib/media-kind.js.map +1 -0
- package/dist/lib/upload.js +27 -10
- package/dist/lib/upload.js.map +1 -1
- package/dist/server.js +35 -51
- package/dist/server.js.map +1 -1
- package/dist/src/agent/args.js +34 -0
- package/dist/src/agent/args.js.map +1 -1
- package/dist/src/agent/codex-app-client.js +1016 -135
- package/dist/src/agent/codex-app-client.js.map +1 -1
- package/dist/src/agent/codex-app-events.js +72 -1
- package/dist/src/agent/codex-app-events.js.map +1 -1
- package/dist/src/agent/codex-host-pool.js +617 -0
- package/dist/src/agent/codex-host-pool.js.map +1 -0
- package/dist/src/agent/jwc-runtime.js +12 -4
- package/dist/src/agent/jwc-runtime.js.map +1 -1
- package/dist/src/agent/kiro-auth.js +10 -4
- package/dist/src/agent/kiro-auth.js.map +1 -1
- package/dist/src/agent/kiro-runtime.js +45 -8
- package/dist/src/agent/kiro-runtime.js.map +1 -1
- package/dist/src/agent/lifecycle-handler.js +75 -52
- package/dist/src/agent/lifecycle-handler.js.map +1 -1
- package/dist/src/agent/memory-flush-controller.js +241 -33
- package/dist/src/agent/memory-flush-controller.js.map +1 -1
- package/dist/src/agent/prompt-context.js +4 -0
- package/dist/src/agent/prompt-context.js.map +1 -1
- package/dist/src/agent/runtime-pool.js +64 -34
- package/dist/src/agent/runtime-pool.js.map +1 -1
- package/dist/src/agent/session-persistence.js +71 -15
- package/dist/src/agent/session-persistence.js.map +1 -1
- package/dist/src/agent/spawn/queue.js +319 -162
- package/dist/src/agent/spawn/queue.js.map +1 -1
- package/dist/src/agent/spawn.js +581 -268
- package/dist/src/agent/spawn.js.map +1 -1
- package/dist/src/bgtask/types.js +1 -1
- package/dist/src/bgtask/types.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/safety.js +25 -0
- package/dist/src/browser/adaptive-fetch/safety.js.map +1 -1
- package/dist/src/browser/connection.js +2 -8
- package/dist/src/browser/connection.js.map +1 -1
- package/dist/src/cli/capability-probe-worker.js +172 -0
- package/dist/src/cli/capability-probe-worker.js.map +1 -0
- package/dist/src/cli/capability-probe.js +83 -0
- package/dist/src/cli/capability-probe.js.map +1 -0
- package/dist/src/cli/claude-models.js +2 -2
- package/dist/src/cli/claude-models.js.map +1 -1
- package/dist/src/cli/cli-status-worker.js +296 -0
- package/dist/src/cli/cli-status-worker.js.map +1 -0
- package/dist/src/cli/cli-status.js +81 -0
- package/dist/src/cli/cli-status.js.map +1 -0
- package/dist/src/cli/command-context.js +17 -5
- package/dist/src/cli/command-context.js.map +1 -1
- package/dist/src/cli/compact.js +56 -19
- package/dist/src/cli/compact.js.map +1 -1
- package/dist/src/cli/handlers-runtime.js +6 -4
- package/dist/src/cli/handlers-runtime.js.map +1 -1
- package/dist/src/cli/handlers.js +7 -2
- package/dist/src/cli/handlers.js.map +1 -1
- package/dist/src/cli/opencodex-models.js +5 -32
- package/dist/src/cli/opencodex-models.js.map +1 -1
- package/dist/src/cli/opencodex-runtime.js +82 -0
- package/dist/src/cli/opencodex-runtime.js.map +1 -0
- package/dist/src/cli/readiness.js +35 -18
- package/dist/src/cli/readiness.js.map +1 -1
- package/dist/src/cli/registry-live.js +8 -2
- package/dist/src/cli/registry-live.js.map +1 -1
- package/dist/src/cli/registry.js +1 -1
- package/dist/src/cli/registry.js.map +1 -1
- package/dist/src/core/browser-open-default.js +6 -4
- package/dist/src/core/browser-open-default.js.map +1 -1
- package/dist/src/core/browser-open.js +11 -15
- package/dist/src/core/browser-open.js.map +1 -1
- package/dist/src/core/bus.js +7 -1
- package/dist/src/core/bus.js.map +1 -1
- package/dist/src/core/chat-sessions.js +121 -12
- package/dist/src/core/chat-sessions.js.map +1 -1
- package/dist/src/core/cli-detect.js +148 -4
- package/dist/src/core/cli-detect.js.map +1 -1
- package/dist/src/core/codex-config.js +21 -0
- package/dist/src/core/codex-config.js.map +1 -1
- package/dist/src/core/compact.js +73 -21
- package/dist/src/core/compact.js.map +1 -1
- package/dist/src/core/config.js +449 -20
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/db.js +225 -0
- package/dist/src/core/db.js.map +1 -1
- package/dist/src/core/event-bus.js +49 -4
- package/dist/src/core/event-bus.js.map +1 -1
- package/dist/src/core/event-scope.js +100 -0
- package/dist/src/core/event-scope.js.map +1 -0
- package/dist/src/core/install-integrity.js +176 -0
- package/dist/src/core/install-integrity.js.map +1 -0
- package/dist/src/core/main-session.js +64 -21
- package/dist/src/core/main-session.js.map +1 -1
- package/dist/src/core/message-summary.js +12 -2
- package/dist/src/core/message-summary.js.map +1 -1
- package/dist/src/core/platform-kind.js +139 -0
- package/dist/src/core/platform-kind.js.map +1 -0
- package/dist/src/core/rate-limit.js +156 -0
- package/dist/src/core/rate-limit.js.map +1 -0
- package/dist/src/core/runtime-settings.js +165 -17
- package/dist/src/core/runtime-settings.js.map +1 -1
- package/dist/src/core/session-context.js +7 -0
- package/dist/src/core/session-context.js.map +1 -0
- package/dist/src/core/session-ops.js +53 -9
- package/dist/src/core/session-ops.js.map +1 -1
- package/dist/src/core/settings-merge.js +105 -3
- package/dist/src/core/settings-merge.js.map +1 -1
- package/dist/src/core/settings-watch.js +29 -5
- package/dist/src/core/settings-watch.js.map +1 -1
- package/dist/src/core/widget-watcher.js +15 -2
- package/dist/src/core/widget-watcher.js.map +1 -1
- package/dist/src/discord/bot.js +5 -2
- package/dist/src/discord/bot.js.map +1 -1
- package/dist/src/discord/commands.js +4 -4
- package/dist/src/discord/commands.js.map +1 -1
- package/dist/src/goal/heartbeat.js +1 -1
- package/dist/src/goal/heartbeat.js.map +1 -1
- package/dist/src/goal/runtime.js +1 -1
- package/dist/src/goal/runtime.js.map +1 -1
- package/dist/src/goal-run/controller.js +2 -2
- package/dist/src/goal-run/controller.js.map +1 -1
- package/dist/src/manager/internal-fetch.js +15 -0
- package/dist/src/manager/internal-fetch.js.map +1 -0
- package/dist/src/manager/logs.js +2 -1
- package/dist/src/manager/logs.js.map +1 -1
- package/dist/src/manager/memory/chat-federation.js +104 -11
- package/dist/src/manager/memory/chat-federation.js.map +1 -1
- package/dist/src/manager/memory/federation.js +100 -0
- package/dist/src/manager/memory/federation.js.map +1 -1
- package/dist/src/manager/metadata.js +4 -1
- package/dist/src/manager/metadata.js.map +1 -1
- package/dist/src/manager/notes/assets.js +1 -1
- package/dist/src/manager/notes/assets.js.map +1 -1
- package/dist/src/manager/notes/frontmatter.js +5 -49
- package/dist/src/manager/notes/frontmatter.js.map +1 -1
- package/dist/src/manager/notes/link-resolver.js +2 -2
- package/dist/src/manager/notes/link-resolver.js.map +1 -1
- package/dist/src/manager/notes/remote-assets.js +1 -1
- package/dist/src/manager/notes/remote-assets.js.map +1 -1
- package/dist/src/manager/notes/routes.js +2 -2
- package/dist/src/manager/notes/routes.js.map +1 -1
- package/dist/src/manager/notes/store.js +2 -2
- package/dist/src/manager/notes/store.js.map +1 -1
- package/dist/src/manager/notes/trash.js +1 -1
- package/dist/src/manager/notes/trash.js.map +1 -1
- package/dist/src/manager/notes/vault-index.js +2 -2
- package/dist/src/manager/notes/vault-index.js.map +1 -1
- package/dist/src/manager/notes/wiki-links.js +1 -1
- package/dist/src/manager/notes/wiki-links.js.map +1 -1
- package/dist/src/manager/notes/wiki-routes.js +84 -0
- package/dist/src/manager/notes/wiki-routes.js.map +1 -0
- package/dist/src/manager/proxy.js +1 -0
- package/dist/src/manager/proxy.js.map +1 -1
- package/dist/src/manager/routes/dashboard-memory.js +24 -1
- package/dist/src/manager/routes/dashboard-memory.js.map +1 -1
- package/dist/src/manager/routes/runtime-monitor.js +1 -1
- package/dist/src/manager/routes/runtime-monitor.js.map +1 -1
- package/dist/src/manager/scan.js +5 -3
- package/dist/src/manager/scan.js.map +1 -1
- package/dist/src/manager/server.js +20 -6
- package/dist/src/manager/server.js.map +1 -1
- package/dist/src/manager/telegram-hub/hub-bot.js +4 -3
- package/dist/src/manager/telegram-hub/hub-bot.js.map +1 -1
- package/dist/src/manager/worker-events.js +2 -1
- package/dist/src/manager/worker-events.js.map +1 -1
- package/dist/src/memory/heartbeat.js +6 -5
- package/dist/src/memory/heartbeat.js.map +1 -1
- package/dist/src/memory/indexing.js +162 -45
- package/dist/src/memory/indexing.js.map +1 -1
- package/dist/src/messaging/channel-validate.js +14 -1
- package/dist/src/messaging/channel-validate.js.map +1 -1
- package/dist/src/messaging/redact.js +2 -1
- package/dist/src/messaging/redact.js.map +1 -1
- package/dist/src/messaging/session-key.js +21 -2
- package/dist/src/messaging/session-key.js.map +1 -1
- package/dist/src/notes/constants.js.map +1 -0
- package/dist/src/notes/frontmatter.js +59 -0
- package/dist/src/notes/frontmatter.js.map +1 -0
- package/dist/src/notes/path-guards.js.map +1 -0
- package/dist/src/notes/search.js.map +1 -0
- package/dist/src/orchestrator/attestation.js +1 -1
- package/dist/src/orchestrator/attestation.js.map +1 -1
- package/dist/src/orchestrator/gateway.js +135 -31
- package/dist/src/orchestrator/gateway.js.map +1 -1
- package/dist/src/orchestrator/pipeline.js +53 -21
- package/dist/src/orchestrator/pipeline.js.map +1 -1
- package/dist/src/orchestrator/scope.js +36 -2
- package/dist/src/orchestrator/scope.js.map +1 -1
- package/dist/src/orchestrator/session-lanes.js +87 -0
- package/dist/src/orchestrator/session-lanes.js.map +1 -0
- package/dist/src/orchestrator/session-work.js +25 -0
- package/dist/src/orchestrator/session-work.js.map +1 -0
- package/dist/src/orchestrator/state-machine.js +1 -5
- package/dist/src/orchestrator/state-machine.js.map +1 -1
- package/dist/src/orchestrator/worker-registry.js +20 -10
- package/dist/src/orchestrator/worker-registry.js.map +1 -1
- package/dist/src/prompt/builder.js +40 -2
- package/dist/src/prompt/builder.js.map +1 -1
- package/dist/src/prompt/templates/a1-system.md +8 -1
- package/dist/src/routes/agent-control.js +44 -8
- package/dist/src/routes/agent-control.js.map +1 -1
- package/dist/src/routes/chat-sessions.js +34 -6
- package/dist/src/routes/chat-sessions.js.map +1 -1
- package/dist/src/routes/command.js +63 -8
- package/dist/src/routes/command.js.map +1 -1
- package/dist/src/routes/events.js +11 -2
- package/dist/src/routes/events.js.map +1 -1
- package/dist/src/routes/link-preview.js +1 -27
- package/dist/src/routes/link-preview.js.map +1 -1
- package/dist/src/routes/messages.js +6 -5
- package/dist/src/routes/messages.js.map +1 -1
- package/dist/src/routes/messaging.js +45 -1
- package/dist/src/routes/messaging.js.map +1 -1
- package/dist/src/routes/orchestrate.js +53 -33
- package/dist/src/routes/orchestrate.js.map +1 -1
- package/dist/src/routes/search.js +84 -0
- package/dist/src/routes/search.js.map +1 -0
- package/dist/src/routes/session-request.js +29 -0
- package/dist/src/routes/session-request.js.map +1 -0
- package/dist/src/routes/settings.js +110 -3
- package/dist/src/routes/settings.js.map +1 -1
- package/dist/src/routes/static.js +30 -8
- package/dist/src/routes/static.js.map +1 -1
- package/dist/src/routes/system.js +1 -1
- package/dist/src/routes/system.js.map +1 -1
- package/dist/src/routes/wiki.js +122 -0
- package/dist/src/routes/wiki.js.map +1 -0
- package/dist/src/search/contract.js +2 -0
- package/dist/src/search/contract.js.map +1 -0
- package/dist/src/search/coordinator.js +153 -0
- package/dist/src/search/coordinator.js.map +1 -0
- package/dist/src/search/provider.js +40 -0
- package/dist/src/search/provider.js.map +1 -0
- package/dist/src/search/providers/chat.js +115 -0
- package/dist/src/search/providers/chat.js.map +1 -0
- package/dist/src/search/providers/memory.js +53 -0
- package/dist/src/search/providers/memory.js.map +1 -0
- package/dist/src/search/providers/wiki.js +80 -0
- package/dist/src/search/providers/wiki.js.map +1 -0
- package/dist/src/slack/api.js +10 -1
- package/dist/src/slack/api.js.map +1 -1
- package/dist/src/slack/attachment-recovery.js +42 -0
- package/dist/src/slack/attachment-recovery.js.map +1 -0
- package/dist/src/slack/bot.js +120 -41
- package/dist/src/slack/bot.js.map +1 -1
- package/dist/src/slack/commands.js +24 -8
- package/dist/src/slack/commands.js.map +1 -1
- package/dist/src/slack/events.js +12 -1
- package/dist/src/slack/events.js.map +1 -1
- package/dist/src/slack/history.js +108 -0
- package/dist/src/slack/history.js.map +1 -0
- package/dist/src/slack/inbound-file.js +242 -0
- package/dist/src/slack/inbound-file.js.map +1 -0
- package/dist/src/slack/inbound-url.js +39 -0
- package/dist/src/slack/inbound-url.js.map +1 -0
- package/dist/src/slack/ingress.js +140 -0
- package/dist/src/slack/ingress.js.map +1 -0
- package/dist/src/slack/manifest.js +3 -0
- package/dist/src/slack/manifest.js.map +1 -1
- package/dist/src/slack/socket.js +1 -1
- package/dist/src/slack/socket.js.map +1 -1
- package/dist/src/slack/thread-tracker.js +86 -0
- package/dist/src/slack/thread-tracker.js.map +1 -0
- package/dist/src/telegram/bot.js +21 -11
- package/dist/src/telegram/bot.js.map +1 -1
- package/dist/src/wiki/config.js +193 -0
- package/dist/src/wiki/config.js.map +1 -0
- package/dist/src/wiki/entities.js +61 -0
- package/dist/src/wiki/entities.js.map +1 -0
- package/dist/src/wiki/ontology.js +72 -0
- package/dist/src/wiki/ontology.js.map +1 -0
- package/dist/src/wiki/prompt.js +172 -0
- package/dist/src/wiki/prompt.js.map +1 -0
- package/dist/src/wiki/safe-traversal.js +198 -0
- package/dist/src/wiki/safe-traversal.js.map +1 -0
- package/dist/src/wiki/scaffold.js +77 -0
- package/dist/src/wiki/scaffold.js.map +1 -0
- package/package.json +6 -5
- package/public/css/session-hub.css +266 -0
- package/public/dist/assets/AdvancedExport-DYGcCAUq.js +1 -0
- package/public/dist/assets/Agent-CNNQ7KkJ.js +1 -0
- package/public/dist/assets/{DesignPanel-BGMPhZSx.js → DesignPanel-DcL369nB.js} +1 -1
- package/public/dist/assets/{DocPanel-Dz-J_l5M.js → DocPanel-K8A2pm_1.js} +1 -1
- package/public/dist/assets/{FolderPanel-DbPhzzvi.js → FolderPanel-CV52EzwG.js} +1 -1
- package/public/dist/assets/{MilkdownWysiwygEditor-Em7iC6y9.js → MilkdownWysiwygEditor-BKOCDI4Z.js} +1 -1
- package/public/dist/assets/api-B25zNNFJ.js +1 -0
- package/public/dist/assets/{app-DX4e6isX.css → app-DjgGeXhJ.css} +1 -1
- package/public/dist/assets/app-Dsgp4xpU.js +55 -0
- package/public/dist/assets/bgtask-badge-C6h5C-o4.js +1 -0
- package/public/dist/assets/{bgtask-badge-qMkKOZx0.js → bgtask-badge-CpavV0Jc.js} +4 -4
- package/public/dist/assets/{employees-BnobWM_2.js → employees-BJyEgim7.js} +4 -4
- package/public/dist/assets/idb-cache-B5PX63p7.js +1 -0
- package/public/dist/assets/{idb-cache-BzzftUET.js → idb-cache-lOntwU3S.js} +1 -1
- package/public/dist/assets/{iframe-renderer-C5vRbbl9.js → iframe-renderer-B8k3AvTv.js} +12 -12
- package/public/dist/assets/iframe-renderer-BO_GgCTR.js +1 -0
- package/public/dist/assets/manager-LkGs6qEJ.css +1 -0
- package/public/dist/assets/manager-kXYQyMhR.js +13 -0
- package/public/dist/assets/{memory-DF4kPwwC.js → memory-D2RbBVO-.js} +11 -11
- package/public/dist/assets/memory-amsvg4Ey.js +1 -0
- package/public/dist/assets/message-history-BGHZxvgV.js +1 -0
- package/public/dist/assets/message-history-Bw2E_b8L.js +1 -0
- package/public/dist/assets/pi-settings-5HVg1sXJ.js +1 -0
- package/public/dist/assets/render-BkGcpH7z.js +157 -0
- package/public/dist/assets/settings-B1FPORO2.js +56 -0
- package/public/dist/assets/settings-CMN-zN4Q.js +1 -0
- package/public/dist/assets/settings-core-B_OjGYVN.js +1 -0
- package/public/dist/assets/settings-core-CxRwqx86.js +144 -0
- package/public/dist/assets/sidebar-DW78DANx.js +49 -0
- package/public/dist/assets/skills-Dz-9Yrxr.js +1 -0
- package/public/dist/assets/{skills-IGquen_j.js → skills-lWi0ZFiV.js} +6 -6
- package/public/dist/assets/{slash-commands-ZRDOL99E.js → slash-commands-DYOI6nKj.js} +1 -1
- package/public/dist/assets/slash-commands-xJFCdTTM.js +1 -0
- package/public/dist/assets/{trace-drawer-D8To8fYt.js → trace-drawer-DBX9xzmt.js} +1 -1
- package/public/dist/assets/{ui-Hx_mNoDf.js → ui-Bx7eqnXt.js} +1 -1
- package/public/dist/assets/ui-JOcrYeG-.js +1 -0
- package/public/dist/assets/{wiki-link-suggestions-DZQc78gj.js → wiki-link-suggestions-Dp6kBQVu.js} +1 -1
- package/public/dist/index.html +4 -4
- package/public/dist/manager/index.html +2 -2
- package/public/index.html +3 -2
- package/public/js/event-channel.ts +25 -0
- package/public/js/features/channel-onboarding-flow.ts +16 -1
- package/public/js/features/channel-onboarding.ts +20 -2
- package/public/js/features/chat-messages.ts +3 -1
- package/public/js/features/chat-search.ts +2 -1
- package/public/js/features/chat.ts +56 -18
- package/public/js/features/elicitation.ts +15 -0
- package/public/js/features/idb-cache.ts +34 -0
- package/public/js/features/message-history.ts +2 -1
- package/public/js/features/session-hub.ts +334 -0
- package/public/js/features/settings-cli-status-render.ts +1 -1
- package/public/js/features/settings-cli-status.ts +25 -11
- package/public/js/features/settings-core.ts +72 -3
- package/public/js/features/settings-types.ts +32 -0
- package/public/js/features/ui-status.ts +2 -1
- package/public/js/main.ts +20 -0
- package/public/js/render/compose-block.ts +7 -0
- package/public/js/ws.ts +22 -2
- package/public/locales/en.json +46 -4
- package/public/locales/ja.json +46 -4
- package/public/locales/ko.json +46 -4
- package/public/locales/zh.json +46 -4
- package/public/manager/src/App.tsx +1 -1
- package/public/manager/src/InstancePreview.tsx +5 -1
- package/public/manager/src/api.ts +2 -1
- package/public/manager/src/components/InstanceGroups.tsx +10 -0
- package/public/manager/src/components/InstanceListContent.tsx +24 -1
- package/public/manager/src/components/InstanceRow.tsx +33 -3
- package/public/manager/src/components/InstanceSessionList.tsx +132 -0
- package/public/manager/src/hooks/useActiveSessionDisclosure.ts +45 -0
- package/public/manager/src/lib/resilient-fetch.ts +93 -0
- package/public/manager/src/lib/session-store.ts +216 -0
- package/public/manager/src/manager-components.css +97 -0
- package/public/manager/src/settings/pages/AdvancedExport.tsx +12 -2
- package/public/manager/src/settings/pages/Agent.tsx +113 -1
- package/public/manager/src/settings/pages/components/agent/agent-meta.ts +1 -1
- package/scripts/bundle-sidecar.sh +50 -2
- package/scripts/burst-scenario.mjs +72 -0
- package/scripts/check-redaction-sinks.mjs +1 -0
- package/scripts/check-strict-baseline.mjs +1 -1
- package/scripts/ensure-native-modules.cjs +50 -3
- package/scripts/install-risk-gate.mjs +8 -0
- package/scripts/install-wsl.sh +27 -2
- package/scripts/install.ps1 +121 -0
- package/scripts/install.sh +28 -2
- package/scripts/postinstall-guard.cjs +44 -2
- package/scripts/release-gates.mjs +12 -0
- package/dist/src/manager/notes/constants.js.map +0 -1
- package/dist/src/manager/notes/path-guards.js.map +0 -1
- package/dist/src/manager/notes/search.js.map +0 -1
- package/public/dist/assets/AdvancedExport-DsDpqXoH.js +0 -1
- package/public/dist/assets/Agent-BjbZVZ9p.js +0 -1
- package/public/dist/assets/api-C9dOxby7.js +0 -1
- package/public/dist/assets/app-BzD_ZLvt.js +0 -55
- package/public/dist/assets/bgtask-badge-Dqbp-Y4e.js +0 -1
- package/public/dist/assets/idb-cache-ZH6lOebk.js +0 -1
- package/public/dist/assets/iframe-renderer-Df4KIVyx.js +0 -1
- package/public/dist/assets/manager-C4eNDNFt.css +0 -1
- package/public/dist/assets/manager-DaN201mN.js +0 -13
- package/public/dist/assets/memory-D-bULTHl.js +0 -1
- package/public/dist/assets/message-history-C4WOisGx.js +0 -1
- package/public/dist/assets/message-history-ZBoza6ew.js +0 -1
- package/public/dist/assets/pi-settings-CBUGDAuT.js +0 -1
- package/public/dist/assets/render-DYX6GRQ0.js +0 -122
- package/public/dist/assets/settings-DbJpGoaX.js +0 -55
- package/public/dist/assets/settings-SreihUje.js +0 -1
- package/public/dist/assets/settings-core-B1Y5Nb4Z.js +0 -1
- package/public/dist/assets/settings-core-DobZWIZ7.js +0 -140
- package/public/dist/assets/sidebar-Cp22g0Gv.js +0 -49
- package/public/dist/assets/skills-DwPIP08e.js +0 -1
- package/public/dist/assets/slash-commands-BBVfwcnW.js +0 -1
- package/public/dist/assets/ui-CAicpUZc.js +0 -1
- /package/dist/src/{manager/notes → notes}/constants.js +0 -0
- /package/dist/src/{manager/notes → notes}/path-guards.js +0 -0
- /package/dist/src/{manager/notes → notes}/search.js +0 -0
- /package/public/dist/assets/{pi-settings-Dh5lgb87.js → pi-settings-DEuKgvIj.js} +0 -0
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
const CORPORA = ['chat', 'memory', 'wiki'];
|
|
3
|
+
const MAX_CURSOR_CHARS = 4096;
|
|
4
|
+
const MAX_CURSOR_PROVIDERS = 32;
|
|
5
|
+
const MAX_PROVIDER_ID_CHARS = 128;
|
|
6
|
+
const MAX_CURSOR_OFFSET = 1_000_000;
|
|
7
|
+
const invalidCursor = () => Object.assign(new Error('invalid_cursor'), { statusCode: 400, code: 'invalid_cursor' });
|
|
8
|
+
// This SHA-256 binds a cursor to its query. It is not an HMAC or a tamper-resistance boundary.
|
|
9
|
+
const hashOf = (query) => createHash('sha256').update(JSON.stringify(query)).digest('hex');
|
|
10
|
+
function decodeCursor(raw) {
|
|
11
|
+
if (!raw)
|
|
12
|
+
return { v: 1, hash: '', providers: {} };
|
|
13
|
+
try {
|
|
14
|
+
if (!/^[A-Za-z0-9_-]+$/.test(raw))
|
|
15
|
+
throw invalidCursor();
|
|
16
|
+
// Bound the work before decoding: the cursor is client-supplied, and an
|
|
17
|
+
// oversized payload otherwise buys unbounded decode/parse/traversal.
|
|
18
|
+
if (raw.length > MAX_CURSOR_CHARS)
|
|
19
|
+
throw invalidCursor();
|
|
20
|
+
const decoded = Buffer.from(raw, 'base64url');
|
|
21
|
+
if (decoded.toString('base64url') !== raw)
|
|
22
|
+
throw invalidCursor();
|
|
23
|
+
const value = JSON.parse(decoded.toString('utf8'));
|
|
24
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
25
|
+
throw invalidCursor();
|
|
26
|
+
const row = value;
|
|
27
|
+
if (row['v'] !== 1 || typeof row['hash'] !== 'string' ||
|
|
28
|
+
!row['providers'] || typeof row['providers'] !== 'object' || Array.isArray(row['providers'])) {
|
|
29
|
+
throw invalidCursor();
|
|
30
|
+
}
|
|
31
|
+
const providers = row['providers'];
|
|
32
|
+
const providerIds = Object.keys(providers);
|
|
33
|
+
if (providerIds.length > MAX_CURSOR_PROVIDERS)
|
|
34
|
+
throw invalidCursor();
|
|
35
|
+
for (const id of providerIds) {
|
|
36
|
+
if (id.length > MAX_PROVIDER_ID_CHARS)
|
|
37
|
+
throw invalidCursor();
|
|
38
|
+
const state = providers[id];
|
|
39
|
+
if (!state || typeof state !== 'object' || Array.isArray(state))
|
|
40
|
+
throw invalidCursor();
|
|
41
|
+
const item = state;
|
|
42
|
+
// Number.isInteger(1e100) is true, so an absurd offset would sail
|
|
43
|
+
// through and reach the provider as a SQL OFFSET.
|
|
44
|
+
if (!Number.isSafeInteger(item['offset']) || Number(item['offset']) < 0 ||
|
|
45
|
+
Number(item['offset']) > MAX_CURSOR_OFFSET ||
|
|
46
|
+
typeof item['exhausted'] !== 'boolean')
|
|
47
|
+
throw invalidCursor();
|
|
48
|
+
for (const key of Object.keys(item)) {
|
|
49
|
+
if (key !== 'offset' && key !== 'exhausted')
|
|
50
|
+
throw invalidCursor();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return row;
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
if (error.code === 'invalid_cursor')
|
|
57
|
+
throw error;
|
|
58
|
+
throw invalidCursor();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
const encodeCursor = (cursor) => Buffer.from(JSON.stringify(cursor)).toString('base64url');
|
|
62
|
+
const returnedCount = (page) => page.groups.reduce((sum, group) => sum + group.hits.length, 0);
|
|
63
|
+
/**
|
|
64
|
+
* Provider errors can carry SQL, filesystem paths, upstream bodies, or
|
|
65
|
+
* credentials. Log the detail server-side; return a stable message.
|
|
66
|
+
*/
|
|
67
|
+
const failureWarning = (provider, reason) => {
|
|
68
|
+
console.error('[search:provider]', provider.id, reason instanceof Error ? reason.message : String(reason));
|
|
69
|
+
return { code: 'provider_failed', provider: provider.id, message: 'search provider failed' };
|
|
70
|
+
};
|
|
71
|
+
export class SearchCoordinator {
|
|
72
|
+
registry;
|
|
73
|
+
constructor(registry) {
|
|
74
|
+
this.registry = registry;
|
|
75
|
+
}
|
|
76
|
+
async search(input) {
|
|
77
|
+
const query = {
|
|
78
|
+
...input,
|
|
79
|
+
query: input.query.trim(),
|
|
80
|
+
limit: Math.min(input.limit ?? 20, 100),
|
|
81
|
+
};
|
|
82
|
+
if (!query.query)
|
|
83
|
+
throw Object.assign(new Error('q is required'), { statusCode: 400 });
|
|
84
|
+
const { cursor: _cursor, ...base } = query;
|
|
85
|
+
const hash = hashOf(base);
|
|
86
|
+
const cursor = decodeCursor(input.cursor);
|
|
87
|
+
if (input.cursor && cursor.hash !== hash)
|
|
88
|
+
throw invalidCursor();
|
|
89
|
+
const requested = input.corpus === 'all' ? CORPORA : [input.corpus];
|
|
90
|
+
const registered = input.corpus === 'all'
|
|
91
|
+
? this.registry.list() : this.registry.list(input.corpus);
|
|
92
|
+
const missingWarnings = requested
|
|
93
|
+
.filter(corpus => !registered.some(provider => provider.corpus === corpus))
|
|
94
|
+
.map(corpus => ({
|
|
95
|
+
code: 'provider_failed', provider: corpus,
|
|
96
|
+
message: `${corpus} search provider is not registered`,
|
|
97
|
+
}));
|
|
98
|
+
const states = { ...cursor.providers };
|
|
99
|
+
// Every non-ready provider must be terminalized BEFORE hasMore is computed.
|
|
100
|
+
// hasMore asks "is any registered provider unexhausted?", so a provider that
|
|
101
|
+
// never appears in cursor state reads as unexhausted forever and offers a
|
|
102
|
+
// next page that can never contain anything.
|
|
103
|
+
const offProviders = registered.filter(provider => provider.status() === 'off');
|
|
104
|
+
const erroredProviders = registered.filter(provider => provider.status() === 'error');
|
|
105
|
+
for (const provider of [...offProviders, ...erroredProviders]) {
|
|
106
|
+
states[provider.id] = { offset: 0, exhausted: true };
|
|
107
|
+
}
|
|
108
|
+
const ready = registered.filter(provider => provider.status() === 'ready' && !cursor.providers[provider.id]?.exhausted);
|
|
109
|
+
const perProvider = Math.max(1, Math.ceil((query.limit ?? 20) / Math.max(1, ready.length)));
|
|
110
|
+
const settled = await Promise.allSettled(ready.map(provider => provider.search(query, {
|
|
111
|
+
limit: perProvider,
|
|
112
|
+
offset: cursor.providers[provider.id]?.offset ?? 0,
|
|
113
|
+
...(query.instances !== undefined ? { instanceIds: query.instances } : {}),
|
|
114
|
+
})));
|
|
115
|
+
const pages = settled.flatMap((result, index) => result.status === 'fulfilled'
|
|
116
|
+
? [{ provider: ready[index], page: result.value }] : []);
|
|
117
|
+
const rejected = settled.flatMap((result, index) => result.status === 'rejected'
|
|
118
|
+
? [{ provider: ready[index], reason: result.reason }] : []);
|
|
119
|
+
settled.forEach((result, index) => {
|
|
120
|
+
const provider = ready[index];
|
|
121
|
+
const previous = states[provider.id] ?? { offset: 0, exhausted: false };
|
|
122
|
+
states[provider.id] = result.status === 'rejected'
|
|
123
|
+
? { ...previous, exhausted: true }
|
|
124
|
+
: { offset: previous.offset + returnedCount(result.value), exhausted: !result.value.page.hasMore };
|
|
125
|
+
});
|
|
126
|
+
const hasMore = registered.some(provider => !states[provider.id]?.exhausted);
|
|
127
|
+
return {
|
|
128
|
+
query: base,
|
|
129
|
+
groups: pages.flatMap(({ page }) => page.groups),
|
|
130
|
+
warnings: [
|
|
131
|
+
...missingWarnings,
|
|
132
|
+
...rejected.map(({ provider, reason }) => failureWarning(provider, reason)),
|
|
133
|
+
...offProviders.map(provider => ({
|
|
134
|
+
code: 'provider_off', provider: provider.id,
|
|
135
|
+
message: `${provider.corpus} search provider is disabled`,
|
|
136
|
+
})),
|
|
137
|
+
...erroredProviders.map(provider => ({
|
|
138
|
+
code: 'provider_failed', provider: provider.id,
|
|
139
|
+
message: 'search provider failed',
|
|
140
|
+
})),
|
|
141
|
+
...pages.flatMap(({ page }) => page.warnings),
|
|
142
|
+
],
|
|
143
|
+
page: { hasMore, nextCursor: hasMore ? encodeCursor({ v: 1, hash, providers: states }) : null },
|
|
144
|
+
providers: [
|
|
145
|
+
...pages.flatMap(({ page }) => page.providers),
|
|
146
|
+
...rejected.map(({ provider }) => ({ id: provider.id, corpus: provider.corpus, status: 'error' })),
|
|
147
|
+
...offProviders.map(provider => ({ id: provider.id, corpus: provider.corpus, status: 'off' })),
|
|
148
|
+
...erroredProviders.map(provider => ({ id: provider.id, corpus: provider.corpus, status: 'error' })),
|
|
149
|
+
],
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=coordinator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../../../src/search/coordinator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export function providerEnvelope(provider, query, hits, warnings = [], hasMore = false) {
|
|
2
|
+
const { cursor: _cursor, ...base } = query;
|
|
3
|
+
return {
|
|
4
|
+
query: base,
|
|
5
|
+
groups: [{ corpus: provider.corpus, ranking: hits[0]?.ranking.mode ?? 'like', hits }],
|
|
6
|
+
warnings,
|
|
7
|
+
page: { nextCursor: null, hasMore },
|
|
8
|
+
providers: [{ id: provider.id, corpus: provider.corpus, status: provider.status() }],
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export function createOffProvider(id, corpus) {
|
|
12
|
+
const provider = {
|
|
13
|
+
id,
|
|
14
|
+
corpus,
|
|
15
|
+
status: () => 'off',
|
|
16
|
+
async search(query) {
|
|
17
|
+
return providerEnvelope(provider, query, [], [{
|
|
18
|
+
code: 'provider_off', provider: id, message: `${corpus} search provider is disabled`,
|
|
19
|
+
}]);
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
return provider;
|
|
23
|
+
}
|
|
24
|
+
export class SearchProviderRegistry {
|
|
25
|
+
providers = new Map();
|
|
26
|
+
register(provider) {
|
|
27
|
+
if (this.providers.has(provider.id)) {
|
|
28
|
+
throw new Error(`duplicate search provider: ${provider.id}`);
|
|
29
|
+
}
|
|
30
|
+
this.providers.set(provider.id, provider);
|
|
31
|
+
return () => {
|
|
32
|
+
if (this.providers.get(provider.id) === provider)
|
|
33
|
+
this.providers.delete(provider.id);
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
list(corpus) {
|
|
37
|
+
return [...this.providers.values()].filter(provider => !corpus || provider.corpus === corpus);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/search/provider.ts"],"names":[],"mappings":"AAkBA,MAAM,UAAU,gBAAgB,CAC5B,QAAwB,EACxB,KAAkB,EAClB,IAAiB,EACjB,WAA4B,EAAE,EAC9B,OAAO,GAAG,KAAK;IAEf,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IAC3C,OAAO;QACH,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,IAAI,MAAM,EAAE,IAAI,EAAE,CAAC;QACrF,QAAQ;QACR,IAAI,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE;QACnC,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;KACvF,CAAC;AACN,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,EAAU,EAAE,MAAsB;IAChE,MAAM,QAAQ,GAAmB;QAC7B,EAAE;QACF,MAAM;QACN,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK;QACnB,KAAK,CAAC,MAAM,CAAC,KAAK;YACd,OAAO,gBAAgB,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;oBAC1C,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,MAAM,8BAA8B;iBACvF,CAAC,CAAC,CAAC;QACR,CAAC;KACJ,CAAC;IACF,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED,MAAM,OAAO,sBAAsB;IACd,SAAS,GAAG,IAAI,GAAG,EAA0B,CAAC;IAE/D,QAAQ,CAAC,QAAwB;QAC7B,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,8BAA8B,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC1C,OAAO,GAAG,EAAE;YACR,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,QAAQ;gBAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACzF,CAAC,CAAC;IACN,CAAC;IAED,IAAI,CAAC,MAAuB;QACxB,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IAClG,CAAC;CACJ"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { searchChatCandidates, } from '../../core/db.js';
|
|
2
|
+
import { providerEnvelope } from '../provider.js';
|
|
3
|
+
const CJK_PATTERN = /[\p{Script=Han}\p{Script=Hangul}\p{Script=Hiragana}\p{Script=Katakana}]/u;
|
|
4
|
+
const WHITESPACE_PATTERN = /\s/u;
|
|
5
|
+
function escapeLike(value) {
|
|
6
|
+
return value.replaceAll('\\', '\\\\').replaceAll('%', '\\%').replaceAll('_', '\\_');
|
|
7
|
+
}
|
|
8
|
+
function ftsPhrase(value) {
|
|
9
|
+
return `"${value.replaceAll('"', '""')}"`;
|
|
10
|
+
}
|
|
11
|
+
function toHits(rows, ranking, offset) {
|
|
12
|
+
return rows.map((row, index) => ({
|
|
13
|
+
corpus: 'chat',
|
|
14
|
+
provider: 'local-chat',
|
|
15
|
+
key: String(row.id),
|
|
16
|
+
session: row.session_id,
|
|
17
|
+
timestamp: row.created_at,
|
|
18
|
+
snippet: row.content,
|
|
19
|
+
ranking: {
|
|
20
|
+
mode: ranking,
|
|
21
|
+
sourceRank: offset + index + 1,
|
|
22
|
+
...(typeof row.source_score === 'number' ? { sourceScore: row.source_score } : {}),
|
|
23
|
+
},
|
|
24
|
+
metadata: {
|
|
25
|
+
role: row.role,
|
|
26
|
+
cli: row.cli,
|
|
27
|
+
match_field: row.match_field,
|
|
28
|
+
tool_log: row.tool_log,
|
|
29
|
+
},
|
|
30
|
+
}));
|
|
31
|
+
}
|
|
32
|
+
export class ChatSearchProvider {
|
|
33
|
+
engine;
|
|
34
|
+
enabled;
|
|
35
|
+
id = 'local-chat';
|
|
36
|
+
corpus = 'chat';
|
|
37
|
+
constructor(engine = 'like', enabled = true) {
|
|
38
|
+
this.engine = engine;
|
|
39
|
+
this.enabled = enabled;
|
|
40
|
+
}
|
|
41
|
+
status() {
|
|
42
|
+
return this.enabled ? 'ready' : 'off';
|
|
43
|
+
}
|
|
44
|
+
async search(query, opts) {
|
|
45
|
+
if (!this.enabled) {
|
|
46
|
+
return providerEnvelope(this, query, [], [{
|
|
47
|
+
code: 'provider_off', provider: this.id, message: 'chat search provider is disabled',
|
|
48
|
+
}]);
|
|
49
|
+
}
|
|
50
|
+
const text = query.query.trim();
|
|
51
|
+
const params = {
|
|
52
|
+
match: ftsPhrase(text),
|
|
53
|
+
like: escapeLike(text),
|
|
54
|
+
session_id: query.sessionFilter ?? null,
|
|
55
|
+
days: query.days ?? null,
|
|
56
|
+
recent: query.recent ?? null,
|
|
57
|
+
limit: opts.limit + 1,
|
|
58
|
+
offset: opts.offset,
|
|
59
|
+
};
|
|
60
|
+
let candidateEngine = 'like';
|
|
61
|
+
let ranking = 'like';
|
|
62
|
+
let warnings = [];
|
|
63
|
+
let rows;
|
|
64
|
+
if (this.engine === 'like' || Array.from(text).length < 3) {
|
|
65
|
+
rows = searchChatCandidates('like', params);
|
|
66
|
+
}
|
|
67
|
+
else if (CJK_PATTERN.test(text)) {
|
|
68
|
+
if (WHITESPACE_PATTERN.test(text)) {
|
|
69
|
+
rows = searchChatCandidates('like', params);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
candidateEngine = 'trigram';
|
|
73
|
+
ranking = 'trigram';
|
|
74
|
+
try {
|
|
75
|
+
rows = searchChatCandidates(candidateEngine, params);
|
|
76
|
+
if (rows.length === 0) {
|
|
77
|
+
candidateEngine = 'like';
|
|
78
|
+
ranking = 'like';
|
|
79
|
+
rows = searchChatCandidates(candidateEngine, params);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
candidateEngine = 'like';
|
|
84
|
+
ranking = 'like';
|
|
85
|
+
rows = searchChatCandidates(candidateEngine, params);
|
|
86
|
+
warnings = [{
|
|
87
|
+
code: 'engine_fallback',
|
|
88
|
+
provider: this.id,
|
|
89
|
+
message: `chat FTS unavailable; LIKE fallback used: ${error instanceof Error ? error.message : String(error)}`,
|
|
90
|
+
}];
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
candidateEngine = 'unicode61';
|
|
96
|
+
ranking = 'bm25';
|
|
97
|
+
try {
|
|
98
|
+
rows = searchChatCandidates(candidateEngine, params);
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
candidateEngine = 'like';
|
|
102
|
+
ranking = 'like';
|
|
103
|
+
rows = searchChatCandidates(candidateEngine, params);
|
|
104
|
+
warnings = [{
|
|
105
|
+
code: 'engine_fallback',
|
|
106
|
+
provider: this.id,
|
|
107
|
+
message: `chat FTS unavailable; LIKE fallback used: ${error instanceof Error ? error.message : String(error)}`,
|
|
108
|
+
}];
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
const selected = rows.slice(0, opts.limit);
|
|
112
|
+
return providerEnvelope(this, query, toHits(selected, ranking, opts.offset), warnings, rows.length > selected.length);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=chat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../../src/search/providers/chat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { searchIndexForProvider } from '../../memory/indexing.js';
|
|
2
|
+
import { providerEnvelope } from '../provider.js';
|
|
3
|
+
export class MemorySearchProvider {
|
|
4
|
+
enabled;
|
|
5
|
+
id = 'local-memory';
|
|
6
|
+
corpus = 'memory';
|
|
7
|
+
constructor(enabled = true) {
|
|
8
|
+
this.enabled = enabled;
|
|
9
|
+
}
|
|
10
|
+
status() {
|
|
11
|
+
return this.enabled ? 'ready' : 'off';
|
|
12
|
+
}
|
|
13
|
+
async search(query, opts) {
|
|
14
|
+
if (!this.enabled) {
|
|
15
|
+
return providerEnvelope(this, query, [], [{
|
|
16
|
+
code: 'provider_off', provider: this.id, message: 'memory search provider is disabled',
|
|
17
|
+
}]);
|
|
18
|
+
}
|
|
19
|
+
const result = searchIndexForProvider(query.query, opts);
|
|
20
|
+
const warnings = [
|
|
21
|
+
...result.degraded.map(name => ({
|
|
22
|
+
code: 'engine_fallback',
|
|
23
|
+
provider: this.id,
|
|
24
|
+
message: `memory index degraded: ${name}`,
|
|
25
|
+
})),
|
|
26
|
+
...(query.sessionFilter !== undefined ? [{
|
|
27
|
+
code: 'session_filter_ignored',
|
|
28
|
+
provider: this.id,
|
|
29
|
+
message: 'memory is shared; sessionFilter does not restrict memory results',
|
|
30
|
+
}] : []),
|
|
31
|
+
];
|
|
32
|
+
const hits = result.hits.map((hit, index) => ({
|
|
33
|
+
corpus: 'memory',
|
|
34
|
+
provider: this.id,
|
|
35
|
+
key: `${hit.relpath}:${hit.source_start_line}`,
|
|
36
|
+
...(hit.sessionId ? { session: hit.sessionId } : {}),
|
|
37
|
+
location: {
|
|
38
|
+
path: hit.relpath || hit.path,
|
|
39
|
+
startLine: hit.source_start_line,
|
|
40
|
+
endLine: hit.source_end_line,
|
|
41
|
+
},
|
|
42
|
+
snippet: hit.snippet,
|
|
43
|
+
ranking: {
|
|
44
|
+
mode: 'rrf',
|
|
45
|
+
sourceRank: opts.offset + index + 1,
|
|
46
|
+
sourceScore: hit.score,
|
|
47
|
+
},
|
|
48
|
+
metadata: { kind: hit.kind, relpath: hit.relpath },
|
|
49
|
+
}));
|
|
50
|
+
return providerEnvelope(this, query, hits, warnings, result.hasMore);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../../src/search/providers/memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,EAAE,gBAAgB,EAAmD,MAAM,gBAAgB,CAAC;AAEnG,MAAM,OAAO,oBAAoB;IAIA;IAHpB,EAAE,GAAG,cAAc,CAAC;IACpB,MAAM,GAAG,QAAiB,CAAC;IAEpC,YAA6B,UAAU,IAAI;QAAd,YAAO,GAAP,OAAO,CAAO;IAAG,CAAC;IAE/C,MAAM;QACF,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAkB,EAAE,IAA2B;QACxD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAChB,OAAO,gBAAgB,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;oBACtC,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,oCAAoC;iBACzF,CAAC,CAAC,CAAC;QACR,CAAC;QAED,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAoB;YAC9B,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC5B,IAAI,EAAE,iBAA0B;gBAChC,QAAQ,EAAE,IAAI,CAAC,EAAE;gBACjB,OAAO,EAAE,0BAA0B,IAAI,EAAE;aAC5C,CAAC,CAAC;YACH,GAAG,CAAC,KAAK,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC;oBACrC,IAAI,EAAE,wBAAiC;oBACvC,QAAQ,EAAE,IAAI,CAAC,EAAE;oBACjB,OAAO,EAAE,kEAAkE;iBAC9E,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SACX,CAAC;QACF,MAAM,IAAI,GAAgB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YACvD,MAAM,EAAE,QAAQ;YAChB,QAAQ,EAAE,IAAI,CAAC,EAAE;YACjB,GAAG,EAAE,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,iBAAiB,EAAE;YAC9C,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpD,QAAQ,EAAE;gBACN,IAAI,EAAE,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,IAAI;gBAC7B,SAAS,EAAE,GAAG,CAAC,iBAAiB;gBAChC,OAAO,EAAE,GAAG,CAAC,eAAe;aAC/B;YACD,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,OAAO,EAAE;gBACL,IAAI,EAAE,KAAK;gBACX,UAAU,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK,GAAG,CAAC;gBACnC,WAAW,EAAE,GAAG,CAAC,KAAK;aACzB;YACD,QAAQ,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE;SACrD,CAAC,CAAC,CAAC;QACJ,OAAO,gBAAgB,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACzE,CAAC;CACJ"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// ─── Wiki search provider (devlog 040 §9) ─────────────
|
|
2
|
+
// Reads the opt-in vault through the shared note search. Only search is reused: the
|
|
3
|
+
// link graph and vault index stay with the manager, because this provider needs neither.
|
|
4
|
+
import { searchNotes } from '../../notes/search.js';
|
|
5
|
+
import { providerEnvelope } from '../provider.js';
|
|
6
|
+
import { forbiddenWikiRoots, readUsableWikiConfig, wikiProviderStatus } from '../../wiki/config.js';
|
|
7
|
+
// The shared note search refuses a request for more than this many results, so a page
|
|
8
|
+
// deep enough to ask for more would throw rather than return an empty tail. Wiki search
|
|
9
|
+
// therefore stops at that boundary and says so, instead of pretending a next page exists
|
|
10
|
+
// that it can never fetch (040 §0c R3).
|
|
11
|
+
export const WIKI_SEARCH_RESULT_CAP = 100;
|
|
12
|
+
export class WikiSearchProvider {
|
|
13
|
+
readConfig;
|
|
14
|
+
id = 'local-wiki';
|
|
15
|
+
corpus = 'wiki';
|
|
16
|
+
// The config is read per call rather than captured, because enabling the vault must
|
|
17
|
+
// take effect without restarting the process that registered this provider.
|
|
18
|
+
// Reads the validated view rather than the raw one: the generic settings API can
|
|
19
|
+
// write this block without going through the enable route, so a root that route
|
|
20
|
+
// would have refused must not become readable by that back door.
|
|
21
|
+
constructor(readConfig = () => readUsableWikiConfig(forbiddenWikiRoots())) {
|
|
22
|
+
this.readConfig = readConfig;
|
|
23
|
+
}
|
|
24
|
+
config() {
|
|
25
|
+
try {
|
|
26
|
+
return this.readConfig();
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
// An unusable root is a configuration error, not a crash: status() reports it.
|
|
30
|
+
return { enabled: false, root: '', promptDigest: false };
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
status() {
|
|
34
|
+
return wikiProviderStatus(this.config());
|
|
35
|
+
}
|
|
36
|
+
async search(query, opts) {
|
|
37
|
+
const config = this.config();
|
|
38
|
+
const status = wikiProviderStatus(config);
|
|
39
|
+
if (status !== 'ready') {
|
|
40
|
+
// A disabled vault performs no filesystem read at all, which is what makes
|
|
41
|
+
// "off by default" mean something on disk and not just in the UI.
|
|
42
|
+
return providerEnvelope(this, query, [], [{
|
|
43
|
+
code: status === 'off' ? 'provider_off' : 'provider_failed',
|
|
44
|
+
provider: this.id,
|
|
45
|
+
message: status === 'off'
|
|
46
|
+
? 'wiki search provider is disabled'
|
|
47
|
+
: 'wiki vault is unavailable',
|
|
48
|
+
}]);
|
|
49
|
+
}
|
|
50
|
+
const warnings = query.sessionFilter === undefined ? [] : [{
|
|
51
|
+
code: 'session_filter_ignored',
|
|
52
|
+
provider: this.id,
|
|
53
|
+
message: 'the wiki is shared; sessionFilter does not restrict wiki results',
|
|
54
|
+
}];
|
|
55
|
+
// Ask for one more than this page needs so hasMore is observed rather than
|
|
56
|
+
// guessed, but never ask the shared search for more than it accepts.
|
|
57
|
+
const want = Math.min(opts.offset + opts.limit + 1, WIKI_SEARCH_RESULT_CAP);
|
|
58
|
+
const rows = await searchNotes(config.root, query.query, { limit: want });
|
|
59
|
+
const page = rows.slice(opts.offset, opts.offset + opts.limit);
|
|
60
|
+
const hasMore = rows.length > opts.offset + opts.limit;
|
|
61
|
+
if (!hasMore && rows.length >= WIKI_SEARCH_RESULT_CAP) {
|
|
62
|
+
warnings.push({
|
|
63
|
+
code: 'engine_fallback',
|
|
64
|
+
provider: this.id,
|
|
65
|
+
message: `wiki search stops at ${WIKI_SEARCH_RESULT_CAP} results`,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
const hits = page.map((row, index) => ({
|
|
69
|
+
corpus: 'wiki',
|
|
70
|
+
provider: this.id,
|
|
71
|
+
key: `${row.path}:${row.line}`,
|
|
72
|
+
location: { path: row.path, startLine: row.line, endLine: row.line },
|
|
73
|
+
snippet: row.context || row.content,
|
|
74
|
+
ranking: { mode: 'like', sourceRank: opts.offset + index },
|
|
75
|
+
metadata: { kind: row.kind },
|
|
76
|
+
}));
|
|
77
|
+
return providerEnvelope(this, query, hits, warnings, hasMore);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=wiki.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wiki.js","sourceRoot":"","sources":["../../../../src/search/providers/wiki.ts"],"names":[],"mappings":"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"}
|
package/dist/src/slack/api.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// ─── Slack Web API Client ────────────────────────────
|
|
2
2
|
// Thin fetch wrapper. No SDK: Slack's HTTP surface is small and cli-jaw's
|
|
3
3
|
// Discord transport already establishes the house pattern (REST via fetch,
|
|
4
|
-
// lazily imported). See devlog/
|
|
4
|
+
// lazily imported). See devlog/_fin/260802_slack_channel/000_plan.md D-1.
|
|
5
5
|
//
|
|
6
6
|
// The critical Slack-specific rule: Slack returns HTTP 200 with
|
|
7
7
|
// {"ok": false, "error": "..."} for application errors. Checking response.ok
|
|
@@ -103,6 +103,15 @@ export async function slackApi(token, method, body, options = {}) {
|
|
|
103
103
|
const url = `${SLACK_API_BASE}/${method}`;
|
|
104
104
|
const headers = { Authorization: `Bearer ${token}` };
|
|
105
105
|
const init = { method: 'POST', headers };
|
|
106
|
+
if (options.signal && options.timeoutMs !== undefined) {
|
|
107
|
+
init.signal = AbortSignal.any([options.signal, AbortSignal.timeout(options.timeoutMs)]);
|
|
108
|
+
}
|
|
109
|
+
else if (options.signal) {
|
|
110
|
+
init.signal = options.signal;
|
|
111
|
+
}
|
|
112
|
+
else if (options.timeoutMs !== undefined) {
|
|
113
|
+
init.signal = AbortSignal.timeout(options.timeoutMs);
|
|
114
|
+
}
|
|
106
115
|
if (options.form && body) {
|
|
107
116
|
const params = new URLSearchParams();
|
|
108
117
|
for (const [k, v] of Object.entries(body)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/slack/api.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,0EAA0E;AAC1E,2EAA2E;AAC3E,
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/slack/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// ─── Slack Attachment Recovery ───────────────────────
|
|
2
|
+
// app_mention 봉투에는 files 가 없다 — 문서화된 스키마에 부재하며, Slack은
|
|
3
|
+
// 첨부가 필요하면 channel+ts 로 대화를 다시 조회하라고 안내한다.
|
|
4
|
+
// https://docs.slack.dev/reference/events/app_mention/
|
|
5
|
+
//
|
|
6
|
+
// 같은 업로드의 message 사본은 events.ts 의 mention_via_app_mention 가
|
|
7
|
+
// 드롭한다(한 멘션이 두 에이전트 실행이 되는 것을 막는 의도적 동작). 그래서
|
|
8
|
+
// 멘션과 함께 올린 첨부는 어느 봉투로도 도달하지 못한다. 드롭을 되돌리는 대신
|
|
9
|
+
// 첨부만 되찾는다. 설계 근거: devlog/_plan/260806_slack_multifile_ingest/020.
|
|
10
|
+
import { fetchSlackHistory, fetchSlackReplies } from './history.js';
|
|
11
|
+
/** 스레드 조회 상한. 한 스레드에서 대상 ts 를 찾기에 충분하다. */
|
|
12
|
+
const THREAD_LOOKUP_LIMIT = 50;
|
|
13
|
+
/**
|
|
14
|
+
* (channel, ts) 메시지의 첨부를 되찾는다. 스레드 안이면 replies, 아니면
|
|
15
|
+
* history 를 쓴다.
|
|
16
|
+
*
|
|
17
|
+
* 실패는 예외가 아니라 빈 배열이다: 첨부 복구는 보조 경로이고, 여기서 던지면
|
|
18
|
+
* 텍스트만 있는 평범한 멘션까지 처리가 중단된다.
|
|
19
|
+
*/
|
|
20
|
+
export async function recoverSlackAttachments(token, channel, ts, options = {}) {
|
|
21
|
+
if (!token || !channel || !ts)
|
|
22
|
+
return [];
|
|
23
|
+
const fetchOpts = options.fetchImpl ? { fetchImpl: options.fetchImpl } : {};
|
|
24
|
+
try {
|
|
25
|
+
const result = options.threadTs
|
|
26
|
+
? await fetchSlackReplies(token, channel, options.threadTs, {
|
|
27
|
+
limit: THREAD_LOOKUP_LIMIT, ...fetchOpts,
|
|
28
|
+
})
|
|
29
|
+
// oldest 는 배타적이므로 inclusive 없이는 대상 메시지가 빠진다.
|
|
30
|
+
: await fetchSlackHistory(token, channel, {
|
|
31
|
+
oldest: ts, inclusive: true, limit: 1, ...fetchOpts,
|
|
32
|
+
});
|
|
33
|
+
if (!result.ok)
|
|
34
|
+
return [];
|
|
35
|
+
const match = result.messages.find(message => message.ts === ts);
|
|
36
|
+
return match?.files ?? [];
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=attachment-recovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachment-recovery.js","sourceRoot":"","sources":["../../../src/slack/attachment-recovery.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,uDAAuD;AACvD,2CAA2C;AAC3C,uDAAuD;AACvD,EAAE;AACF,4DAA4D;AAC5D,8CAA8C;AAC9C,8CAA8C;AAC9C,mEAAmE;AAEnE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AASpE,2CAA2C;AAC3C,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAE/B;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CACzC,KAAa,EACb,OAAe,EACf,EAAU,EACV,UAAoC,EAAE;IAEtC,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,IAAI,CAAC,EAAE;QAAE,OAAO,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5E,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ;YAC3B,CAAC,CAAC,MAAM,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE;gBACxD,KAAK,EAAE,mBAAmB,EAAE,GAAG,SAAS;aAC3C,CAAC;YACF,6CAA6C;YAC7C,CAAC,CAAC,MAAM,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE;gBACtC,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,SAAS;aACtD,CAAC,CAAC;QACP,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACjE,OAAO,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,EAAE,CAAC;IACd,CAAC;AACL,CAAC"}
|