@geminixiang/mikan 1.0.0-beta.8 → 1.0.0-beta.80
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1149 -0
- package/README.md +98 -38
- package/dist/adapters/commands/admin.d.ts.map +1 -0
- package/dist/{commands → adapters/commands}/admin.js +12 -9
- package/dist/adapters/commands/admin.js.map +1 -0
- package/dist/{commands → adapters/commands}/auto-reply.d.ts +0 -3
- package/dist/adapters/commands/auto-reply.d.ts.map +1 -0
- package/dist/adapters/commands/auto-reply.js +47 -0
- package/dist/adapters/commands/auto-reply.js.map +1 -0
- package/dist/adapters/commands/login.d.ts +6 -0
- package/dist/adapters/commands/login.d.ts.map +1 -0
- package/dist/adapters/commands/login.js +158 -0
- package/dist/adapters/commands/login.js.map +1 -0
- package/dist/adapters/commands/manifest.d.ts +17 -0
- package/dist/adapters/commands/manifest.d.ts.map +1 -0
- package/dist/adapters/commands/manifest.js +121 -0
- package/dist/adapters/commands/manifest.js.map +1 -0
- package/dist/adapters/commands/model.d.ts +9 -0
- package/dist/adapters/commands/model.d.ts.map +1 -0
- package/dist/adapters/commands/model.js +136 -0
- package/dist/adapters/commands/model.js.map +1 -0
- package/dist/adapters/commands/new.d.ts.map +1 -0
- package/dist/adapters/commands/new.js +39 -0
- package/dist/adapters/commands/new.js.map +1 -0
- package/dist/adapters/commands/registry.d.ts +4 -0
- package/dist/adapters/commands/registry.d.ts.map +1 -0
- package/dist/adapters/commands/registry.js +35 -0
- package/dist/adapters/commands/registry.js.map +1 -0
- package/dist/{commands → adapters/commands}/sandbox.d.ts +0 -1
- package/dist/adapters/commands/sandbox.d.ts.map +1 -0
- package/dist/adapters/commands/sandbox.js +125 -0
- package/dist/adapters/commands/sandbox.js.map +1 -0
- package/dist/adapters/commands/session-view.d.ts.map +1 -0
- package/dist/{commands → adapters/commands}/session-view.js +21 -16
- package/dist/adapters/commands/session-view.js.map +1 -0
- package/dist/adapters/commands/types.d.ts +105 -0
- package/dist/adapters/commands/types.d.ts.map +1 -0
- package/dist/adapters/commands/types.js.map +1 -0
- package/dist/adapters/commands/utils.d.ts +11 -0
- package/dist/adapters/commands/utils.d.ts.map +1 -0
- package/dist/{commands → adapters/commands}/utils.js +15 -1
- package/dist/adapters/commands/utils.js.map +1 -0
- package/dist/adapters/discord/bot.d.ts +10 -17
- package/dist/adapters/discord/bot.d.ts.map +1 -1
- package/dist/adapters/discord/bot.js +232 -297
- package/dist/adapters/discord/bot.js.map +1 -1
- package/dist/adapters/discord/components.d.ts +4 -0
- package/dist/adapters/discord/components.d.ts.map +1 -0
- package/dist/adapters/discord/components.js +9 -0
- package/dist/adapters/discord/components.js.map +1 -0
- package/dist/adapters/discord/context.d.ts +3 -7
- package/dist/adapters/discord/context.d.ts.map +1 -1
- package/dist/adapters/discord/context.js +55 -219
- package/dist/adapters/discord/context.js.map +1 -1
- package/dist/adapters/discord/format.d.ts +2 -0
- package/dist/adapters/discord/format.d.ts.map +1 -0
- package/dist/adapters/discord/format.js +47 -0
- package/dist/adapters/discord/format.js.map +1 -0
- package/dist/adapters/discord/types.d.ts +90 -1
- package/dist/adapters/discord/types.d.ts.map +1 -1
- package/dist/adapters/discord/types.js.map +1 -1
- package/dist/adapters/github/bot.d.ts +25 -9
- package/dist/adapters/github/bot.d.ts.map +1 -1
- package/dist/adapters/github/bot.js +326 -154
- package/dist/adapters/github/bot.js.map +1 -1
- package/dist/adapters/github/client.d.ts +35 -23
- package/dist/adapters/github/client.d.ts.map +1 -1
- package/dist/adapters/github/client.js +121 -28
- package/dist/adapters/github/client.js.map +1 -1
- package/dist/adapters/github/context.d.ts +3 -8
- package/dist/adapters/github/context.d.ts.map +1 -1
- package/dist/adapters/github/context.js +64 -131
- package/dist/adapters/github/context.js.map +1 -1
- package/dist/adapters/github/github-ops.d.ts +22 -0
- package/dist/adapters/github/github-ops.d.ts.map +1 -0
- package/dist/adapters/github/github-ops.js +277 -0
- package/dist/adapters/github/github-ops.js.map +1 -0
- package/dist/adapters/github/ids.d.ts +2 -23
- package/dist/adapters/github/ids.d.ts.map +1 -1
- package/dist/adapters/github/ids.js +6 -36
- package/dist/adapters/github/ids.js.map +1 -1
- package/dist/adapters/github/repo.d.ts +8 -0
- package/dist/adapters/github/repo.d.ts.map +1 -0
- package/dist/adapters/github/repo.js +92 -0
- package/dist/adapters/github/repo.js.map +1 -0
- package/dist/adapters/github/tool-pack.d.ts +4 -0
- package/dist/adapters/github/tool-pack.d.ts.map +1 -0
- package/dist/adapters/github/tool-pack.js +45 -0
- package/dist/adapters/github/tool-pack.js.map +1 -0
- package/dist/adapters/github/tools/checks.d.ts +14 -0
- package/dist/adapters/github/tools/checks.d.ts.map +1 -0
- package/dist/adapters/github/tools/checks.js +80 -0
- package/dist/adapters/github/tools/checks.js.map +1 -0
- package/dist/adapters/github/tools/issue.d.ts +18 -0
- package/dist/adapters/github/tools/issue.d.ts.map +1 -0
- package/dist/adapters/github/tools/issue.js +44 -0
- package/dist/adapters/github/tools/issue.js.map +1 -0
- package/dist/adapters/github/tools/pr.d.ts +17 -0
- package/dist/adapters/github/tools/pr.d.ts.map +1 -0
- package/dist/adapters/github/tools/pr.js +42 -0
- package/dist/adapters/github/tools/pr.js.map +1 -0
- package/dist/adapters/github/tools/read.d.ts +17 -0
- package/dist/adapters/github/tools/read.d.ts.map +1 -0
- package/dist/adapters/github/tools/read.js +134 -0
- package/dist/adapters/github/tools/read.js.map +1 -0
- package/dist/adapters/github/tools/review-reply.d.ts +14 -0
- package/dist/adapters/github/tools/review-reply.d.ts.map +1 -0
- package/dist/adapters/github/tools/review-reply.js +34 -0
- package/dist/adapters/github/tools/review-reply.js.map +1 -0
- package/dist/adapters/github/tools/sync.d.ts +13 -0
- package/dist/adapters/github/tools/sync.d.ts.map +1 -0
- package/dist/adapters/github/tools/sync.js +29 -0
- package/dist/adapters/github/tools/sync.js.map +1 -0
- package/dist/adapters/github/types.d.ts +197 -18
- package/dist/adapters/github/types.d.ts.map +1 -1
- package/dist/adapters/github/types.js.map +1 -1
- package/dist/adapters/github/webhook.d.ts +6 -0
- package/dist/adapters/github/webhook.d.ts.map +1 -0
- package/dist/adapters/github/webhook.js +62 -0
- package/dist/adapters/github/webhook.js.map +1 -0
- package/dist/adapters/intake.d.ts +4 -10
- package/dist/adapters/intake.d.ts.map +1 -1
- package/dist/adapters/intake.js +74 -31
- package/dist/adapters/intake.js.map +1 -1
- package/dist/adapters/markdown-tables.d.ts +8 -0
- package/dist/adapters/markdown-tables.d.ts.map +1 -0
- package/dist/adapters/markdown-tables.js +111 -0
- package/dist/adapters/markdown-tables.js.map +1 -0
- package/dist/{platform-messages.d.ts → adapters/messages.d.ts} +3 -2
- package/dist/adapters/messages.d.ts.map +1 -0
- package/dist/{platform-messages.js → adapters/messages.js} +4 -1
- package/dist/adapters/messages.js.map +1 -0
- package/dist/adapters/progressive-renderer.d.ts +7 -0
- package/dist/adapters/progressive-renderer.d.ts.map +1 -0
- package/dist/adapters/progressive-renderer.js +423 -0
- package/dist/adapters/progressive-renderer.js.map +1 -0
- package/dist/adapters/shared.d.ts +24 -53
- package/dist/adapters/shared.d.ts.map +1 -1
- package/dist/adapters/shared.js +140 -91
- package/dist/adapters/shared.js.map +1 -1
- package/dist/adapters/slack/assistant.d.ts +23 -0
- package/dist/adapters/slack/assistant.d.ts.map +1 -0
- package/dist/adapters/slack/assistant.js +109 -0
- package/dist/adapters/slack/assistant.js.map +1 -0
- package/dist/adapters/slack/auto-reply-context.d.ts +14 -0
- package/dist/adapters/slack/auto-reply-context.d.ts.map +1 -0
- package/dist/adapters/slack/auto-reply-context.js +21 -0
- package/dist/adapters/slack/auto-reply-context.js.map +1 -0
- package/dist/adapters/slack/blocks.d.ts +5 -0
- package/dist/adapters/slack/blocks.d.ts.map +1 -1
- package/dist/adapters/slack/blocks.js +84 -148
- package/dist/adapters/slack/blocks.js.map +1 -1
- package/dist/adapters/slack/bot.d.ts +51 -39
- package/dist/adapters/slack/bot.d.ts.map +1 -1
- package/dist/adapters/slack/bot.js +892 -567
- package/dist/adapters/slack/bot.js.map +1 -1
- package/dist/adapters/slack/context.d.ts +3 -9
- package/dist/adapters/slack/context.d.ts.map +1 -1
- package/dist/adapters/slack/context.js +8 -17
- package/dist/adapters/slack/context.js.map +1 -1
- package/dist/adapters/slack/jev-context.d.ts +17 -0
- package/dist/adapters/slack/jev-context.d.ts.map +1 -0
- package/dist/adapters/slack/jev-context.js +57 -0
- package/dist/adapters/slack/jev-context.js.map +1 -0
- package/dist/adapters/slack/markdown.d.ts +2 -0
- package/dist/adapters/slack/markdown.d.ts.map +1 -0
- package/dist/adapters/slack/markdown.js +43 -0
- package/dist/adapters/slack/markdown.js.map +1 -0
- package/dist/adapters/slack/persona.d.ts +6 -0
- package/dist/adapters/slack/persona.d.ts.map +1 -0
- package/dist/adapters/slack/persona.js +13 -0
- package/dist/adapters/slack/persona.js.map +1 -0
- package/dist/adapters/slack/response-lifecycle.d.ts +3 -4
- package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
- package/dist/adapters/slack/response-lifecycle.js +221 -347
- package/dist/adapters/slack/response-lifecycle.js.map +1 -1
- package/dist/adapters/slack/session.d.ts +3 -2
- package/dist/adapters/slack/session.d.ts.map +1 -1
- package/dist/adapters/slack/session.js +9 -13
- package/dist/adapters/slack/session.js.map +1 -1
- package/dist/adapters/slack/stream-limits.d.ts +10 -0
- package/dist/adapters/slack/stream-limits.d.ts.map +1 -0
- package/dist/adapters/slack/stream-limits.js +22 -0
- package/dist/adapters/slack/stream-limits.js.map +1 -0
- package/dist/adapters/slack/task-intent.d.ts +19 -0
- package/dist/adapters/slack/task-intent.d.ts.map +1 -0
- package/dist/adapters/slack/task-intent.js +65 -0
- package/dist/adapters/slack/task-intent.js.map +1 -0
- package/dist/adapters/slack/task-status.d.ts +6 -0
- package/dist/adapters/slack/task-status.d.ts.map +1 -0
- package/dist/adapters/slack/task-status.js +100 -0
- package/dist/adapters/slack/task-status.js.map +1 -0
- package/dist/adapters/slack/tool-pack.d.ts +4 -0
- package/dist/adapters/slack/tool-pack.d.ts.map +1 -0
- package/dist/adapters/slack/tool-pack.js +40 -0
- package/dist/adapters/slack/tool-pack.js.map +1 -0
- package/dist/adapters/slack/tools/blockkit.d.ts +17 -0
- package/dist/adapters/slack/tools/blockkit.d.ts.map +1 -0
- package/dist/adapters/slack/tools/blockkit.js +98 -0
- package/dist/adapters/slack/tools/blockkit.js.map +1 -0
- package/dist/adapters/slack/types.d.ts +91 -5
- package/dist/adapters/slack/types.d.ts.map +1 -1
- package/dist/adapters/slack/types.js.map +1 -1
- package/dist/adapters/slack/update-diagnostics.d.ts +13 -0
- package/dist/adapters/slack/update-diagnostics.d.ts.map +1 -0
- package/dist/adapters/slack/update-diagnostics.js +128 -0
- package/dist/adapters/slack/update-diagnostics.js.map +1 -0
- package/dist/adapters/telegram/bot.d.ts +8 -18
- package/dist/adapters/telegram/bot.d.ts.map +1 -1
- package/dist/adapters/telegram/bot.js +114 -232
- package/dist/adapters/telegram/bot.js.map +1 -1
- package/dist/adapters/telegram/context.d.ts +3 -7
- package/dist/adapters/telegram/context.d.ts.map +1 -1
- package/dist/adapters/telegram/context.js +47 -191
- package/dist/adapters/telegram/context.js.map +1 -1
- package/dist/adapters/telegram/types.d.ts +24 -1
- package/dist/adapters/telegram/types.d.ts.map +1 -1
- package/dist/adapters/telegram/types.js.map +1 -1
- package/dist/adapters/types.d.ts +89 -16
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/adapters/types.js.map +1 -1
- package/dist/adapters/web/admin/client-assets.d.ts +4 -0
- package/dist/adapters/web/admin/client-assets.d.ts.map +1 -0
- package/dist/adapters/web/admin/client-assets.js +1766 -0
- package/dist/adapters/web/admin/client-assets.js.map +1 -0
- package/dist/adapters/web/admin/portal.d.ts +27 -0
- package/dist/adapters/web/admin/portal.d.ts.map +1 -0
- package/dist/adapters/web/admin/portal.js +1506 -0
- package/dist/adapters/web/admin/portal.js.map +1 -0
- package/dist/{web → adapters/web}/admin/provider-models.d.ts +1 -1
- package/dist/adapters/web/admin/provider-models.d.ts.map +1 -0
- package/dist/{web → adapters/web}/admin/provider-models.js +1 -1
- package/dist/adapters/web/admin/provider-models.js.map +1 -0
- package/dist/adapters/web/admin/types.d.ts +56 -0
- package/dist/adapters/web/admin/types.d.ts.map +1 -0
- package/dist/adapters/web/admin/types.js.map +1 -0
- package/dist/adapters/web/login/oauth.d.ts +4 -0
- package/dist/adapters/web/login/oauth.d.ts.map +1 -0
- package/dist/{web → adapters/web}/login/oauth.js +61 -100
- package/dist/adapters/web/login/oauth.js.map +1 -0
- package/dist/adapters/web/login/portal.d.ts +10 -0
- package/dist/adapters/web/login/portal.d.ts.map +1 -0
- package/dist/{web → adapters/web}/login/portal.js +169 -159
- package/dist/adapters/web/login/portal.js.map +1 -0
- package/dist/{web → adapters/web}/login/types.d.ts +1 -17
- package/dist/adapters/web/login/types.d.ts.map +1 -0
- package/dist/adapters/web/login/types.js.map +1 -0
- package/dist/adapters/web/portal-shell.d.ts +9 -0
- package/dist/adapters/web/portal-shell.d.ts.map +1 -0
- package/dist/{portal-shell.js → adapters/web/portal-shell.js} +73 -11
- package/dist/adapters/web/portal-shell.js.map +1 -0
- package/dist/adapters/web/server.d.ts +33 -0
- package/dist/adapters/web/server.d.ts.map +1 -0
- package/dist/{web → adapters/web}/server.js +15 -9
- package/dist/adapters/web/server.js.map +1 -0
- package/dist/adapters/web/session-view/portal.d.ts +19 -0
- package/dist/adapters/web/session-view/portal.d.ts.map +1 -0
- package/dist/{web → adapters/web}/session-view/portal.js +641 -181
- package/dist/adapters/web/session-view/portal.js.map +1 -0
- package/dist/{web → adapters/web}/session-view/types.d.ts +1 -6
- package/dist/adapters/web/session-view/types.d.ts.map +1 -0
- package/dist/adapters/web/session-view/types.js.map +1 -0
- package/dist/{web → adapters/web}/token-store.d.ts +0 -3
- package/dist/adapters/web/token-store.d.ts.map +1 -0
- package/dist/{web → adapters/web}/token-store.js +1 -3
- package/dist/adapters/web/token-store.js.map +1 -0
- package/dist/adapters/web/types.d.ts.map +1 -0
- package/dist/adapters/web/types.js.map +1 -0
- package/dist/cli/arg-grammar.d.ts +8 -0
- package/dist/cli/arg-grammar.d.ts.map +1 -0
- package/dist/cli/arg-grammar.js +47 -0
- package/dist/cli/arg-grammar.js.map +1 -0
- package/dist/cli/boot.d.ts +4 -0
- package/dist/cli/boot.d.ts.map +1 -0
- package/dist/cli/boot.js +81 -0
- package/dist/cli/boot.js.map +1 -0
- package/dist/cli/download.d.ts.map +1 -0
- package/dist/cli/download.js +84 -0
- package/dist/cli/download.js.map +1 -0
- package/dist/cli/office.d.ts +2 -0
- package/dist/cli/office.d.ts.map +1 -0
- package/dist/cli/office.js +151 -0
- package/dist/cli/office.js.map +1 -0
- package/dist/cli/onboard.d.ts +8 -0
- package/dist/cli/onboard.d.ts.map +1 -0
- package/dist/cli/onboard.js +195 -0
- package/dist/cli/onboard.js.map +1 -0
- package/dist/cli/process-lifecycle.d.ts +14 -0
- package/dist/cli/process-lifecycle.d.ts.map +1 -0
- package/dist/cli/process-lifecycle.js +61 -0
- package/dist/cli/process-lifecycle.js.map +1 -0
- package/dist/cli/sandbox.d.ts +3 -0
- package/dist/cli/sandbox.d.ts.map +1 -0
- package/dist/cli/sandbox.js +80 -0
- package/dist/cli/sandbox.js.map +1 -0
- package/dist/cli/sessions.d.ts +2 -0
- package/dist/cli/sessions.d.ts.map +1 -0
- package/dist/cli/sessions.js +78 -0
- package/dist/cli/sessions.js.map +1 -0
- package/dist/cli/types.d.ts +21 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/env-manifest.d.ts +17 -0
- package/dist/env-manifest.d.ts.map +1 -0
- package/dist/env-manifest.js +249 -0
- package/dist/env-manifest.js.map +1 -0
- package/dist/events/index.d.ts +122 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +299 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/scheduler.d.ts +25 -0
- package/dist/events/scheduler.d.ts.map +1 -0
- package/dist/events/scheduler.js +223 -0
- package/dist/events/scheduler.js.map +1 -0
- package/dist/file-guards.d.ts +13 -0
- package/dist/file-guards.d.ts.map +1 -0
- package/dist/file-guards.js +104 -0
- package/dist/file-guards.js.map +1 -0
- package/dist/harness/execution-env.d.ts +4 -0
- package/dist/harness/execution-env.d.ts.map +1 -0
- package/dist/harness/execution-env.js +245 -0
- package/dist/harness/execution-env.js.map +1 -0
- package/dist/harness/execution-resolver.d.ts +23 -0
- package/dist/harness/execution-resolver.d.ts.map +1 -0
- package/dist/harness/execution-resolver.js +156 -0
- package/dist/harness/execution-resolver.js.map +1 -0
- package/dist/harness/http.d.ts +0 -12
- package/dist/harness/http.d.ts.map +1 -1
- package/dist/harness/http.js +0 -34
- package/dist/harness/http.js.map +1 -1
- package/dist/harness/index.d.ts +19 -17
- package/dist/harness/index.d.ts.map +1 -1
- package/dist/harness/index.js +12 -15
- package/dist/harness/index.js.map +1 -1
- package/dist/harness/jev.d.ts +67 -0
- package/dist/harness/jev.d.ts.map +1 -0
- package/dist/harness/jev.js +135 -0
- package/dist/harness/jev.js.map +1 -0
- package/dist/harness/mcp-result.d.ts +20 -0
- package/dist/harness/mcp-result.d.ts.map +1 -0
- package/dist/harness/mcp-result.js +179 -0
- package/dist/harness/mcp-result.js.map +1 -0
- package/dist/harness/mcp.d.ts +17 -0
- package/dist/harness/mcp.d.ts.map +1 -0
- package/dist/harness/mcp.js +243 -0
- package/dist/harness/mcp.js.map +1 -0
- package/dist/harness/models.d.ts +2 -19
- package/dist/harness/models.d.ts.map +1 -1
- package/dist/harness/models.js +42 -94
- package/dist/harness/models.js.map +1 -1
- package/dist/harness/open-connector.d.ts +12 -0
- package/dist/harness/open-connector.d.ts.map +1 -0
- package/dist/harness/open-connector.js +160 -0
- package/dist/harness/open-connector.js.map +1 -0
- package/dist/harness/presenter.d.ts +11 -0
- package/dist/harness/presenter.d.ts.map +1 -0
- package/dist/harness/presenter.js +824 -0
- package/dist/harness/presenter.js.map +1 -0
- package/dist/harness/prompt.d.ts +18 -0
- package/dist/harness/prompt.d.ts.map +1 -0
- package/dist/harness/prompt.js +403 -0
- package/dist/harness/prompt.js.map +1 -0
- package/dist/harness/runner.d.ts +2 -123
- package/dist/harness/runner.d.ts.map +1 -1
- package/dist/harness/runner.js +547 -415
- package/dist/harness/runner.js.map +1 -1
- package/dist/harness/session.d.ts +98 -0
- package/dist/harness/session.d.ts.map +1 -0
- package/dist/harness/session.js +645 -0
- package/dist/harness/session.js.map +1 -0
- package/dist/harness/skills.d.ts +7 -41
- package/dist/harness/skills.d.ts.map +1 -1
- package/dist/harness/skills.js +101 -55
- package/dist/harness/skills.js.map +1 -1
- package/dist/harness/subagent-profiles.d.ts +3 -0
- package/dist/harness/subagent-profiles.d.ts.map +1 -0
- package/dist/harness/subagent-profiles.js +260 -0
- package/dist/harness/subagent-profiles.js.map +1 -0
- package/dist/harness/subagent.d.ts +39 -0
- package/dist/harness/subagent.d.ts.map +1 -0
- package/dist/harness/subagent.js +618 -0
- package/dist/harness/subagent.js.map +1 -0
- package/dist/harness/tool-args.d.ts +2 -0
- package/dist/harness/tool-args.d.ts.map +1 -0
- package/dist/harness/tool-args.js +20 -0
- package/dist/harness/tool-args.js.map +1 -0
- package/dist/harness/tools/attach.d.ts +13 -0
- package/dist/harness/tools/attach.d.ts.map +1 -0
- package/dist/{adapters/slack → harness}/tools/attach.js +2 -2
- package/dist/harness/tools/attach.js.map +1 -0
- package/dist/harness/tools/event.d.ts +28 -0
- package/dist/harness/tools/event.d.ts.map +1 -0
- package/dist/harness/tools/event.js +166 -0
- package/dist/harness/tools/event.js.map +1 -0
- package/dist/harness/tools/generate-image.d.ts +20 -0
- package/dist/harness/tools/generate-image.d.ts.map +1 -0
- package/dist/harness/tools/generate-image.js +68 -0
- package/dist/harness/tools/generate-image.js.map +1 -0
- package/dist/harness/tools/host-fn-tool.d.ts +14 -0
- package/dist/harness/tools/host-fn-tool.d.ts.map +1 -0
- package/dist/harness/tools/host-fn-tool.js +39 -0
- package/dist/harness/tools/host-fn-tool.js.map +1 -0
- package/dist/harness/tools/index.d.ts +34 -0
- package/dist/harness/tools/index.d.ts.map +1 -0
- package/dist/harness/tools/index.js +49 -0
- package/dist/harness/tools/index.js.map +1 -0
- package/dist/harness/tools/jev-browser.d.ts +42 -0
- package/dist/harness/tools/jev-browser.d.ts.map +1 -0
- package/dist/harness/tools/jev-browser.js +547 -0
- package/dist/harness/tools/jev-browser.js.map +1 -0
- package/dist/harness/tools/jev.d.ts +15 -0
- package/dist/harness/tools/jev.d.ts.map +1 -0
- package/dist/harness/tools/jev.js +98 -0
- package/dist/harness/tools/jev.js.map +1 -0
- package/dist/harness/tools/pi-tools.d.ts +8 -0
- package/dist/harness/tools/pi-tools.d.ts.map +1 -0
- package/dist/harness/tools/pi-tools.js +55 -0
- package/dist/harness/tools/pi-tools.js.map +1 -0
- package/dist/harness/tools/react.d.ts +11 -0
- package/dist/harness/tools/react.d.ts.map +1 -0
- package/dist/harness/tools/react.js +24 -0
- package/dist/harness/tools/react.js.map +1 -0
- package/dist/harness/tools/sandbox.d.ts +24 -0
- package/dist/harness/tools/sandbox.d.ts.map +1 -0
- package/dist/{tools → harness/tools}/sandbox.js +15 -9
- package/dist/harness/tools/sandbox.js.map +1 -0
- package/dist/harness/tools/secret-redaction.d.ts +9 -0
- package/dist/harness/tools/secret-redaction.d.ts.map +1 -0
- package/dist/harness/tools/secret-redaction.js +44 -0
- package/dist/harness/tools/secret-redaction.js.map +1 -0
- package/dist/harness/tools/subagent.d.ts +51 -0
- package/dist/harness/tools/subagent.d.ts.map +1 -0
- package/dist/harness/tools/subagent.js +581 -0
- package/dist/harness/tools/subagent.js.map +1 -0
- package/dist/harness/tools/task.d.ts +22 -0
- package/dist/harness/tools/task.d.ts.map +1 -0
- package/dist/harness/tools/task.js +80 -0
- package/dist/harness/tools/task.js.map +1 -0
- package/dist/harness/tools/types.d.ts +14 -0
- package/dist/harness/tools/types.d.ts.map +1 -0
- package/dist/harness/tools/types.js.map +1 -0
- package/dist/harness/types.d.ts +345 -29
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js +1 -1
- package/dist/harness/types.js.map +1 -1
- package/dist/index.d.ts +36 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -7
- package/dist/index.js.map +1 -1
- package/dist/log.d.ts +0 -1
- package/dist/log.d.ts.map +1 -1
- package/dist/log.js +3 -13
- package/dist/log.js.map +1 -1
- package/dist/main.js +300 -217
- package/dist/main.js.map +1 -1
- package/dist/memory-capture/index.d.ts +15 -0
- package/dist/memory-capture/index.d.ts.map +1 -0
- package/dist/memory-capture/index.js +199 -0
- package/dist/memory-capture/index.js.map +1 -0
- package/dist/memory-capture/types.d.ts +27 -0
- package/dist/memory-capture/types.d.ts.map +1 -0
- package/dist/memory-capture/types.js +2 -0
- package/dist/memory-capture/types.js.map +1 -0
- package/dist/observability/index.d.ts +30 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +273 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/instrument.js +9 -6
- package/dist/observability/instrument.js.map +1 -1
- package/dist/observability/otel.d.ts +10 -0
- package/dist/observability/otel.d.ts.map +1 -0
- package/dist/observability/otel.js +182 -0
- package/dist/observability/otel.js.map +1 -0
- package/dist/observability/sentry.d.ts +32 -13
- package/dist/observability/sentry.d.ts.map +1 -1
- package/dist/observability/sentry.js +85 -58
- package/dist/observability/sentry.js.map +1 -1
- package/dist/observability/types.d.ts +30 -3
- package/dist/observability/types.d.ts.map +1 -1
- package/dist/observability/types.js.map +1 -1
- package/dist/office/index.d.ts +74 -0
- package/dist/office/index.d.ts.map +1 -0
- package/dist/office/index.js +971 -0
- package/dist/office/index.js.map +1 -0
- package/dist/office/projection.d.ts +11 -0
- package/dist/office/projection.d.ts.map +1 -0
- package/dist/office/projection.js +146 -0
- package/dist/office/projection.js.map +1 -0
- package/dist/office/types.d.ts +55 -0
- package/dist/office/types.d.ts.map +1 -0
- package/dist/office/types.js +2 -0
- package/dist/office/types.js.map +1 -0
- package/dist/runtime/conversation-runtime.d.ts +0 -1
- package/dist/runtime/conversation-runtime.d.ts.map +1 -1
- package/dist/runtime/conversation-runtime.js +375 -152
- package/dist/runtime/conversation-runtime.js.map +1 -1
- package/dist/runtime/session-lifecycle.d.ts +66 -0
- package/dist/runtime/session-lifecycle.d.ts.map +1 -0
- package/dist/runtime/session-lifecycle.js +393 -0
- package/dist/runtime/session-lifecycle.js.map +1 -0
- package/dist/runtime/types.d.ts +41 -17
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/types.js.map +1 -1
- package/dist/sandbox/cloudflare.d.ts +4 -0
- package/dist/sandbox/cloudflare.d.ts.map +1 -1
- package/dist/sandbox/cloudflare.js +59 -55
- package/dist/sandbox/cloudflare.js.map +1 -1
- package/dist/sandbox/container.d.ts +3 -0
- package/dist/sandbox/container.d.ts.map +1 -1
- package/dist/sandbox/container.js +39 -20
- package/dist/sandbox/container.js.map +1 -1
- package/dist/sandbox/host.d.ts +3 -0
- package/dist/sandbox/host.d.ts.map +1 -1
- package/dist/sandbox/host.js +42 -35
- package/dist/sandbox/host.js.map +1 -1
- package/dist/sandbox/identity.d.ts +13 -0
- package/dist/sandbox/identity.d.ts.map +1 -0
- package/dist/sandbox/identity.js +49 -0
- package/dist/sandbox/identity.js.map +1 -0
- package/dist/sandbox/index.d.ts +5 -15
- package/dist/sandbox/index.d.ts.map +1 -1
- package/dist/sandbox/index.js +5 -51
- package/dist/sandbox/index.js.map +1 -1
- package/dist/sandbox/layout.d.ts +7 -0
- package/dist/sandbox/layout.d.ts.map +1 -0
- package/dist/sandbox/layout.js +13 -0
- package/dist/sandbox/layout.js.map +1 -0
- package/dist/{provisioner.d.ts → sandbox/provisioner.d.ts} +41 -4
- package/dist/sandbox/provisioner.d.ts.map +1 -0
- package/dist/sandbox/provisioner.js +971 -0
- package/dist/sandbox/provisioner.js.map +1 -0
- package/dist/sandbox/registry.d.ts +12 -0
- package/dist/sandbox/registry.d.ts.map +1 -0
- package/dist/sandbox/registry.js +93 -0
- package/dist/sandbox/registry.js.map +1 -0
- package/dist/sandbox/types.d.ts +23 -25
- package/dist/sandbox/types.d.ts.map +1 -1
- package/dist/sandbox/types.js.map +1 -1
- package/dist/sandbox/utils.d.ts +21 -0
- package/dist/sandbox/utils.d.ts.map +1 -1
- package/dist/sandbox/utils.js +100 -8
- package/dist/sandbox/utils.js.map +1 -1
- package/dist/sessions/chat-history-sync.d.ts +17 -0
- package/dist/sessions/chat-history-sync.d.ts.map +1 -0
- package/dist/sessions/{agent-memory-file-manager.js → chat-history-sync.js} +224 -183
- package/dist/sessions/chat-history-sync.js.map +1 -0
- package/dist/sessions/history-line.d.ts +9 -0
- package/dist/sessions/history-line.d.ts.map +1 -0
- package/dist/sessions/history-line.js +25 -0
- package/dist/sessions/history-line.js.map +1 -0
- package/dist/sessions/migrate-common.d.ts +28 -0
- package/dist/sessions/migrate-common.d.ts.map +1 -0
- package/dist/sessions/migrate-common.js +80 -0
- package/dist/sessions/migrate-common.js.map +1 -0
- package/dist/sessions/migrate-pi-084.d.ts +7 -0
- package/dist/sessions/migrate-pi-084.d.ts.map +1 -0
- package/dist/sessions/migrate-pi-084.js +293 -0
- package/dist/sessions/migrate-pi-084.js.map +1 -0
- package/dist/sessions/migrate-v3.d.ts +7 -0
- package/dist/sessions/migrate-v3.d.ts.map +1 -0
- package/dist/sessions/migrate-v3.js +351 -0
- package/dist/sessions/migrate-v3.js.map +1 -0
- package/dist/sessions/session-key.d.ts +18 -0
- package/dist/sessions/session-key.d.ts.map +1 -0
- package/dist/sessions/session-key.js +88 -0
- package/dist/sessions/session-key.js.map +1 -0
- package/dist/sessions/session-store.d.ts +55 -0
- package/dist/sessions/session-store.d.ts.map +1 -0
- package/dist/sessions/session-store.js +635 -0
- package/dist/sessions/session-store.js.map +1 -0
- package/dist/sessions/store.d.ts +7 -61
- package/dist/sessions/store.d.ts.map +1 -1
- package/dist/sessions/store.js +126 -102
- package/dist/sessions/store.js.map +1 -1
- package/dist/sessions/types.d.ts +59 -8
- package/dist/sessions/types.d.ts.map +1 -1
- package/dist/sessions/types.js +2 -1
- package/dist/sessions/types.js.map +1 -1
- package/dist/settings/apply.d.ts +9 -0
- package/dist/settings/apply.d.ts.map +1 -0
- package/dist/settings/apply.js +31 -0
- package/dist/settings/apply.js.map +1 -0
- package/dist/settings/index.d.ts +76 -0
- package/dist/settings/index.d.ts.map +1 -0
- package/dist/settings/index.js +351 -0
- package/dist/settings/index.js.map +1 -0
- package/dist/settings/migrate.d.ts +16 -0
- package/dist/settings/migrate.d.ts.map +1 -0
- package/dist/settings/migrate.js +70 -0
- package/dist/settings/migrate.js.map +1 -0
- package/dist/types.d.ts +231 -173
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -3
- package/dist/types.js.map +1 -1
- package/dist/unknown-values.d.ts +3 -0
- package/dist/unknown-values.d.ts.map +1 -0
- package/dist/unknown-values.js +7 -0
- package/dist/unknown-values.js.map +1 -0
- package/dist/vault/index.d.ts +35 -11
- package/dist/vault/index.d.ts.map +1 -1
- package/dist/vault/index.js +326 -115
- package/dist/vault/index.js.map +1 -1
- package/dist/vault/types.d.ts +5 -16
- package/dist/vault/types.d.ts.map +1 -1
- package/dist/vault/types.js.map +1 -1
- package/package.json +82 -41
- package/dist/adapter.d.ts +0 -2
- package/dist/adapter.d.ts.map +0 -1
- package/dist/adapter.js +0 -2
- package/dist/adapter.js.map +0 -1
- package/dist/adapters/slack/tools/attach.d.ts +0 -12
- package/dist/adapters/slack/tools/attach.d.ts.map +0 -1
- package/dist/adapters/slack/tools/attach.js.map +0 -1
- package/dist/adapters/streaming.d.ts +0 -18
- package/dist/adapters/streaming.d.ts.map +0 -1
- package/dist/adapters/streaming.js +0 -44
- package/dist/adapters/streaming.js.map +0 -1
- package/dist/adapters/telegram/html.d.ts +0 -3
- package/dist/adapters/telegram/html.d.ts.map +0 -1
- package/dist/adapters/telegram/html.js +0 -98
- package/dist/adapters/telegram/html.js.map +0 -1
- package/dist/agent-events.d.ts +0 -5
- package/dist/agent-events.d.ts.map +0 -1
- package/dist/agent-events.js +0 -26
- package/dist/agent-events.js.map +0 -1
- package/dist/agent.d.ts +0 -39
- package/dist/agent.d.ts.map +0 -1
- package/dist/agent.js +0 -1291
- package/dist/agent.js.map +0 -1
- package/dist/cli/ext-git.d.ts +0 -22
- package/dist/cli/ext-git.d.ts.map +0 -1
- package/dist/cli/ext-git.js +0 -76
- package/dist/cli/ext-git.js.map +0 -1
- package/dist/cli/ext.d.ts +0 -2
- package/dist/cli/ext.d.ts.map +0 -1
- package/dist/cli/ext.js +0 -217
- package/dist/cli/ext.js.map +0 -1
- package/dist/commands/admin.d.ts.map +0 -1
- package/dist/commands/admin.js.map +0 -1
- package/dist/commands/auto-reply.d.ts.map +0 -1
- package/dist/commands/auto-reply.js +0 -76
- package/dist/commands/auto-reply.js.map +0 -1
- package/dist/commands/extensions.d.ts +0 -14
- package/dist/commands/extensions.d.ts.map +0 -1
- package/dist/commands/extensions.js +0 -55
- package/dist/commands/extensions.js.map +0 -1
- package/dist/commands/login.d.ts +0 -5
- package/dist/commands/login.d.ts.map +0 -1
- package/dist/commands/login.js +0 -115
- package/dist/commands/login.js.map +0 -1
- package/dist/commands/model.d.ts +0 -10
- package/dist/commands/model.d.ts.map +0 -1
- package/dist/commands/model.js +0 -102
- package/dist/commands/model.js.map +0 -1
- package/dist/commands/new.d.ts.map +0 -1
- package/dist/commands/new.js +0 -25
- package/dist/commands/new.js.map +0 -1
- package/dist/commands/parse.d.ts +0 -7
- package/dist/commands/parse.d.ts.map +0 -1
- package/dist/commands/parse.js +0 -14
- package/dist/commands/parse.js.map +0 -1
- package/dist/commands/registry.d.ts +0 -5
- package/dist/commands/registry.d.ts.map +0 -1
- package/dist/commands/registry.js +0 -31
- package/dist/commands/registry.js.map +0 -1
- package/dist/commands/sandbox.d.ts.map +0 -1
- package/dist/commands/sandbox.js +0 -78
- package/dist/commands/sandbox.js.map +0 -1
- package/dist/commands/session-view.d.ts.map +0 -1
- package/dist/commands/session-view.js.map +0 -1
- package/dist/commands/types.d.ts +0 -66
- package/dist/commands/types.d.ts.map +0 -1
- package/dist/commands/types.js.map +0 -1
- package/dist/commands/utils.d.ts +0 -11
- package/dist/commands/utils.d.ts.map +0 -1
- package/dist/commands/utils.js.map +0 -1
- package/dist/config.d.ts +0 -78
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -450
- package/dist/config.js.map +0 -1
- package/dist/download.d.ts.map +0 -1
- package/dist/download.js +0 -89
- package/dist/download.js.map +0 -1
- package/dist/events.d.ts +0 -43
- package/dist/events.d.ts.map +0 -1
- package/dist/events.js +0 -456
- package/dist/events.js.map +0 -1
- package/dist/execution-resolver.d.ts +0 -21
- package/dist/execution-resolver.d.ts.map +0 -1
- package/dist/execution-resolver.js +0 -170
- package/dist/execution-resolver.js.map +0 -1
- package/dist/harness/auth.d.ts +0 -16
- package/dist/harness/auth.d.ts.map +0 -1
- package/dist/harness/auth.js +0 -86
- package/dist/harness/auth.js.map +0 -1
- package/dist/harness/extensions/loader.d.ts +0 -86
- package/dist/harness/extensions/loader.d.ts.map +0 -1
- package/dist/harness/extensions/loader.js +0 -525
- package/dist/harness/extensions/loader.js.map +0 -1
- package/dist/harness/extensions/registry.d.ts +0 -23
- package/dist/harness/extensions/registry.d.ts.map +0 -1
- package/dist/harness/extensions/registry.js +0 -45
- package/dist/harness/extensions/registry.js.map +0 -1
- package/dist/harness/extensions/types.d.ts +0 -248
- package/dist/harness/extensions/types.d.ts.map +0 -1
- package/dist/harness/extensions/types.js.map +0 -1
- package/dist/harness/session-store.d.ts +0 -77
- package/dist/harness/session-store.d.ts.map +0 -1
- package/dist/harness/session-store.js +0 -248
- package/dist/harness/session-store.js.map +0 -1
- package/dist/harness/settings.d.ts +0 -47
- package/dist/harness/settings.d.ts.map +0 -1
- package/dist/harness/settings.js +0 -29
- package/dist/harness/settings.js.map +0 -1
- package/dist/model-registry.d.ts +0 -4
- package/dist/model-registry.d.ts.map +0 -1
- package/dist/model-registry.js +0 -7
- package/dist/model-registry.js.map +0 -1
- package/dist/platform-messages.d.ts.map +0 -1
- package/dist/platform-messages.js.map +0 -1
- package/dist/portal-shell.d.ts +0 -4
- package/dist/portal-shell.d.ts.map +0 -1
- package/dist/portal-shell.js.map +0 -1
- package/dist/provisioner.d.ts.map +0 -1
- package/dist/provisioner.js +0 -517
- package/dist/provisioner.js.map +0 -1
- package/dist/runtime/agent-run-controller.d.ts +0 -31
- package/dist/runtime/agent-run-controller.d.ts.map +0 -1
- package/dist/runtime/agent-run-controller.js +0 -195
- package/dist/runtime/agent-run-controller.js.map +0 -1
- package/dist/sandbox/errors.d.ts +0 -6
- package/dist/sandbox/errors.d.ts.map +0 -1
- package/dist/sandbox/errors.js +0 -11
- package/dist/sandbox/errors.js.map +0 -1
- package/dist/sandbox/firecracker.d.ts +0 -15
- package/dist/sandbox/firecracker.d.ts.map +0 -1
- package/dist/sandbox/firecracker.js +0 -212
- package/dist/sandbox/firecracker.js.map +0 -1
- package/dist/sandbox/image.d.ts +0 -3
- package/dist/sandbox/image.d.ts.map +0 -1
- package/dist/sandbox/image.js +0 -27
- package/dist/sandbox/image.js.map +0 -1
- package/dist/sandbox/path-context.d.ts +0 -3
- package/dist/sandbox/path-context.d.ts.map +0 -1
- package/dist/sandbox/path-context.js +0 -20
- package/dist/sandbox/path-context.js.map +0 -1
- package/dist/sessions/agent-memory-file-manager.d.ts +0 -19
- package/dist/sessions/agent-memory-file-manager.d.ts.map +0 -1
- package/dist/sessions/agent-memory-file-manager.js.map +0 -1
- package/dist/sessions/metadata.d.ts +0 -3
- package/dist/sessions/metadata.d.ts.map +0 -1
- package/dist/sessions/metadata.js +0 -11
- package/dist/sessions/metadata.js.map +0 -1
- package/dist/sessions/policy.d.ts +0 -6
- package/dist/sessions/policy.d.ts.map +0 -1
- package/dist/sessions/policy.js +0 -24
- package/dist/sessions/policy.js.map +0 -1
- package/dist/store.d.ts +0 -46
- package/dist/store.d.ts.map +0 -1
- package/dist/store.js +0 -177
- package/dist/store.js.map +0 -1
- package/dist/tools/bash.d.ts +0 -10
- package/dist/tools/bash.d.ts.map +0 -1
- package/dist/tools/bash.js +0 -80
- package/dist/tools/bash.js.map +0 -1
- package/dist/tools/edit.d.ts +0 -11
- package/dist/tools/edit.d.ts.map +0 -1
- package/dist/tools/edit.js +0 -131
- package/dist/tools/edit.js.map +0 -1
- package/dist/tools/event.d.ts +0 -56
- package/dist/tools/event.d.ts.map +0 -1
- package/dist/tools/event.js +0 -252
- package/dist/tools/event.js.map +0 -1
- package/dist/tools/index.d.ts +0 -24
- package/dist/tools/index.d.ts.map +0 -1
- package/dist/tools/index.js +0 -31
- package/dist/tools/index.js.map +0 -1
- package/dist/tools/react.d.ts +0 -15
- package/dist/tools/react.d.ts.map +0 -1
- package/dist/tools/react.js +0 -40
- package/dist/tools/react.js.map +0 -1
- package/dist/tools/read.d.ts +0 -11
- package/dist/tools/read.d.ts.map +0 -1
- package/dist/tools/read.js +0 -134
- package/dist/tools/read.js.map +0 -1
- package/dist/tools/sandbox.d.ts +0 -22
- package/dist/tools/sandbox.d.ts.map +0 -1
- package/dist/tools/sandbox.js.map +0 -1
- package/dist/tools/truncate.d.ts +0 -33
- package/dist/tools/truncate.d.ts.map +0 -1
- package/dist/tools/truncate.js +0 -184
- package/dist/tools/truncate.js.map +0 -1
- package/dist/tools/types.d.ts +0 -54
- package/dist/tools/types.d.ts.map +0 -1
- package/dist/tools/types.js.map +0 -1
- package/dist/tools/write.d.ts +0 -10
- package/dist/tools/write.d.ts.map +0 -1
- package/dist/tools/write.js +0 -29
- package/dist/tools/write.js.map +0 -1
- package/dist/trigger.d.ts +0 -22
- package/dist/trigger.d.ts.map +0 -1
- package/dist/trigger.js +0 -100
- package/dist/trigger.js.map +0 -1
- package/dist/utils/date.d.ts +0 -10
- package/dist/utils/date.d.ts.map +0 -1
- package/dist/utils/date.js +0 -23
- package/dist/utils/date.js.map +0 -1
- package/dist/utils/env.d.ts +0 -3
- package/dist/utils/env.d.ts.map +0 -1
- package/dist/utils/env.js +0 -12
- package/dist/utils/env.js.map +0 -1
- package/dist/utils/file-guards.d.ts +0 -9
- package/dist/utils/file-guards.d.ts.map +0 -1
- package/dist/utils/file-guards.js +0 -59
- package/dist/utils/file-guards.js.map +0 -1
- package/dist/utils/fs-atomic.d.ts +0 -10
- package/dist/utils/fs-atomic.d.ts.map +0 -1
- package/dist/utils/fs-atomic.js +0 -45
- package/dist/utils/fs-atomic.js.map +0 -1
- package/dist/utils/html.d.ts +0 -2
- package/dist/utils/html.d.ts.map +0 -1
- package/dist/utils/html.js +0 -4
- package/dist/utils/html.js.map +0 -1
- package/dist/utils/http-body.d.ts +0 -10
- package/dist/utils/http-body.d.ts.map +0 -1
- package/dist/utils/http-body.js +0 -34
- package/dist/utils/http-body.js.map +0 -1
- package/dist/vault/routing.d.ts +0 -3
- package/dist/vault/routing.d.ts.map +0 -1
- package/dist/vault/routing.js +0 -13
- package/dist/vault/routing.js.map +0 -1
- package/dist/web/admin/portal.d.ts +0 -5
- package/dist/web/admin/portal.d.ts.map +0 -1
- package/dist/web/admin/portal.js +0 -2572
- package/dist/web/admin/portal.js.map +0 -1
- package/dist/web/admin/provider-models.d.ts.map +0 -1
- package/dist/web/admin/provider-models.js.map +0 -1
- package/dist/web/admin/store.d.ts +0 -13
- package/dist/web/admin/store.d.ts.map +0 -1
- package/dist/web/admin/store.js +0 -14
- package/dist/web/admin/store.js.map +0 -1
- package/dist/web/admin/types.d.ts +0 -30
- package/dist/web/admin/types.d.ts.map +0 -1
- package/dist/web/admin/types.js.map +0 -1
- package/dist/web/agent-events/portal.d.ts +0 -3
- package/dist/web/agent-events/portal.d.ts.map +0 -1
- package/dist/web/agent-events/portal.js +0 -18
- package/dist/web/agent-events/portal.js.map +0 -1
- package/dist/web/login/oauth.d.ts +0 -6
- package/dist/web/login/oauth.d.ts.map +0 -1
- package/dist/web/login/oauth.js.map +0 -1
- package/dist/web/login/portal.d.ts +0 -17
- package/dist/web/login/portal.d.ts.map +0 -1
- package/dist/web/login/portal.js.map +0 -1
- package/dist/web/login/store.d.ts +0 -8
- package/dist/web/login/store.d.ts.map +0 -1
- package/dist/web/login/store.js +0 -15
- package/dist/web/login/store.js.map +0 -1
- package/dist/web/login/types.d.ts.map +0 -1
- package/dist/web/login/types.js.map +0 -1
- package/dist/web/request.d.ts +0 -3
- package/dist/web/request.d.ts.map +0 -1
- package/dist/web/request.js +0 -13
- package/dist/web/request.js.map +0 -1
- package/dist/web/server.d.ts +0 -28
- package/dist/web/server.d.ts.map +0 -1
- package/dist/web/server.js.map +0 -1
- package/dist/web/session-view/command.d.ts +0 -4
- package/dist/web/session-view/command.d.ts.map +0 -1
- package/dist/web/session-view/command.js +0 -7
- package/dist/web/session-view/command.js.map +0 -1
- package/dist/web/session-view/portal.d.ts +0 -13
- package/dist/web/session-view/portal.d.ts.map +0 -1
- package/dist/web/session-view/portal.js.map +0 -1
- package/dist/web/session-view/service.d.ts +0 -6
- package/dist/web/session-view/service.d.ts.map +0 -1
- package/dist/web/session-view/service.js +0 -498
- package/dist/web/session-view/service.js.map +0 -1
- package/dist/web/session-view/store.d.ts +0 -8
- package/dist/web/session-view/store.d.ts.map +0 -1
- package/dist/web/session-view/store.js +0 -15
- package/dist/web/session-view/store.js.map +0 -1
- package/dist/web/session-view/types.d.ts.map +0 -1
- package/dist/web/session-view/types.js.map +0 -1
- package/dist/web/token-store.d.ts.map +0 -1
- package/dist/web/token-store.js.map +0 -1
- package/dist/web/types.d.ts.map +0 -1
- package/dist/web/types.js.map +0 -1
- /package/dist/{commands → adapters/commands}/admin.d.ts +0 -0
- /package/dist/{commands → adapters/commands}/new.d.ts +0 -0
- /package/dist/{commands → adapters/commands}/session-view.d.ts +0 -0
- /package/dist/{commands → adapters/commands}/types.js +0 -0
- /package/dist/{harness/extensions → adapters/web/admin}/types.js +0 -0
- /package/dist/{tools → adapters/web/login}/types.js +0 -0
- /package/dist/{web/admin → adapters/web/session-view}/types.js +0 -0
- /package/dist/{web → adapters/web}/types.d.ts +0 -0
- /package/dist/{web/login → adapters/web}/types.js +0 -0
- /package/dist/{download.d.ts → cli/download.d.ts} +0 -0
- /package/dist/{web/session-view → cli}/types.js +0 -0
- /package/dist/{web → harness/tools}/types.js +0 -0
|
@@ -1,12 +1,30 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { dirname, join, resolve } from "node:path";
|
|
2
|
+
import { existsSync, readdirSync } from "node:fs";
|
|
3
|
+
import { SessionStore } from "../../../sessions/session-store.js";
|
|
4
|
+
import { getThreadSessionFile, resolveChannelSessionFile, tryResolveThreadSession, } from "../../../sessions/store.js";
|
|
5
|
+
import { isPlatformHistorySession } from "../../../sessions/store.js";
|
|
6
|
+
import { basename } from "node:path";
|
|
7
|
+
import { InMemoryTokenStore } from "../token-store.js";
|
|
2
8
|
import MarkdownIt from "markdown-it";
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
|
|
9
|
+
import { createConversationEvent, createConversationMessage, createOfficeAddress, } from "../../../office/index.js";
|
|
10
|
+
import * as log from "../../../log.js";
|
|
11
|
+
import { escapeHtml, jsonResponse as json, readJsonBody, renderPortalShell, } from "../portal-shell.js";
|
|
12
|
+
import { reportUserFacingError } from "../../../observability/index.js";
|
|
13
|
+
import { inferConversationKind } from "../../../sessions/session-key.js";
|
|
14
|
+
import { isThreadSessionKey, threadSuffixOf } from "../../../sessions/session-key.js";
|
|
15
|
+
const SESSION_VIEW_TOKEN_TTL_MS = 24 * 60 * 60 * 1000;
|
|
16
|
+
export class InMemorySessionViewTokenStore extends InMemoryTokenStore {
|
|
17
|
+
create(options) {
|
|
18
|
+
return this.createRecord(SESSION_VIEW_TOKEN_TTL_MS, {
|
|
19
|
+
platform: options.platform,
|
|
20
|
+
platformUserId: options.platformUserId,
|
|
21
|
+
platformUserName: options.platformUserName || undefined,
|
|
22
|
+
conversationId: options.conversationId,
|
|
23
|
+
sessionKey: options.sessionKey,
|
|
24
|
+
sessionFile: options.sessionFile,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
10
28
|
const markdown = new MarkdownIt({
|
|
11
29
|
html: false,
|
|
12
30
|
linkify: true,
|
|
@@ -16,8 +34,8 @@ const defaultLinkOpen = markdown.renderer.rules.link_open;
|
|
|
16
34
|
markdown.renderer.rules.link_open = (...args) => {
|
|
17
35
|
const [tokens, idx, options, env, self] = args;
|
|
18
36
|
const token = tokens[idx];
|
|
19
|
-
token
|
|
20
|
-
token
|
|
37
|
+
token?.attrSet("target", "_blank");
|
|
38
|
+
token?.attrSet("rel", "noreferrer noopener");
|
|
21
39
|
return defaultLinkOpen
|
|
22
40
|
? defaultLinkOpen(tokens, idx, options, env, self)
|
|
23
41
|
: self.renderToken(tokens, idx, options);
|
|
@@ -48,6 +66,7 @@ class SessionViewStreamHub {
|
|
|
48
66
|
}
|
|
49
67
|
}
|
|
50
68
|
const sessionViewStreamHub = new SessionViewStreamHub();
|
|
69
|
+
import { errorMessage } from "../../../unknown-values.js";
|
|
51
70
|
export async function handleSessionViewRequest(req, res, url, sessionViewTokenStore, interactive) {
|
|
52
71
|
if (req.method === "POST" && url.pathname === "/session/message") {
|
|
53
72
|
await handleSessionMessageRequest(req, res, sessionViewTokenStore, interactive);
|
|
@@ -60,75 +79,88 @@ export async function handleSessionViewRequest(req, res, url, sessionViewTokenSt
|
|
|
60
79
|
if (req.method !== "GET" || url.pathname !== "/session") {
|
|
61
80
|
return false;
|
|
62
81
|
}
|
|
63
|
-
const
|
|
64
|
-
if (!
|
|
65
|
-
res.writeHead(
|
|
66
|
-
res.end(renderStatusPage("Session unavailable",
|
|
82
|
+
const target = await resolveSessionRequestTarget(sessionViewTokenStore, url.searchParams.get("token"), url.searchParams.get("session"));
|
|
83
|
+
if (!target.ok) {
|
|
84
|
+
res.writeHead(target.status, { "Content-Type": "text/html; charset=utf-8" });
|
|
85
|
+
res.end(renderStatusPage("Session unavailable", target.message));
|
|
67
86
|
return true;
|
|
68
87
|
}
|
|
69
|
-
const entry =
|
|
70
|
-
if (!entry) {
|
|
71
|
-
res.writeHead(400, { "Content-Type": "text/html; charset=utf-8" });
|
|
72
|
-
res.end(renderStatusPage("Session unavailable", "This session link is invalid or has expired."));
|
|
73
|
-
return true;
|
|
74
|
-
}
|
|
75
|
-
const requestedSession = url.searchParams.get("session");
|
|
76
|
-
let targetSessionFile;
|
|
88
|
+
const { activeSessionKey, entry, targetSessionFile } = target;
|
|
77
89
|
try {
|
|
78
|
-
|
|
90
|
+
const model = await loadSessionViewModel(targetSessionFile);
|
|
91
|
+
const displayedSessionKey = activeSessionKey;
|
|
92
|
+
const isRunning = interactive?.handler.isRunning(createOfficeAddress(entry.platform, entry.conversationId), displayedSessionKey) ?? false;
|
|
93
|
+
res.writeHead(200, {
|
|
94
|
+
"Content-Type": "text/html; charset=utf-8",
|
|
95
|
+
"Cache-Control": "no-store",
|
|
96
|
+
});
|
|
97
|
+
res.end(renderSessionPage({
|
|
98
|
+
model,
|
|
99
|
+
token: entry.token,
|
|
100
|
+
expiresAt: entry.expiresAt,
|
|
101
|
+
isRunning,
|
|
102
|
+
displayedSessionKey,
|
|
103
|
+
conversationId: entry.conversationId,
|
|
104
|
+
}));
|
|
79
105
|
}
|
|
80
106
|
catch (error) {
|
|
81
|
-
log.logWarning(`[${entry.conversationId}]
|
|
107
|
+
log.logWarning(`[${entry.conversationId}] Failed to render session ${entry.sessionFile}`, errorMessage(error));
|
|
82
108
|
reportUserFacingError(error, {
|
|
83
109
|
domain: "session_view",
|
|
84
110
|
surface: "session_view",
|
|
85
|
-
operation: "
|
|
111
|
+
operation: "render_session",
|
|
86
112
|
severity: "error",
|
|
87
113
|
platform: entry.platform,
|
|
88
114
|
context: {
|
|
89
115
|
conversationId: entry.conversationId,
|
|
90
116
|
sessionKey: entry.sessionKey,
|
|
91
|
-
sessionFile: basename(
|
|
92
|
-
requestedSession,
|
|
117
|
+
sessionFile: basename(targetSessionFile),
|
|
93
118
|
},
|
|
94
119
|
});
|
|
95
120
|
res.writeHead(500, { "Content-Type": "text/html; charset=utf-8" });
|
|
96
|
-
res.end(renderStatusPage("Session unavailable", "The
|
|
97
|
-
return true;
|
|
121
|
+
res.end(renderStatusPage("Session unavailable", "The session could not be loaded right now."));
|
|
98
122
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
async function resolveSessionRequestTarget(sessionViewTokenStore, rawToken, requestedSession) {
|
|
126
|
+
if (!sessionViewTokenStore) {
|
|
127
|
+
return { ok: false, status: 503, message: "Session view is not configured." };
|
|
128
|
+
}
|
|
129
|
+
const token = rawToken?.trim() ?? "";
|
|
130
|
+
const entry = token ? sessionViewTokenStore.peek(token) : undefined;
|
|
131
|
+
if (!entry) {
|
|
132
|
+
return { ok: false, status: 400, message: "This session link is invalid or has expired." };
|
|
103
133
|
}
|
|
134
|
+
let targetSessionFile;
|
|
104
135
|
try {
|
|
105
|
-
|
|
106
|
-
const displayedSessionKey = resolveDisplayedSessionKey(entry, targetSessionFile);
|
|
107
|
-
const isRunning = interactive?.handler.isRunning(displayedSessionKey) ?? false;
|
|
108
|
-
res.writeHead(200, {
|
|
109
|
-
"Content-Type": "text/html; charset=utf-8",
|
|
110
|
-
"Cache-Control": "no-store",
|
|
111
|
-
});
|
|
112
|
-
res.end(renderSessionPage(model, entry.token, entry.expiresAt, isRunning, displayedSessionKey, entry.conversationId));
|
|
136
|
+
targetSessionFile = await resolveRequestedSessionFile(entry.sessionFile, requestedSession);
|
|
113
137
|
}
|
|
114
138
|
catch (error) {
|
|
115
|
-
log.logWarning(`[${entry.conversationId}]
|
|
139
|
+
log.logWarning(`[${entry.conversationId}] Corrupted session file referenced for ${entry.sessionFile}`, errorMessage(error));
|
|
116
140
|
reportUserFacingError(error, {
|
|
117
141
|
domain: "session_view",
|
|
118
142
|
surface: "session_view",
|
|
119
|
-
operation: "
|
|
143
|
+
operation: "resolve_requested_session",
|
|
120
144
|
severity: "error",
|
|
121
145
|
platform: entry.platform,
|
|
122
146
|
context: {
|
|
123
147
|
conversationId: entry.conversationId,
|
|
124
148
|
sessionKey: entry.sessionKey,
|
|
125
|
-
sessionFile: basename(
|
|
149
|
+
sessionFile: basename(entry.sessionFile),
|
|
150
|
+
requestedSession,
|
|
126
151
|
},
|
|
127
152
|
});
|
|
128
|
-
|
|
129
|
-
res.end(renderStatusPage("Session unavailable", "The session could not be loaded right now."));
|
|
153
|
+
return { ok: false, status: 500, message: "The selected session file is corrupted." };
|
|
130
154
|
}
|
|
131
|
-
|
|
155
|
+
if (!targetSessionFile) {
|
|
156
|
+
return { ok: false, status: 400, message: "The selected session is invalid." };
|
|
157
|
+
}
|
|
158
|
+
return {
|
|
159
|
+
ok: true,
|
|
160
|
+
entry,
|
|
161
|
+
targetSessionFile,
|
|
162
|
+
activeSessionKey: resolveDisplayedSessionKey(entry, targetSessionFile),
|
|
163
|
+
};
|
|
132
164
|
}
|
|
133
165
|
function resolveDisplayedSessionKey(entry, sessionFile) {
|
|
134
166
|
if (entry.platform === "slack") {
|
|
@@ -148,7 +180,8 @@ function renderTimelineItems(items, token) {
|
|
|
148
180
|
? items.map((item) => renderItem(item, token)).join("\n")
|
|
149
181
|
: `<div class="system-event"><span class="event-dot"></span><span class="event-text">No messages yet — send one to the bot, then refresh.</span></div>`;
|
|
150
182
|
}
|
|
151
|
-
function renderSessionPage(
|
|
183
|
+
function renderSessionPage(options) {
|
|
184
|
+
const { model, token, expiresAt, isRunning, displayedSessionKey, conversationId } = options;
|
|
152
185
|
const items = renderTimelineItems(model.items, token);
|
|
153
186
|
const relatedSections = model.parent
|
|
154
187
|
? `<section class="related-card stack">
|
|
@@ -228,30 +261,28 @@ function renderThreadLinks(relations, token) {
|
|
|
228
261
|
.join("")}</div>`;
|
|
229
262
|
}
|
|
230
263
|
export function parseUserBody(raw) {
|
|
231
|
-
// [timestamp] [username] [in-thread:ts]: content
|
|
232
264
|
let m = raw.match(/^\[([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}[+-][0-9]{2}:[0-9]{2})\]\s*\[([^\]]+)\](?:\s*\[in-thread:([^\]]+)\])?:\s*([\s\S]*)$/);
|
|
233
265
|
if (m) {
|
|
234
266
|
const header = [`[${m[1]}]`, `[${m[2]}]`, m[3] ? `[in-thread:${m[3]}]` : ""]
|
|
235
267
|
.filter(Boolean)
|
|
236
268
|
.join(" ");
|
|
237
269
|
return {
|
|
238
|
-
timestamp: m[1],
|
|
239
|
-
username: m[2],
|
|
270
|
+
timestamp: m[1] ?? null,
|
|
271
|
+
username: m[2] ?? null,
|
|
240
272
|
threadTs: m[3] ?? null,
|
|
241
273
|
header,
|
|
242
|
-
content: m[4],
|
|
274
|
+
content: m[4] ?? "",
|
|
243
275
|
};
|
|
244
276
|
}
|
|
245
|
-
// [username] [in-thread:ts]: content
|
|
246
277
|
m = raw.match(/^\[([^\]]+)\](?:\s*\[in-thread:([^\]]+)\])?:\s*([\s\S]*)$/);
|
|
247
278
|
if (m) {
|
|
248
279
|
const header = [`[${m[1]}]`, m[2] ? `[in-thread:${m[2]}]` : ""].filter(Boolean).join(" ");
|
|
249
280
|
return {
|
|
250
281
|
timestamp: null,
|
|
251
|
-
username: m[1],
|
|
282
|
+
username: m[1] ?? null,
|
|
252
283
|
threadTs: m[2] ?? null,
|
|
253
284
|
header,
|
|
254
|
-
content: m[3],
|
|
285
|
+
content: m[3] ?? "",
|
|
255
286
|
};
|
|
256
287
|
}
|
|
257
288
|
return { timestamp: null, username: null, threadTs: null, header: null, content: raw };
|
|
@@ -307,7 +338,6 @@ function renderItem(item, token) {
|
|
|
307
338
|
<div class="msg-avatar user-avatar" title="${username ? esc(username) : "User"}">${initial}</div>
|
|
308
339
|
</div>`;
|
|
309
340
|
}
|
|
310
|
-
// assistant
|
|
311
341
|
const body = item.body ? renderMarkdownBlock(item.body, "assistant") : "";
|
|
312
342
|
const threads = renderThreadLinks(item.threads, token ?? "");
|
|
313
343
|
return `<div class="msg-row msg-assistant copy-host">
|
|
@@ -363,54 +393,28 @@ function renderLiveSystemEvent(text, tone = "default") {
|
|
|
363
393
|
return `<div class="system-event${cls}" data-live-item><span class="event-dot"></span><span class="event-text">${esc(text)}</span></div>`;
|
|
364
394
|
}
|
|
365
395
|
async function handleSessionStreamRequest(req, res, url, sessionViewTokenStore, interactive) {
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
res.
|
|
369
|
-
res.end("Session stream unavailable");
|
|
396
|
+
if (!interactive) {
|
|
397
|
+
res.writeHead(503, { "Content-Type": "text/plain; charset=utf-8" });
|
|
398
|
+
res.end("Session stream is not configured.");
|
|
370
399
|
return;
|
|
371
400
|
}
|
|
372
|
-
const
|
|
373
|
-
if (!
|
|
374
|
-
res.writeHead(
|
|
375
|
-
res.end(
|
|
401
|
+
const target = await resolveSessionRequestTarget(sessionViewTokenStore, url.searchParams.get("token"), url.searchParams.get("session"));
|
|
402
|
+
if (!target.ok) {
|
|
403
|
+
res.writeHead(target.status, { "Content-Type": "text/plain; charset=utf-8" });
|
|
404
|
+
res.end(target.message);
|
|
376
405
|
return;
|
|
377
406
|
}
|
|
378
|
-
const
|
|
379
|
-
let targetSessionFile;
|
|
380
|
-
try {
|
|
381
|
-
targetSessionFile = resolveRequestedSessionFile(entry.sessionFile, requestedSession);
|
|
382
|
-
}
|
|
383
|
-
catch (error) {
|
|
384
|
-
reportUserFacingError(error, {
|
|
385
|
-
domain: "session_view",
|
|
386
|
-
surface: "session_view",
|
|
387
|
-
operation: "session_stream",
|
|
388
|
-
severity: "error",
|
|
389
|
-
platform: entry.platform,
|
|
390
|
-
context: {
|
|
391
|
-
conversationId: entry.conversationId,
|
|
392
|
-
sessionKey: entry.sessionKey,
|
|
393
|
-
sessionFile: basename(entry.sessionFile),
|
|
394
|
-
requestedSession,
|
|
395
|
-
},
|
|
396
|
-
});
|
|
397
|
-
res.writeHead(500, { "Content-Type": "text/plain; charset=utf-8" });
|
|
398
|
-
res.end("Session stream unavailable");
|
|
399
|
-
return;
|
|
400
|
-
}
|
|
401
|
-
if (!targetSessionFile) {
|
|
402
|
-
res.writeHead(400, { "Content-Type": "text/plain; charset=utf-8" });
|
|
403
|
-
res.end("Invalid session file");
|
|
404
|
-
return;
|
|
405
|
-
}
|
|
406
|
-
const activeSessionKey = resolveDisplayedSessionKey(entry, targetSessionFile);
|
|
407
|
+
const { activeSessionKey, entry } = target;
|
|
407
408
|
const streamKey = sessionStreamKey({ ...entry, sessionKey: activeSessionKey });
|
|
408
409
|
res.writeHead(200, {
|
|
409
410
|
"Content-Type": "text/event-stream; charset=utf-8",
|
|
410
411
|
"Cache-Control": "no-store",
|
|
411
412
|
Connection: "keep-alive",
|
|
412
413
|
});
|
|
413
|
-
res.write(`data: ${JSON.stringify({
|
|
414
|
+
res.write(`data: ${JSON.stringify({
|
|
415
|
+
type: "status",
|
|
416
|
+
running: interactive.handler.isRunning(createOfficeAddress(entry.platform, entry.conversationId), activeSessionKey),
|
|
417
|
+
})}\n\n`);
|
|
414
418
|
const unsubscribe = sessionViewStreamHub.subscribe(streamKey, (event) => {
|
|
415
419
|
res.write(`data: ${JSON.stringify(event)}\n\n`);
|
|
416
420
|
});
|
|
@@ -423,64 +427,43 @@ async function handleSessionStreamRequest(req, res, url, sessionViewTokenStore,
|
|
|
423
427
|
});
|
|
424
428
|
}
|
|
425
429
|
async function handleSessionMessageRequest(req, res, sessionViewTokenStore, interactive) {
|
|
426
|
-
if (!
|
|
430
|
+
if (!interactive) {
|
|
427
431
|
json(res, 503, { ok: false, error: "Session chat is not configured." });
|
|
428
432
|
return;
|
|
429
433
|
}
|
|
430
|
-
const
|
|
431
|
-
if (
|
|
432
|
-
return;
|
|
433
|
-
let body;
|
|
434
|
-
try {
|
|
435
|
-
body = JSON.parse(rawBody);
|
|
436
|
-
}
|
|
437
|
-
catch {
|
|
438
|
-
json(res, 400, { ok: false, error: "Invalid request body." });
|
|
434
|
+
const body = await readJsonBody(req, res, 1024 * 1024);
|
|
435
|
+
if (!body)
|
|
439
436
|
return;
|
|
440
|
-
|
|
441
|
-
const
|
|
442
|
-
const
|
|
443
|
-
const
|
|
444
|
-
const requestedSessionKey = body.sessionKey?.trim() || "";
|
|
437
|
+
const token = typeof body.token === "string" ? body.token.trim() : "";
|
|
438
|
+
const text = typeof body.text === "string" ? body.text.trim() : "";
|
|
439
|
+
const requestedSession = typeof body.session === "string" ? body.session.trim() || null : null;
|
|
440
|
+
const requestedSessionKey = typeof body.sessionKey === "string" ? body.sessionKey.trim() : "";
|
|
445
441
|
if (!token || !text) {
|
|
446
442
|
json(res, 400, { ok: false, error: "Missing token or text." });
|
|
447
443
|
return;
|
|
448
444
|
}
|
|
449
|
-
const
|
|
450
|
-
if (!
|
|
451
|
-
json(res,
|
|
445
|
+
const target = await resolveSessionRequestTarget(sessionViewTokenStore, token, requestedSession);
|
|
446
|
+
if (!target.ok) {
|
|
447
|
+
json(res, target.status, { ok: false, error: target.message });
|
|
452
448
|
return;
|
|
453
449
|
}
|
|
454
|
-
|
|
455
|
-
try {
|
|
456
|
-
targetSessionFile = resolveRequestedSessionFile(entry.sessionFile, requestedSession);
|
|
457
|
-
}
|
|
458
|
-
catch (error) {
|
|
459
|
-
reportUserFacingError(error, {
|
|
460
|
-
domain: "session_view",
|
|
461
|
-
surface: "session_view",
|
|
462
|
-
operation: "session_message",
|
|
463
|
-
severity: "error",
|
|
464
|
-
platform: entry.platform,
|
|
465
|
-
context: {
|
|
466
|
-
conversationId: entry.conversationId,
|
|
467
|
-
sessionKey: entry.sessionKey,
|
|
468
|
-
sessionFile: basename(entry.sessionFile),
|
|
469
|
-
requestedSession,
|
|
470
|
-
},
|
|
471
|
-
});
|
|
472
|
-
json(res, 500, { ok: false, error: "Session file could not be loaded." });
|
|
473
|
-
return;
|
|
474
|
-
}
|
|
475
|
-
if (!targetSessionFile) {
|
|
476
|
-
json(res, 400, { ok: false, error: "Invalid session file." });
|
|
477
|
-
return;
|
|
478
|
-
}
|
|
479
|
-
const activeSessionKey = resolveDisplayedSessionKey(entry, targetSessionFile);
|
|
450
|
+
const { activeSessionKey, entry, targetSessionFile } = target;
|
|
480
451
|
if (requestedSessionKey && requestedSessionKey !== activeSessionKey) {
|
|
481
452
|
json(res, 400, { ok: false, error: "Session target mismatch." });
|
|
482
453
|
return;
|
|
483
454
|
}
|
|
455
|
+
await dispatchSessionViewMessage({
|
|
456
|
+
res,
|
|
457
|
+
interactive,
|
|
458
|
+
token,
|
|
459
|
+
text,
|
|
460
|
+
activeSessionKey,
|
|
461
|
+
entry,
|
|
462
|
+
targetSessionFile,
|
|
463
|
+
});
|
|
464
|
+
}
|
|
465
|
+
async function dispatchSessionViewMessage(input) {
|
|
466
|
+
const { res, interactive, token, text, activeSessionKey, entry, targetSessionFile } = input;
|
|
484
467
|
const bot = interactive.botsByPlatform[entry.platform];
|
|
485
468
|
if (!bot) {
|
|
486
469
|
json(res, 503, { ok: false, error: `No bot configured for ${entry.platform}.` });
|
|
@@ -497,7 +480,8 @@ async function handleSessionMessageRequest(req, res, sessionViewTokenStore, inte
|
|
|
497
480
|
const responder = createSessionViewResponseContext((event) => {
|
|
498
481
|
sessionViewStreamHub.publish(streamKey, event);
|
|
499
482
|
});
|
|
500
|
-
const event = {
|
|
483
|
+
const event = createConversationEvent({
|
|
484
|
+
platform: entry.platform,
|
|
501
485
|
type: "session_view",
|
|
502
486
|
conversationId: entry.conversationId,
|
|
503
487
|
conversationKind,
|
|
@@ -506,21 +490,23 @@ async function handleSessionMessageRequest(req, res, sessionViewTokenStore, inte
|
|
|
506
490
|
text,
|
|
507
491
|
attachments: [],
|
|
508
492
|
sessionKey: activeSessionKey,
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
493
|
+
thread_ts: isThreadSessionKey(activeSessionKey) ? threadSuffixOf(activeSessionKey) : undefined,
|
|
494
|
+
});
|
|
495
|
+
const message = createConversationMessage({
|
|
496
|
+
platform: entry.platform,
|
|
497
|
+
conversationId: entry.conversationId,
|
|
498
|
+
id: ts,
|
|
499
|
+
sessionKey: activeSessionKey,
|
|
500
|
+
conversationKind,
|
|
501
|
+
userId: entry.platformUserId,
|
|
502
|
+
userName: platformUserName,
|
|
503
|
+
text,
|
|
504
|
+
attachments: [],
|
|
505
|
+
threadTs: event.thread_ts,
|
|
506
|
+
});
|
|
513
507
|
const context = {
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
sessionKey: activeSessionKey,
|
|
517
|
-
conversationKind,
|
|
518
|
-
userId: entry.platformUserId,
|
|
519
|
-
userName: platformUserName,
|
|
520
|
-
text,
|
|
521
|
-
attachments: [],
|
|
522
|
-
threadTs: event.thread_ts,
|
|
523
|
-
},
|
|
508
|
+
address: event.address,
|
|
509
|
+
message,
|
|
524
510
|
responder,
|
|
525
511
|
platform: { ...platformInfo, diagnostics: { showUsageSummary: false } },
|
|
526
512
|
};
|
|
@@ -531,12 +517,8 @@ async function handleSessionMessageRequest(req, res, sessionViewTokenStore, inte
|
|
|
531
517
|
});
|
|
532
518
|
void interactive.handler
|
|
533
519
|
.handleEvent(event, bot, context)
|
|
534
|
-
.then(() => {
|
|
535
|
-
|
|
536
|
-
sessionViewStreamHub.publish(streamKey, { type: "status", running: false });
|
|
537
|
-
return;
|
|
538
|
-
}
|
|
539
|
-
const model = loadSessionViewModel(targetSessionFile);
|
|
520
|
+
.then(async () => {
|
|
521
|
+
const model = await loadSessionViewModel(targetSessionFile);
|
|
540
522
|
sessionViewStreamHub.publish(streamKey, {
|
|
541
523
|
type: "refresh",
|
|
542
524
|
timelineHtml: renderTimelineItems(model.items, token),
|
|
@@ -546,7 +528,7 @@ async function handleSessionMessageRequest(req, res, sessionViewTokenStore, inte
|
|
|
546
528
|
});
|
|
547
529
|
})
|
|
548
530
|
.catch((error) => {
|
|
549
|
-
log.logWarning(`[${entry.conversationId}] Session view message failed`,
|
|
531
|
+
log.logWarning(`[${entry.conversationId}] Session view message failed`, errorMessage(error));
|
|
550
532
|
reportUserFacingError(error, {
|
|
551
533
|
domain: "session_view",
|
|
552
534
|
surface: "session_view",
|
|
@@ -562,7 +544,7 @@ async function handleSessionMessageRequest(req, res, sessionViewTokenStore, inte
|
|
|
562
544
|
});
|
|
563
545
|
sessionViewStreamHub.publish(streamKey, {
|
|
564
546
|
type: "error",
|
|
565
|
-
message:
|
|
547
|
+
message: errorMessage(error),
|
|
566
548
|
});
|
|
567
549
|
sessionViewStreamHub.publish(streamKey, { type: "status", running: false });
|
|
568
550
|
});
|
|
@@ -600,13 +582,6 @@ function createSessionViewResponseContext(publish) {
|
|
|
600
582
|
},
|
|
601
583
|
};
|
|
602
584
|
}
|
|
603
|
-
function json(res, status, body) {
|
|
604
|
-
res.writeHead(status, {
|
|
605
|
-
"Content-Type": "application/json; charset=utf-8",
|
|
606
|
-
"Cache-Control": "no-store",
|
|
607
|
-
});
|
|
608
|
-
res.end(JSON.stringify(body));
|
|
609
|
-
}
|
|
610
585
|
function renderStatusPage(title, message) {
|
|
611
586
|
return renderHtmlDocument(title, `<section class="card stack">
|
|
612
587
|
<p class="eyebrow">mikan</p>
|
|
@@ -820,12 +795,12 @@ const sessionViewStyles = `
|
|
|
820
795
|
}
|
|
821
796
|
|
|
822
797
|
body {
|
|
823
|
-
|
|
798
|
+
|
|
824
799
|
padding-bottom: calc(140px + env(safe-area-inset-bottom, 0px));
|
|
825
800
|
overflow-x: hidden;
|
|
826
801
|
}
|
|
827
802
|
|
|
828
|
-
|
|
803
|
+
|
|
829
804
|
|
|
830
805
|
.session-side {
|
|
831
806
|
display: flex; flex-direction: column; align-items: flex-end; gap: 8px;
|
|
@@ -869,7 +844,7 @@ const sessionViewStyles = `
|
|
|
869
844
|
color: var(--text); padding: 0;
|
|
870
845
|
}
|
|
871
846
|
|
|
872
|
-
|
|
847
|
+
|
|
873
848
|
|
|
874
849
|
.thread-links {
|
|
875
850
|
display: flex;
|
|
@@ -1083,7 +1058,7 @@ const sessionViewStyles = `
|
|
|
1083
1058
|
color: #b91c1c;
|
|
1084
1059
|
}
|
|
1085
1060
|
|
|
1086
|
-
|
|
1061
|
+
|
|
1087
1062
|
|
|
1088
1063
|
.msg-row {
|
|
1089
1064
|
display: flex;
|
|
@@ -1093,7 +1068,7 @@ const sessionViewStyles = `
|
|
|
1093
1068
|
min-width: 0;
|
|
1094
1069
|
}
|
|
1095
1070
|
|
|
1096
|
-
|
|
1071
|
+
|
|
1097
1072
|
|
|
1098
1073
|
.msg-user {
|
|
1099
1074
|
justify-content: flex-end;
|
|
@@ -1165,7 +1140,7 @@ const sessionViewStyles = `
|
|
|
1165
1140
|
text-align: right;
|
|
1166
1141
|
}
|
|
1167
1142
|
|
|
1168
|
-
|
|
1143
|
+
|
|
1169
1144
|
|
|
1170
1145
|
.msg-avatar {
|
|
1171
1146
|
flex: 0 0 28px;
|
|
@@ -1194,7 +1169,7 @@ const sessionViewStyles = `
|
|
|
1194
1169
|
margin-bottom: 2px;
|
|
1195
1170
|
}
|
|
1196
1171
|
|
|
1197
|
-
|
|
1172
|
+
|
|
1198
1173
|
|
|
1199
1174
|
.msg-assistant {
|
|
1200
1175
|
align-items: flex-end;
|
|
@@ -1231,7 +1206,7 @@ const sessionViewStyles = `
|
|
|
1231
1206
|
color: var(--subtle);
|
|
1232
1207
|
}
|
|
1233
1208
|
|
|
1234
|
-
|
|
1209
|
+
|
|
1235
1210
|
|
|
1236
1211
|
.tool-block {
|
|
1237
1212
|
max-width: 92%;
|
|
@@ -1296,7 +1271,7 @@ const sessionViewStyles = `
|
|
|
1296
1271
|
.tool-output.tone-ok { color: var(--tool-ok); }
|
|
1297
1272
|
.tool-output.tone-err { color: var(--tool-err); }
|
|
1298
1273
|
|
|
1299
|
-
|
|
1274
|
+
|
|
1300
1275
|
|
|
1301
1276
|
.markdown-body {
|
|
1302
1277
|
font-family: 'DM Sans', system-ui, sans-serif;
|
|
@@ -1433,7 +1408,7 @@ const sessionViewStyles = `
|
|
|
1433
1408
|
border-color: rgba(0, 0, 0, 0.08);
|
|
1434
1409
|
}
|
|
1435
1410
|
|
|
1436
|
-
|
|
1411
|
+
|
|
1437
1412
|
|
|
1438
1413
|
.system-event {
|
|
1439
1414
|
display: flex;
|
|
@@ -1467,7 +1442,7 @@ const sessionViewStyles = `
|
|
|
1467
1442
|
font-style: normal;
|
|
1468
1443
|
}
|
|
1469
1444
|
|
|
1470
|
-
|
|
1445
|
+
|
|
1471
1446
|
|
|
1472
1447
|
.stack > * + * { margin-top: 14px; }
|
|
1473
1448
|
|
|
@@ -1485,7 +1460,7 @@ const sessionViewStyles = `
|
|
|
1485
1460
|
border: 1px solid rgba(185, 28, 28, 0.12);
|
|
1486
1461
|
}
|
|
1487
1462
|
|
|
1488
|
-
|
|
1463
|
+
|
|
1489
1464
|
|
|
1490
1465
|
.composer-card {
|
|
1491
1466
|
position: fixed;
|
|
@@ -1617,7 +1592,7 @@ const sessionViewStyles = `
|
|
|
1617
1592
|
opacity: 1;
|
|
1618
1593
|
}
|
|
1619
1594
|
|
|
1620
|
-
|
|
1595
|
+
|
|
1621
1596
|
|
|
1622
1597
|
@media (max-width: 900px) {
|
|
1623
1598
|
.composer-card {
|
|
@@ -1648,4 +1623,489 @@ const sessionViewStyles = `
|
|
|
1648
1623
|
.asst-card { border-radius: 4px 14px 14px 14px; }
|
|
1649
1624
|
}
|
|
1650
1625
|
`;
|
|
1626
|
+
function entryIsoTime(entry) {
|
|
1627
|
+
if (!entry || typeof entry.timestamp !== "number" || !Number.isFinite(entry.timestamp)) {
|
|
1628
|
+
return undefined;
|
|
1629
|
+
}
|
|
1630
|
+
return new Date(entry.timestamp).toISOString();
|
|
1631
|
+
}
|
|
1632
|
+
export function resolveExistingSessionFile(conversationDir, sessionKey) {
|
|
1633
|
+
if (isThreadSessionKey(sessionKey)) {
|
|
1634
|
+
return tryResolveThreadSession(getThreadSessionFile(conversationDir, sessionKey));
|
|
1635
|
+
}
|
|
1636
|
+
return resolveChannelSessionFile(conversationDir);
|
|
1637
|
+
}
|
|
1638
|
+
export async function loadSessionViewModel(sessionFile) {
|
|
1639
|
+
const resolvedFile = resolve(sessionFile);
|
|
1640
|
+
const sm = await SessionStore.inspect(resolvedFile);
|
|
1641
|
+
const header = sm.getHeader();
|
|
1642
|
+
const entries = await sm.getEntries();
|
|
1643
|
+
const updatedAt = entryIsoTime(entries.at(-1)) ?? header.timestamp;
|
|
1644
|
+
const title = (await sm.getSessionName()) || `Session ${header.id.slice(0, 8)}`;
|
|
1645
|
+
const parent = await resolveParentRelation(resolvedFile, header);
|
|
1646
|
+
const threadCandidates = [];
|
|
1647
|
+
for (const candidate of listRelatedSessionFiles(resolvedFile)) {
|
|
1648
|
+
if (candidate === resolvedFile)
|
|
1649
|
+
continue;
|
|
1650
|
+
const relation = await buildSessionRelation(candidate, "thread", resolvedFile, header.id, entries);
|
|
1651
|
+
if (relation)
|
|
1652
|
+
threadCandidates.push(relation);
|
|
1653
|
+
}
|
|
1654
|
+
const threads = threadCandidates.toSorted((a, b) => a.updatedAt < b.updatedAt ? -1 : a.updatedAt > b.updatedAt ? 1 : 0);
|
|
1655
|
+
const threadsByEntryId = new Map();
|
|
1656
|
+
for (const thread of threads) {
|
|
1657
|
+
if (!thread.anchorEntryId)
|
|
1658
|
+
continue;
|
|
1659
|
+
const bucket = threadsByEntryId.get(thread.anchorEntryId) ?? [];
|
|
1660
|
+
bucket.push(thread);
|
|
1661
|
+
threadsByEntryId.set(thread.anchorEntryId, bucket);
|
|
1662
|
+
}
|
|
1663
|
+
const items = entries.flatMap((entry) => {
|
|
1664
|
+
const item = mapEntryToItem(entry);
|
|
1665
|
+
if (!item)
|
|
1666
|
+
return [];
|
|
1667
|
+
if (item.entryId) {
|
|
1668
|
+
const anchoredThreads = threadsByEntryId.get(item.entryId);
|
|
1669
|
+
if (anchoredThreads) {
|
|
1670
|
+
item.threads = anchoredThreads;
|
|
1671
|
+
}
|
|
1672
|
+
}
|
|
1673
|
+
return [item];
|
|
1674
|
+
});
|
|
1675
|
+
return {
|
|
1676
|
+
sessionId: header.id,
|
|
1677
|
+
fileName: basename(resolvedFile),
|
|
1678
|
+
title,
|
|
1679
|
+
createdAt: header.timestamp,
|
|
1680
|
+
updatedAt,
|
|
1681
|
+
entryCount: entries.length,
|
|
1682
|
+
items,
|
|
1683
|
+
parent: parent ?? undefined,
|
|
1684
|
+
threads,
|
|
1685
|
+
};
|
|
1686
|
+
}
|
|
1687
|
+
async function resolveRequestedSessionFile(baseSessionFile, requestedFileName) {
|
|
1688
|
+
const resolvedBase = resolve(baseSessionFile);
|
|
1689
|
+
if (!requestedFileName)
|
|
1690
|
+
return resolvedBase;
|
|
1691
|
+
const trimmed = requestedFileName.trim();
|
|
1692
|
+
if (!trimmed)
|
|
1693
|
+
return resolvedBase;
|
|
1694
|
+
const fileName = basename(trimmed);
|
|
1695
|
+
if (fileName !== trimmed || !fileName.endsWith(".jsonl"))
|
|
1696
|
+
return null;
|
|
1697
|
+
const candidate = join(dirname(resolvedBase), fileName);
|
|
1698
|
+
if (!existsSync(candidate))
|
|
1699
|
+
return null;
|
|
1700
|
+
try {
|
|
1701
|
+
if (!SessionStore.readHeader(candidate))
|
|
1702
|
+
throw new Error("Invalid session header");
|
|
1703
|
+
}
|
|
1704
|
+
catch (err) {
|
|
1705
|
+
throw new Error(`Session file is corrupted: ${candidate}: ${errorMessage(err)}`, {
|
|
1706
|
+
cause: err,
|
|
1707
|
+
});
|
|
1708
|
+
}
|
|
1709
|
+
return candidate;
|
|
1710
|
+
}
|
|
1711
|
+
function listRelatedSessionFiles(sessionFile) {
|
|
1712
|
+
const dir = dirname(sessionFile);
|
|
1713
|
+
if (!existsSync(dir))
|
|
1714
|
+
return [];
|
|
1715
|
+
return readdirSync(dir)
|
|
1716
|
+
.filter((name) => name.endsWith(".jsonl"))
|
|
1717
|
+
.map((fileName) => join(dir, fileName));
|
|
1718
|
+
}
|
|
1719
|
+
async function buildSessionRelation(sessionFile, kind, expectedParent, expectedParentId, expectedParentEntries) {
|
|
1720
|
+
let sm;
|
|
1721
|
+
try {
|
|
1722
|
+
sm = await SessionStore.inspect(sessionFile);
|
|
1723
|
+
}
|
|
1724
|
+
catch (err) {
|
|
1725
|
+
log.logWarning(`Skipping corrupted session file while building ${kind} relation: ${sessionFile}`, errorMessage(err));
|
|
1726
|
+
return null;
|
|
1727
|
+
}
|
|
1728
|
+
const header = sm.getHeader();
|
|
1729
|
+
if (kind === "thread" &&
|
|
1730
|
+
!isChildThreadSession(sessionFile, header.parentSession, expectedParent, expectedParentId, header.parentSessionId)) {
|
|
1731
|
+
return null;
|
|
1732
|
+
}
|
|
1733
|
+
const entries = await sm.getEntries();
|
|
1734
|
+
const updatedAt = entryIsoTime(entries.at(-1)) ?? header.timestamp;
|
|
1735
|
+
const threadId = kind === "thread" ? getFixedThreadSessionId(sessionFile) : null;
|
|
1736
|
+
const anchorEntryId = kind === "thread" && expectedParent
|
|
1737
|
+
? findThreadAnchorEntryId(expectedParentEntries ??
|
|
1738
|
+
(await (await SessionStore.inspect(expectedParent)).getEntries()), entries, threadId)
|
|
1739
|
+
: undefined;
|
|
1740
|
+
return {
|
|
1741
|
+
kind,
|
|
1742
|
+
fileName: basename(sessionFile),
|
|
1743
|
+
sessionId: header.id,
|
|
1744
|
+
title: (await sm.getSessionName()) || `Session ${header.id.slice(0, 8)}`,
|
|
1745
|
+
updatedAt,
|
|
1746
|
+
entryCount: entries.length,
|
|
1747
|
+
summary: extractSessionSummary(entries),
|
|
1748
|
+
anchorEntryId,
|
|
1749
|
+
};
|
|
1750
|
+
}
|
|
1751
|
+
async function resolveParentRelation(sessionFile, header) {
|
|
1752
|
+
if (header.parentSession) {
|
|
1753
|
+
const parentPath = resolve(header.parentSession);
|
|
1754
|
+
if (existsSync(parentPath)) {
|
|
1755
|
+
return (await buildSessionRelation(parentPath, "parent")) ?? undefined;
|
|
1756
|
+
}
|
|
1757
|
+
if (header.parentSessionId) {
|
|
1758
|
+
const found = findSessionFileById(dirname(sessionFile), header.parentSessionId);
|
|
1759
|
+
if (found)
|
|
1760
|
+
return (await buildSessionRelation(found, "parent")) ?? undefined;
|
|
1761
|
+
}
|
|
1762
|
+
}
|
|
1763
|
+
return buildInferredThreadParentRelation(sessionFile);
|
|
1764
|
+
}
|
|
1765
|
+
function findSessionFileById(sessionDir, targetId) {
|
|
1766
|
+
if (!existsSync(sessionDir))
|
|
1767
|
+
return null;
|
|
1768
|
+
for (const name of readdirSync(sessionDir)) {
|
|
1769
|
+
if (!name.endsWith(".jsonl"))
|
|
1770
|
+
continue;
|
|
1771
|
+
try {
|
|
1772
|
+
const filePath = join(sessionDir, name);
|
|
1773
|
+
if (SessionStore.readHeader(filePath)?.id === targetId)
|
|
1774
|
+
return filePath;
|
|
1775
|
+
}
|
|
1776
|
+
catch {
|
|
1777
|
+
continue;
|
|
1778
|
+
}
|
|
1779
|
+
}
|
|
1780
|
+
return null;
|
|
1781
|
+
}
|
|
1782
|
+
async function buildInferredThreadParentRelation(sessionFile) {
|
|
1783
|
+
if (!getFixedThreadSessionId(sessionFile))
|
|
1784
|
+
return undefined;
|
|
1785
|
+
const parentSession = resolveChannelSessionFile(dirname(dirname(sessionFile)));
|
|
1786
|
+
if (!parentSession || parentSession === sessionFile)
|
|
1787
|
+
return undefined;
|
|
1788
|
+
return (await buildSessionRelation(parentSession, "parent")) ?? undefined;
|
|
1789
|
+
}
|
|
1790
|
+
function isChildThreadSession(sessionFile, parentSession, expectedParent, expectedParentId, threadParentSessionId) {
|
|
1791
|
+
if (!expectedParent)
|
|
1792
|
+
return false;
|
|
1793
|
+
if (parentSession) {
|
|
1794
|
+
const resolvedParent = resolve(parentSession);
|
|
1795
|
+
if (resolvedParent === expectedParent ||
|
|
1796
|
+
(isPlatformHistorySession(expectedParent) && isPlatformHistorySession(resolvedParent))) {
|
|
1797
|
+
return true;
|
|
1798
|
+
}
|
|
1799
|
+
if (expectedParentId && threadParentSessionId) {
|
|
1800
|
+
return threadParentSessionId === expectedParentId;
|
|
1801
|
+
}
|
|
1802
|
+
return false;
|
|
1803
|
+
}
|
|
1804
|
+
if (!getFixedThreadSessionId(sessionFile))
|
|
1805
|
+
return false;
|
|
1806
|
+
return resolveChannelSessionFile(dirname(dirname(sessionFile))) === expectedParent;
|
|
1807
|
+
}
|
|
1808
|
+
function getFixedThreadSessionId(sessionFile) {
|
|
1809
|
+
const fileName = basename(sessionFile);
|
|
1810
|
+
if (!fileName.endsWith(".jsonl"))
|
|
1811
|
+
return null;
|
|
1812
|
+
if (/^\d{4}-\d{2}-\d{2}T.+_[0-9a-f]{8}\.jsonl$/i.test(fileName))
|
|
1813
|
+
return null;
|
|
1814
|
+
return fileName.slice(0, -".jsonl".length);
|
|
1815
|
+
}
|
|
1816
|
+
function findThreadAnchorEntryId(parentEntries, childEntries, threadId) {
|
|
1817
|
+
const threadTimestamp = threadId ? Number(threadId) * 1000 : undefined;
|
|
1818
|
+
if (threadTimestamp !== undefined && Number.isFinite(threadTimestamp)) {
|
|
1819
|
+
const timestampAnchor = findEntryIdByMessageTimestamp(parentEntries, threadTimestamp);
|
|
1820
|
+
if (timestampAnchor)
|
|
1821
|
+
return timestampAnchor;
|
|
1822
|
+
}
|
|
1823
|
+
let sharedCount = 0;
|
|
1824
|
+
while (sharedCount < parentEntries.length &&
|
|
1825
|
+
sharedCount < childEntries.length &&
|
|
1826
|
+
parentEntries[sharedCount]?.id === childEntries[sharedCount]?.id) {
|
|
1827
|
+
sharedCount += 1;
|
|
1828
|
+
}
|
|
1829
|
+
if (sharedCount > 0) {
|
|
1830
|
+
return parentEntries[sharedCount - 1]?.id;
|
|
1831
|
+
}
|
|
1832
|
+
const contentAnchor = findSharedContentAnchorEntryId(parentEntries, childEntries);
|
|
1833
|
+
if (contentAnchor)
|
|
1834
|
+
return contentAnchor;
|
|
1835
|
+
const childRoot = findComparableUserMessage(childEntries);
|
|
1836
|
+
if (!childRoot)
|
|
1837
|
+
return undefined;
|
|
1838
|
+
return findParentAnchorByRootMessage(parentEntries, childRoot);
|
|
1839
|
+
}
|
|
1840
|
+
function findEntryIdByMessageTimestamp(entries, timestamp) {
|
|
1841
|
+
for (const entry of entries) {
|
|
1842
|
+
if (entry.type !== "message")
|
|
1843
|
+
continue;
|
|
1844
|
+
const messageTimestamp = entry.message.timestamp;
|
|
1845
|
+
if (messageTimestamp === timestamp)
|
|
1846
|
+
return entry.id;
|
|
1847
|
+
}
|
|
1848
|
+
return undefined;
|
|
1849
|
+
}
|
|
1850
|
+
function findSharedContentAnchorEntryId(parentEntries, childEntries) {
|
|
1851
|
+
const parentMessages = parentEntries.flatMap((entry) => {
|
|
1852
|
+
const comparable = getComparableSessionMessage(entry);
|
|
1853
|
+
return comparable ? [comparable] : [];
|
|
1854
|
+
});
|
|
1855
|
+
const childMessages = childEntries.flatMap((entry) => {
|
|
1856
|
+
const comparable = getComparableSessionMessage(entry);
|
|
1857
|
+
return comparable ? [comparable] : [];
|
|
1858
|
+
});
|
|
1859
|
+
if (parentMessages.length === 0 || childMessages.length === 0)
|
|
1860
|
+
return undefined;
|
|
1861
|
+
let bestParentEnd = -1;
|
|
1862
|
+
let bestLength = 0;
|
|
1863
|
+
for (let parentStart = 0; parentStart < parentMessages.length; parentStart++) {
|
|
1864
|
+
let length = 0;
|
|
1865
|
+
while (parentStart + length < parentMessages.length && length < childMessages.length) {
|
|
1866
|
+
const parentMessage = parentMessages[parentStart + length];
|
|
1867
|
+
const childMessage = childMessages[length];
|
|
1868
|
+
if (parentMessage === undefined ||
|
|
1869
|
+
childMessage === undefined ||
|
|
1870
|
+
parentMessage.role !== childMessage.role ||
|
|
1871
|
+
parentMessage.normalizedText !== childMessage.normalizedText) {
|
|
1872
|
+
break;
|
|
1873
|
+
}
|
|
1874
|
+
length += 1;
|
|
1875
|
+
}
|
|
1876
|
+
if (length > bestLength) {
|
|
1877
|
+
bestLength = length;
|
|
1878
|
+
bestParentEnd = parentStart + length - 1;
|
|
1879
|
+
}
|
|
1880
|
+
}
|
|
1881
|
+
return bestLength > 0 ? parentMessages[bestParentEnd]?.entryId : undefined;
|
|
1882
|
+
}
|
|
1883
|
+
function getComparableSessionMessage(entry) {
|
|
1884
|
+
if (entry.type !== "message")
|
|
1885
|
+
return null;
|
|
1886
|
+
const role = entry.message.role;
|
|
1887
|
+
if (role !== "user" && role !== "assistant")
|
|
1888
|
+
return null;
|
|
1889
|
+
const body = contentToText(entry.message.content);
|
|
1890
|
+
const normalizedText = normalizeComparableSessionText(body, role);
|
|
1891
|
+
if (!normalizedText)
|
|
1892
|
+
return null;
|
|
1893
|
+
return { entryId: entry.id, role, normalizedText };
|
|
1894
|
+
}
|
|
1895
|
+
function normalizeComparableSessionText(text, role) {
|
|
1896
|
+
const normalized = role === "user" ? normalizeComparableUserText(text) : text.trim();
|
|
1897
|
+
return normalized.replace(/\s+/g, " ").trim();
|
|
1898
|
+
}
|
|
1899
|
+
function findParentAnchorByRootMessage(parentEntries, childRoot) {
|
|
1900
|
+
let textMatchId;
|
|
1901
|
+
for (const entry of parentEntries) {
|
|
1902
|
+
const comparable = getComparableUserMessage(entry);
|
|
1903
|
+
if (!comparable)
|
|
1904
|
+
continue;
|
|
1905
|
+
if (comparable.normalizedText !== childRoot.normalizedText)
|
|
1906
|
+
continue;
|
|
1907
|
+
if (childRoot.messageTimestamp !== undefined &&
|
|
1908
|
+
comparable.messageTimestamp !== undefined &&
|
|
1909
|
+
comparable.messageTimestamp === childRoot.messageTimestamp) {
|
|
1910
|
+
return entry.id;
|
|
1911
|
+
}
|
|
1912
|
+
textMatchId ??= entry.id;
|
|
1913
|
+
}
|
|
1914
|
+
return textMatchId;
|
|
1915
|
+
}
|
|
1916
|
+
function findComparableUserMessage(entries) {
|
|
1917
|
+
for (const entry of entries) {
|
|
1918
|
+
const comparable = getComparableUserMessage(entry);
|
|
1919
|
+
if (comparable)
|
|
1920
|
+
return comparable;
|
|
1921
|
+
}
|
|
1922
|
+
return null;
|
|
1923
|
+
}
|
|
1924
|
+
function getComparableUserMessage(entry) {
|
|
1925
|
+
if (entry.type !== "message" || entry.message.role !== "user")
|
|
1926
|
+
return null;
|
|
1927
|
+
const body = contentToText(entry.message.content);
|
|
1928
|
+
const normalizedText = normalizeComparableUserText(body);
|
|
1929
|
+
if (!normalizedText)
|
|
1930
|
+
return null;
|
|
1931
|
+
const messageTimestamp = typeof entry.message.timestamp === "number" ? entry.message.timestamp : undefined;
|
|
1932
|
+
return { normalizedText, messageTimestamp };
|
|
1933
|
+
}
|
|
1934
|
+
function normalizeComparableUserText(text) {
|
|
1935
|
+
const withoutTimestamp = text.replace(/^\[[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}[+-][0-9]{2}:[0-9]{2}\]\s+(?=\[[^\]]+\](?:\s+\[in-thread:[^\]]+\])?:\s)/, "");
|
|
1936
|
+
return withoutTimestamp
|
|
1937
|
+
.replace(/\n*<slack_attachments>\n[\s\S]*?\n<\/slack_attachments>\s*$/g, "")
|
|
1938
|
+
.trim();
|
|
1939
|
+
}
|
|
1940
|
+
function extractSessionSummary(entries) {
|
|
1941
|
+
for (const entry of entries) {
|
|
1942
|
+
if (entry.type !== "message")
|
|
1943
|
+
continue;
|
|
1944
|
+
const item = mapEntryToItem(entry);
|
|
1945
|
+
if (!item?.body)
|
|
1946
|
+
continue;
|
|
1947
|
+
return collapseSummary(item.body);
|
|
1948
|
+
}
|
|
1949
|
+
return undefined;
|
|
1950
|
+
}
|
|
1951
|
+
function collapseSummary(text) {
|
|
1952
|
+
const singleLine = text.replace(/\s+/g, " ").trim();
|
|
1953
|
+
return singleLine.length > 96 ? `${singleLine.slice(0, 93)}…` : singleLine;
|
|
1954
|
+
}
|
|
1955
|
+
function mapEntryToItem(entry) {
|
|
1956
|
+
switch (entry.type) {
|
|
1957
|
+
case "message":
|
|
1958
|
+
return mapMessageEntry(entry);
|
|
1959
|
+
case "compaction":
|
|
1960
|
+
return mapCompactionEntry(entry);
|
|
1961
|
+
case "branch_summary":
|
|
1962
|
+
return mapSessionSummaryEntry(entry);
|
|
1963
|
+
case "custom":
|
|
1964
|
+
return {
|
|
1965
|
+
kind: "system",
|
|
1966
|
+
title: `Custom data · ${entry.customType}`,
|
|
1967
|
+
body: entry.data === undefined ? "(no data)" : JSON.stringify(entry.data, null, 2),
|
|
1968
|
+
meta: entryIsoTime(entry) ?? "",
|
|
1969
|
+
tone: "muted",
|
|
1970
|
+
};
|
|
1971
|
+
default:
|
|
1972
|
+
return null;
|
|
1973
|
+
}
|
|
1974
|
+
}
|
|
1975
|
+
function mapMessageEntry(entry) {
|
|
1976
|
+
const message = entry.message;
|
|
1977
|
+
switch (message.role) {
|
|
1978
|
+
case "user":
|
|
1979
|
+
return {
|
|
1980
|
+
kind: "user",
|
|
1981
|
+
title: "User",
|
|
1982
|
+
body: contentToText(message.content),
|
|
1983
|
+
meta: entryIsoTime(entry) ?? "",
|
|
1984
|
+
entryId: entry.id,
|
|
1985
|
+
};
|
|
1986
|
+
case "assistant": {
|
|
1987
|
+
const assistantBody = contentToText(message.content) || (message.errorMessage ? `_${message.errorMessage}_` : "");
|
|
1988
|
+
const metaParts = [message.provider, message.model, message.stopReason].filter(Boolean);
|
|
1989
|
+
return {
|
|
1990
|
+
kind: "assistant",
|
|
1991
|
+
title: "Assistant",
|
|
1992
|
+
body: assistantBody,
|
|
1993
|
+
meta: metaParts.length > 0
|
|
1994
|
+
? `${entryIsoTime(entry) ?? ""} · ${metaParts.join(" · ")}`
|
|
1995
|
+
: (entryIsoTime(entry) ?? ""),
|
|
1996
|
+
entryId: entry.id,
|
|
1997
|
+
};
|
|
1998
|
+
}
|
|
1999
|
+
case "toolResult":
|
|
2000
|
+
return {
|
|
2001
|
+
kind: "tool",
|
|
2002
|
+
title: `Tool result · ${String(message.toolName ?? "unknown")}`,
|
|
2003
|
+
body: contentToText(message.content),
|
|
2004
|
+
meta: entryIsoTime(entry) ?? "",
|
|
2005
|
+
tone: message.isError ? "err" : "ok",
|
|
2006
|
+
entryId: entry.id,
|
|
2007
|
+
};
|
|
2008
|
+
case "bashExecution": {
|
|
2009
|
+
const command = String(message.command ?? "").trim();
|
|
2010
|
+
const output = String(message.output ?? "").trim();
|
|
2011
|
+
const details = [
|
|
2012
|
+
typeof message.exitCode === "number" ? `[exitCode] ${message.exitCode}` : "",
|
|
2013
|
+
message.cancelled ? `[cancelled] true` : "",
|
|
2014
|
+
message.truncated ? `[truncated] true` : "",
|
|
2015
|
+
].filter(Boolean);
|
|
2016
|
+
const body = [command ? `$ ${command}` : "", output, ...details].filter(Boolean).join("\n\n");
|
|
2017
|
+
return {
|
|
2018
|
+
kind: "tool",
|
|
2019
|
+
title: "Bash execution",
|
|
2020
|
+
body: body || "(no output)",
|
|
2021
|
+
meta: entryIsoTime(entry) ?? "",
|
|
2022
|
+
entryId: entry.id,
|
|
2023
|
+
};
|
|
2024
|
+
}
|
|
2025
|
+
case "custom":
|
|
2026
|
+
return {
|
|
2027
|
+
kind: "system",
|
|
2028
|
+
title: `Custom message · ${String(message.customType ?? "custom")}`,
|
|
2029
|
+
body: contentToText(message.content),
|
|
2030
|
+
meta: entryIsoTime(entry) ?? "",
|
|
2031
|
+
tone: "muted",
|
|
2032
|
+
entryId: entry.id,
|
|
2033
|
+
};
|
|
2034
|
+
case "branchSummary":
|
|
2035
|
+
return {
|
|
2036
|
+
kind: "system",
|
|
2037
|
+
title: "Session summary",
|
|
2038
|
+
body: String(message.summary ?? ""),
|
|
2039
|
+
meta: entryIsoTime(entry) ?? "",
|
|
2040
|
+
tone: "muted",
|
|
2041
|
+
entryId: entry.id,
|
|
2042
|
+
};
|
|
2043
|
+
case "compactionSummary":
|
|
2044
|
+
return {
|
|
2045
|
+
kind: "system",
|
|
2046
|
+
title: "Compaction summary",
|
|
2047
|
+
body: String(message.summary ?? ""),
|
|
2048
|
+
meta: entryIsoTime(entry) ?? "",
|
|
2049
|
+
tone: "muted",
|
|
2050
|
+
entryId: entry.id,
|
|
2051
|
+
};
|
|
2052
|
+
default:
|
|
2053
|
+
return {
|
|
2054
|
+
kind: "system",
|
|
2055
|
+
title: `Message · ${String(message.role ?? "unknown")}`,
|
|
2056
|
+
body: contentToText(message.content),
|
|
2057
|
+
meta: entryIsoTime(entry) ?? "",
|
|
2058
|
+
tone: "muted",
|
|
2059
|
+
entryId: entry.id,
|
|
2060
|
+
};
|
|
2061
|
+
}
|
|
2062
|
+
}
|
|
2063
|
+
function mapCompactionEntry(entry) {
|
|
2064
|
+
return {
|
|
2065
|
+
kind: "system",
|
|
2066
|
+
title: "Context compacted",
|
|
2067
|
+
body: entry.summary,
|
|
2068
|
+
meta: `${entryIsoTime(entry) ?? ""} · ${entry.tokensBefore} tokens before compaction`,
|
|
2069
|
+
tone: "muted",
|
|
2070
|
+
};
|
|
2071
|
+
}
|
|
2072
|
+
function mapSessionSummaryEntry(entry) {
|
|
2073
|
+
return {
|
|
2074
|
+
kind: "system",
|
|
2075
|
+
title: "Session summary",
|
|
2076
|
+
body: entry.summary,
|
|
2077
|
+
meta: entryIsoTime(entry) ?? "",
|
|
2078
|
+
tone: "muted",
|
|
2079
|
+
};
|
|
2080
|
+
}
|
|
2081
|
+
function contentToText(content) {
|
|
2082
|
+
if (typeof content === "string")
|
|
2083
|
+
return content;
|
|
2084
|
+
if (!Array.isArray(content))
|
|
2085
|
+
return "";
|
|
2086
|
+
const lines = [];
|
|
2087
|
+
for (const block of content) {
|
|
2088
|
+
if (!block || typeof block !== "object")
|
|
2089
|
+
continue;
|
|
2090
|
+
const value = block;
|
|
2091
|
+
if (value.type === "text" && typeof value.text === "string") {
|
|
2092
|
+
lines.push(value.text);
|
|
2093
|
+
continue;
|
|
2094
|
+
}
|
|
2095
|
+
if (value.type === "thinking" && typeof value.thinking === "string") {
|
|
2096
|
+
lines.push(`[thinking]\n${value.thinking}`);
|
|
2097
|
+
continue;
|
|
2098
|
+
}
|
|
2099
|
+
if (value.type === "toolCall") {
|
|
2100
|
+
const name = typeof value.name === "string" ? value.name : "tool";
|
|
2101
|
+
const args = value.arguments === undefined ? "" : JSON.stringify(value.arguments, null, 2);
|
|
2102
|
+
lines.push([`[toolCall] ${name}`, args].filter(Boolean).join("\n"));
|
|
2103
|
+
continue;
|
|
2104
|
+
}
|
|
2105
|
+
if (value.type === "image") {
|
|
2106
|
+
lines.push(`[image ${String(value.mimeType ?? "unknown")}]`);
|
|
2107
|
+
}
|
|
2108
|
+
}
|
|
2109
|
+
return lines.join("\n\n");
|
|
2110
|
+
}
|
|
1651
2111
|
//# sourceMappingURL=portal.js.map
|