@geminixiang/mikan 1.0.0-beta.7 → 1.0.0-beta.71
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 +1052 -0
- package/README.md +98 -38
- package/dist/adapters/commands/admin.d.ts.map +1 -0
- package/dist/{commands → adapters/commands}/admin.js +11 -8
- 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 +166 -0
- package/dist/adapters/commands/login.js.map +1 -0
- package/dist/adapters/commands/manifest.d.ts +37 -0
- package/dist/adapters/commands/manifest.d.ts.map +1 -0
- package/dist/adapters/commands/manifest.js +155 -0
- package/dist/adapters/commands/manifest.js.map +1 -0
- package/dist/adapters/commands/model.d.ts +15 -0
- package/dist/adapters/commands/model.d.ts.map +1 -0
- package/dist/adapters/commands/model.js +153 -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 +41 -0
- package/dist/adapters/commands/new.js.map +1 -0
- package/dist/adapters/commands/registry.d.ts +5 -0
- package/dist/adapters/commands/registry.d.ts.map +1 -0
- package/dist/adapters/commands/registry.js +43 -0
- package/dist/adapters/commands/registry.js.map +1 -0
- 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 +23 -16
- package/dist/adapters/commands/session-view.js.map +1 -0
- package/dist/adapters/commands/types.d.ts +145 -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 +14 -0
- package/dist/adapters/commands/utils.d.ts.map +1 -0
- package/dist/{commands → adapters/commands}/utils.js +18 -1
- package/dist/adapters/commands/utils.js.map +1 -0
- package/dist/adapters/discord/bot.d.ts +11 -8
- package/dist/adapters/discord/bot.d.ts.map +1 -1
- package/dist/adapters/discord/bot.js +223 -256
- package/dist/adapters/discord/bot.js.map +1 -1
- package/dist/adapters/discord/components.d.ts +28 -0
- package/dist/adapters/discord/components.d.ts.map +1 -0
- package/dist/adapters/discord/components.js +32 -0
- package/dist/adapters/discord/components.js.map +1 -0
- package/dist/adapters/discord/context.d.ts +2 -6
- package/dist/adapters/discord/context.d.ts.map +1 -1
- package/dist/adapters/discord/context.js +64 -218
- package/dist/adapters/discord/context.js.map +1 -1
- package/dist/adapters/discord/format.d.ts +3 -0
- package/dist/adapters/discord/format.d.ts.map +1 -0
- package/dist/adapters/discord/format.js +84 -0
- package/dist/adapters/discord/format.js.map +1 -0
- package/dist/adapters/discord/types.d.ts +8 -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 +102 -0
- package/dist/adapters/github/bot.d.ts.map +1 -0
- package/dist/adapters/github/bot.js +720 -0
- package/dist/adapters/github/bot.js.map +1 -0
- package/dist/adapters/github/client.d.ts +122 -0
- package/dist/adapters/github/client.d.ts.map +1 -0
- package/dist/adapters/github/client.js +301 -0
- package/dist/adapters/github/client.js.map +1 -0
- package/dist/adapters/github/context.d.ts +5 -0
- package/dist/adapters/github/context.d.ts.map +1 -0
- package/dist/adapters/github/context.js +101 -0
- package/dist/adapters/github/context.js.map +1 -0
- package/dist/adapters/github/github-ops.d.ts +78 -0
- package/dist/adapters/github/github-ops.d.ts.map +1 -0
- package/dist/adapters/github/github-ops.js +337 -0
- package/dist/adapters/github/github-ops.js.map +1 -0
- package/dist/adapters/github/ids.d.ts +34 -0
- package/dist/adapters/github/ids.d.ts.map +1 -0
- package/dist/adapters/github/ids.js +57 -0
- package/dist/adapters/github/ids.js.map +1 -0
- package/dist/adapters/github/repo.d.ts +33 -0
- package/dist/adapters/github/repo.d.ts.map +1 -0
- package/dist/adapters/github/repo.js +141 -0
- package/dist/adapters/github/repo.js.map +1 -0
- package/dist/adapters/github/tool-pack.d.ts +14 -0
- package/dist/adapters/github/tool-pack.d.ts.map +1 -0
- package/dist/adapters/github/tool-pack.js +55 -0
- package/dist/adapters/github/tool-pack.js.map +1 -0
- package/dist/adapters/github/tools/checks.d.ts +18 -0
- package/dist/adapters/github/tools/checks.d.ts.map +1 -0
- package/dist/adapters/github/tools/checks.js +86 -0
- package/dist/adapters/github/tools/checks.js.map +1 -0
- package/dist/adapters/github/tools/issue.d.ts +21 -0
- package/dist/adapters/github/tools/issue.d.ts.map +1 -0
- package/dist/adapters/github/tools/issue.js +48 -0
- package/dist/adapters/github/tools/issue.js.map +1 -0
- package/dist/adapters/github/tools/pr.d.ts +22 -0
- package/dist/adapters/github/tools/pr.d.ts.map +1 -0
- package/dist/adapters/github/tools/pr.js +48 -0
- package/dist/adapters/github/tools/pr.js.map +1 -0
- package/dist/adapters/github/tools/read.d.ts +21 -0
- package/dist/adapters/github/tools/read.d.ts.map +1 -0
- package/dist/adapters/github/tools/read.js +141 -0
- package/dist/adapters/github/tools/read.js.map +1 -0
- package/dist/adapters/github/tools/review-reply.d.ts +17 -0
- package/dist/adapters/github/tools/review-reply.d.ts.map +1 -0
- package/dist/adapters/github/tools/review-reply.js +38 -0
- package/dist/adapters/github/tools/review-reply.js.map +1 -0
- package/dist/adapters/github/tools/sync.d.ts +17 -0
- package/dist/adapters/github/tools/sync.d.ts.map +1 -0
- package/dist/adapters/github/tools/sync.js +34 -0
- package/dist/adapters/github/tools/sync.js.map +1 -0
- package/dist/adapters/github/types.d.ts +345 -0
- package/dist/adapters/github/types.d.ts.map +1 -0
- package/dist/adapters/github/types.js.map +1 -0
- package/dist/adapters/github/webhook.d.ts +20 -0
- package/dist/adapters/github/webhook.d.ts.map +1 -0
- package/dist/adapters/github/webhook.js +78 -0
- package/dist/adapters/github/webhook.js.map +1 -0
- package/dist/adapters/index.d.ts +12 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +19 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/intake.d.ts +17 -6
- package/dist/adapters/intake.d.ts.map +1 -1
- package/dist/adapters/intake.js +96 -27
- package/dist/adapters/intake.js.map +1 -1
- package/dist/adapters/markdown-tables.d.ts +19 -0
- package/dist/adapters/markdown-tables.d.ts.map +1 -0
- package/dist/adapters/markdown-tables.js +152 -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 +443 -0
- package/dist/adapters/progressive-renderer.js.map +1 -0
- package/dist/adapters/shared.d.ts +37 -11
- package/dist/adapters/shared.d.ts.map +1 -1
- package/dist/adapters/shared.js +130 -24
- package/dist/adapters/shared.js.map +1 -1
- package/dist/adapters/slack/assistant.d.ts +73 -0
- package/dist/adapters/slack/assistant.d.ts.map +1 -0
- package/dist/adapters/slack/assistant.js +205 -0
- package/dist/adapters/slack/assistant.js.map +1 -0
- package/dist/adapters/slack/auto-reply-context.d.ts +21 -0
- package/dist/adapters/slack/auto-reply-context.d.ts.map +1 -0
- package/dist/adapters/slack/auto-reply-context.js +28 -0
- package/dist/adapters/slack/auto-reply-context.js.map +1 -0
- package/dist/adapters/slack/blocks.d.ts +14 -0
- package/dist/adapters/slack/blocks.d.ts.map +1 -1
- package/dist/adapters/slack/blocks.js +104 -148
- package/dist/adapters/slack/blocks.js.map +1 -1
- package/dist/adapters/slack/bot.d.ts +154 -21
- package/dist/adapters/slack/bot.d.ts.map +1 -1
- package/dist/adapters/slack/bot.js +1037 -484
- package/dist/adapters/slack/bot.js.map +1 -1
- package/dist/adapters/slack/context.d.ts +2 -6
- package/dist/adapters/slack/context.d.ts.map +1 -1
- package/dist/adapters/slack/context.js +11 -17
- package/dist/adapters/slack/context.js.map +1 -1
- package/dist/adapters/slack/jev-context.d.ts +30 -0
- package/dist/adapters/slack/jev-context.d.ts.map +1 -0
- package/dist/adapters/slack/jev-context.js +67 -0
- package/dist/adapters/slack/jev-context.js.map +1 -0
- package/dist/adapters/slack/markdown.d.ts +3 -0
- package/dist/adapters/slack/markdown.d.ts.map +1 -0
- package/dist/adapters/slack/markdown.js +48 -0
- package/dist/adapters/slack/markdown.js.map +1 -0
- package/dist/adapters/slack/persona.d.ts +15 -0
- package/dist/adapters/slack/persona.d.ts.map +1 -0
- package/dist/adapters/slack/persona.js +22 -0
- package/dist/adapters/slack/persona.js.map +1 -0
- package/dist/adapters/slack/response-lifecycle.d.ts +1 -1
- package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
- package/dist/adapters/slack/response-lifecycle.js +261 -345
- package/dist/adapters/slack/response-lifecycle.js.map +1 -1
- package/dist/adapters/slack/session.d.ts.map +1 -1
- package/dist/adapters/slack/session.js +7 -11
- package/dist/adapters/slack/session.js.map +1 -1
- package/dist/adapters/slack/stream-limits.d.ts +35 -0
- package/dist/adapters/slack/stream-limits.d.ts.map +1 -0
- package/dist/adapters/slack/stream-limits.js +56 -0
- package/dist/adapters/slack/stream-limits.js.map +1 -0
- package/dist/adapters/slack/task-intent.d.ts +32 -0
- package/dist/adapters/slack/task-intent.d.ts.map +1 -0
- package/dist/adapters/slack/task-intent.js +72 -0
- package/dist/adapters/slack/task-intent.js.map +1 -0
- package/dist/adapters/slack/task-status.d.ts +7 -0
- package/dist/adapters/slack/task-status.d.ts.map +1 -0
- package/dist/adapters/slack/task-status.js +107 -0
- package/dist/adapters/slack/task-status.js.map +1 -0
- package/dist/adapters/slack/tool-pack.d.ts +11 -0
- package/dist/adapters/slack/tool-pack.d.ts.map +1 -0
- package/dist/adapters/slack/tool-pack.js +45 -0
- package/dist/adapters/slack/tool-pack.js.map +1 -0
- package/dist/adapters/slack/tools/blockkit.d.ts +14 -0
- package/dist/adapters/slack/tools/blockkit.d.ts.map +1 -0
- package/dist/adapters/slack/tools/blockkit.js +106 -0
- package/dist/adapters/slack/tools/blockkit.js.map +1 -0
- package/dist/adapters/slack/types.d.ts +73 -2
- 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 +14 -0
- package/dist/adapters/slack/update-diagnostics.d.ts.map +1 -0
- package/dist/adapters/slack/update-diagnostics.js +134 -0
- package/dist/adapters/slack/update-diagnostics.js.map +1 -0
- package/dist/adapters/telegram/bot.d.ts +10 -9
- package/dist/adapters/telegram/bot.d.ts.map +1 -1
- package/dist/adapters/telegram/bot.js +133 -202
- package/dist/adapters/telegram/bot.js.map +1 -1
- package/dist/adapters/telegram/context.d.ts +2 -6
- package/dist/adapters/telegram/context.d.ts.map +1 -1
- package/dist/adapters/telegram/context.js +53 -190
- package/dist/adapters/telegram/context.js.map +1 -1
- package/dist/adapters/telegram/types.d.ts +1 -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 +144 -13
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/adapters/types.js.map +1 -1
- package/dist/adapters/web/admin/portal.d.ts +44 -0
- package/dist/adapters/web/admin/portal.d.ts.map +1 -0
- package/dist/adapters/web/admin/portal.js +3207 -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 +53 -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 +5 -0
- package/dist/adapters/web/login/oauth.d.ts.map +1 -0
- package/dist/{web → adapters/web}/login/oauth.js +50 -85
- package/dist/adapters/web/login/oauth.js.map +1 -0
- package/dist/{web → adapters/web}/login/portal.d.ts +9 -3
- package/dist/adapters/web/login/portal.d.ts.map +1 -0
- package/dist/{web → adapters/web}/login/portal.js +161 -119
- package/dist/adapters/web/login/portal.js.map +1 -0
- package/dist/{web → adapters/web}/login/types.d.ts +1 -12
- 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 +22 -0
- package/dist/adapters/web/portal-shell.d.ts.map +1 -0
- package/dist/{portal-shell.js → adapters/web/portal-shell.js} +78 -2
- package/dist/adapters/web/portal-shell.js.map +1 -0
- package/dist/{web → adapters/web}/server.d.ts +14 -8
- package/dist/adapters/web/server.d.ts.map +1 -0
- package/dist/{web → adapters/web}/server.js +14 -7
- package/dist/adapters/web/server.js.map +1 -0
- package/dist/adapters/web/session-view/portal.d.ts +20 -0
- package/dist/adapters/web/session-view/portal.d.ts.map +1 -0
- package/dist/{web → adapters/web}/session-view/portal.js +633 -162
- package/dist/adapters/web/session-view/portal.js.map +1 -0
- package/dist/{web → adapters/web}/session-view/types.d.ts +11 -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/adapters/web/token-store.d.ts.map +1 -0
- package/dist/{web → adapters/web}/token-store.js +1 -1
- 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 +11 -0
- package/dist/cli/arg-grammar.d.ts.map +1 -0
- package/dist/cli/arg-grammar.js +50 -0
- package/dist/cli/arg-grammar.js.map +1 -0
- package/dist/cli/boot.d.ts +5 -0
- package/dist/cli/boot.d.ts.map +1 -0
- package/dist/cli/boot.js +90 -0
- package/dist/cli/boot.js.map +1 -0
- package/dist/cli/download.d.ts.map +1 -0
- package/dist/cli/download.js +88 -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 +181 -0
- package/dist/cli/office.js.map +1 -0
- package/dist/cli/onboard.d.ts +10 -0
- package/dist/cli/onboard.d.ts.map +1 -0
- package/dist/cli/onboard.js +225 -0
- package/dist/cli/onboard.js.map +1 -0
- package/dist/cli/process-lifecycle.d.ts +19 -0
- package/dist/cli/process-lifecycle.d.ts.map +1 -0
- package/dist/cli/process-lifecycle.js +67 -0
- package/dist/cli/process-lifecycle.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 +88 -0
- package/dist/cli/sessions.js.map +1 -0
- package/dist/cli/types.d.ts +25 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/dream/index.d.ts +20 -0
- package/dist/dream/index.d.ts.map +1 -0
- package/dist/dream/index.js +264 -0
- package/dist/dream/index.js.map +1 -0
- package/dist/dream/types.d.ts +30 -0
- package/dist/dream/types.d.ts.map +1 -0
- package/dist/dream/types.js +2 -0
- package/dist/dream/types.js.map +1 -0
- package/dist/env-manifest.d.ts +38 -0
- package/dist/env-manifest.d.ts.map +1 -0
- package/dist/env-manifest.js +260 -0
- package/dist/env-manifest.js.map +1 -0
- package/dist/events/index.d.ts +172 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +340 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/scheduler.d.ts +34 -0
- package/dist/events/scheduler.d.ts.map +1 -0
- package/dist/events/scheduler.js +231 -0
- package/dist/events/scheduler.js.map +1 -0
- package/dist/file-guards.d.ts +26 -0
- package/dist/file-guards.d.ts.map +1 -0
- package/dist/file-guards.js +133 -0
- package/dist/file-guards.js.map +1 -0
- package/dist/harness/execution-env.d.ts +19 -0
- package/dist/harness/execution-env.d.ts.map +1 -0
- package/dist/harness/execution-env.js +262 -0
- package/dist/harness/execution-env.js.map +1 -0
- package/dist/harness/execution-resolver.d.ts +25 -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/index.d.ts +18 -13
- package/dist/harness/index.d.ts.map +1 -1
- package/dist/harness/index.js +11 -11
- package/dist/harness/index.js.map +1 -1
- package/dist/harness/jev.d.ts +86 -0
- package/dist/harness/jev.d.ts.map +1 -0
- package/dist/harness/jev.js +167 -0
- package/dist/harness/jev.js.map +1 -0
- package/dist/harness/mcp.d.ts +38 -0
- package/dist/harness/mcp.d.ts.map +1 -0
- package/dist/harness/mcp.js +304 -0
- package/dist/harness/mcp.js.map +1 -0
- package/dist/harness/models.d.ts +7 -4
- package/dist/harness/models.d.ts.map +1 -1
- package/dist/harness/models.js +54 -55
- package/dist/harness/models.js.map +1 -1
- package/dist/harness/open-connector.d.ts +25 -0
- package/dist/harness/open-connector.d.ts.map +1 -0
- package/dist/harness/open-connector.js +178 -0
- package/dist/harness/open-connector.js.map +1 -0
- package/dist/harness/presenter.d.ts +31 -0
- package/dist/harness/presenter.d.ts.map +1 -0
- package/dist/harness/presenter.js +859 -0
- package/dist/harness/presenter.js.map +1 -0
- package/dist/harness/prompt.d.ts +30 -0
- package/dist/harness/prompt.d.ts.map +1 -0
- package/dist/harness/prompt.js +420 -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 +551 -416
- package/dist/harness/runner.js.map +1 -1
- package/dist/harness/session.d.ts +122 -0
- package/dist/harness/session.d.ts.map +1 -0
- package/dist/harness/session.js +581 -0
- package/dist/harness/session.js.map +1 -0
- package/dist/harness/skills.d.ts +17 -28
- package/dist/harness/skills.d.ts.map +1 -1
- package/dist/harness/skills.js +104 -39
- package/dist/harness/skills.js.map +1 -1
- package/dist/harness/subagent-profiles.d.ts +8 -0
- package/dist/harness/subagent-profiles.d.ts.map +1 -0
- package/dist/harness/subagent-profiles.js +293 -0
- package/dist/harness/subagent-profiles.js.map +1 -0
- package/dist/harness/subagent.d.ts +64 -0
- package/dist/harness/subagent.d.ts.map +1 -0
- package/dist/harness/subagent.js +687 -0
- package/dist/harness/subagent.js.map +1 -0
- package/dist/harness/tools/attach.d.ts.map +1 -0
- package/dist/{adapters/slack → harness}/tools/attach.js +1 -1
- package/dist/harness/tools/attach.js.map +1 -0
- package/dist/{tools → harness/tools}/event.d.ts +4 -33
- package/dist/harness/tools/event.d.ts.map +1 -0
- package/dist/harness/tools/event.js +175 -0
- package/dist/harness/tools/event.js.map +1 -0
- package/dist/harness/tools/generate-image.d.ts +23 -0
- package/dist/harness/tools/generate-image.d.ts.map +1 -0
- package/dist/harness/tools/generate-image.js +65 -0
- package/dist/harness/tools/generate-image.js.map +1 -0
- package/dist/harness/tools/host-fn-tool.d.ts +21 -0
- package/dist/harness/tools/host-fn-tool.d.ts.map +1 -0
- package/dist/harness/tools/host-fn-tool.js +32 -0
- package/dist/harness/tools/host-fn-tool.js.map +1 -0
- package/dist/harness/tools/index.d.ts +41 -0
- package/dist/harness/tools/index.d.ts.map +1 -0
- package/dist/harness/tools/index.js +51 -0
- package/dist/harness/tools/index.js.map +1 -0
- package/dist/harness/tools/jev.d.ts +21 -0
- package/dist/harness/tools/jev.d.ts.map +1 -0
- package/dist/harness/tools/jev.js +109 -0
- package/dist/harness/tools/jev.js.map +1 -0
- package/dist/harness/tools/pi-tools.d.ts +18 -0
- package/dist/harness/tools/pi-tools.d.ts.map +1 -0
- package/dist/harness/tools/pi-tools.js +84 -0
- package/dist/harness/tools/pi-tools.js.map +1 -0
- package/dist/harness/tools/react.d.ts.map +1 -0
- package/dist/{tools → harness/tools}/react.js +6 -17
- package/dist/harness/tools/react.js.map +1 -0
- package/dist/{tools → harness/tools}/sandbox.d.ts +4 -4
- package/dist/harness/tools/sandbox.d.ts.map +1 -0
- package/dist/{tools → harness/tools}/sandbox.js +12 -8
- package/dist/harness/tools/sandbox.js.map +1 -0
- package/dist/harness/tools/subagent.d.ts +85 -0
- package/dist/harness/tools/subagent.d.ts.map +1 -0
- package/dist/harness/tools/subagent.js +677 -0
- package/dist/harness/tools/subagent.js.map +1 -0
- package/dist/harness/tools/task.d.ts +20 -0
- package/dist/harness/tools/task.d.ts.map +1 -0
- package/dist/harness/tools/task.js +79 -0
- package/dist/harness/tools/task.js.map +1 -0
- package/dist/harness/tools/types.d.ts +29 -0
- package/dist/harness/tools/types.d.ts.map +1 -0
- package/dist/harness/tools/types.js +2 -0
- package/dist/harness/tools/types.js.map +1 -0
- package/dist/harness/types.d.ts +384 -25
- 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 +33 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -6
- package/dist/index.js.map +1 -1
- package/dist/log.d.ts.map +1 -1
- package/dist/log.js +4 -1
- package/dist/log.js.map +1 -1
- package/dist/main.js +357 -198
- package/dist/main.js.map +1 -1
- package/dist/observability/index.d.ts +33 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +257 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/instrument.js +14 -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 +183 -0
- package/dist/observability/otel.js.map +1 -0
- package/dist/observability/sentry.d.ts +40 -7
- package/dist/observability/sentry.d.ts.map +1 -1
- package/dist/observability/sentry.js +176 -32
- package/dist/observability/sentry.js.map +1 -1
- package/dist/observability/types.d.ts +24 -3
- package/dist/observability/types.d.ts.map +1 -1
- package/dist/observability/types.js.map +1 -1
- package/dist/office/index.d.ts +139 -0
- package/dist/office/index.d.ts.map +1 -0
- package/dist/office/index.js +1084 -0
- package/dist/office/index.js.map +1 -0
- package/dist/office/projection.d.ts +42 -0
- package/dist/office/projection.d.ts.map +1 -0
- package/dist/office/projection.js +182 -0
- package/dist/office/projection.js.map +1 -0
- package/dist/office/types.d.ts +116 -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 +1 -1
- package/dist/runtime/conversation-runtime.d.ts.map +1 -1
- package/dist/runtime/conversation-runtime.js +423 -152
- package/dist/runtime/conversation-runtime.js.map +1 -1
- package/dist/runtime/session-lifecycle.d.ts +76 -0
- package/dist/runtime/session-lifecycle.d.ts.map +1 -0
- package/dist/runtime/session-lifecycle.js +404 -0
- package/dist/runtime/session-lifecycle.js.map +1 -0
- package/dist/runtime/types.d.ts +63 -15
- 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 +54 -52
- 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 +19 -7
- 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 +44 -35
- package/dist/sandbox/host.js.map +1 -1
- package/dist/sandbox/identity.d.ts +42 -0
- package/dist/sandbox/identity.d.ts.map +1 -0
- package/dist/sandbox/identity.js +77 -0
- package/dist/sandbox/identity.js.map +1 -0
- package/dist/sandbox/index.d.ts +24 -6
- package/dist/sandbox/index.d.ts.map +1 -1
- package/dist/sandbox/index.js +77 -17
- package/dist/sandbox/index.js.map +1 -1
- package/dist/sandbox/provisioner.d.ts +139 -0
- package/dist/sandbox/provisioner.d.ts.map +1 -0
- package/dist/{provisioner.js → sandbox/provisioner.js} +378 -24
- package/dist/sandbox/provisioner.js.map +1 -0
- package/dist/sandbox/types.d.ts +43 -9
- package/dist/sandbox/types.d.ts.map +1 -1
- package/dist/sandbox/types.js.map +1 -1
- package/dist/sandbox/utils.d.ts +24 -0
- package/dist/sandbox/utils.d.ts.map +1 -1
- package/dist/sandbox/utils.js +92 -1
- package/dist/sandbox/utils.js.map +1 -1
- package/dist/sessions/chat-history-sync.d.ts +23 -0
- package/dist/sessions/chat-history-sync.d.ts.map +1 -0
- package/dist/sessions/{agent-memory-file-manager.js → chat-history-sync.js} +239 -175
- package/dist/sessions/chat-history-sync.js.map +1 -0
- package/dist/sessions/history-line.d.ts +29 -0
- package/dist/sessions/history-line.d.ts.map +1 -0
- package/dist/sessions/history-line.js +45 -0
- package/dist/sessions/history-line.js.map +1 -0
- package/dist/sessions/migrate-common.d.ts +43 -0
- package/dist/sessions/migrate-common.d.ts.map +1 -0
- package/dist/sessions/migrate-common.js +99 -0
- package/dist/sessions/migrate-common.js.map +1 -0
- package/dist/sessions/migrate-pi-084.d.ts +8 -0
- package/dist/sessions/migrate-pi-084.d.ts.map +1 -0
- package/dist/sessions/migrate-pi-084.js +302 -0
- package/dist/sessions/migrate-pi-084.js.map +1 -0
- package/dist/sessions/migrate-v3.d.ts +15 -0
- package/dist/sessions/migrate-v3.d.ts.map +1 -0
- package/dist/sessions/migrate-v3.js +419 -0
- package/dist/sessions/migrate-v3.js.map +1 -0
- package/dist/sessions/session-key.d.ts +33 -0
- package/dist/sessions/session-key.d.ts.map +1 -0
- package/dist/sessions/session-key.js +115 -0
- package/dist/sessions/session-key.js.map +1 -0
- package/dist/sessions/session-store.d.ts +61 -0
- package/dist/sessions/session-store.d.ts.map +1 -0
- package/dist/sessions/session-store.js +684 -0
- package/dist/sessions/session-store.js.map +1 -0
- package/dist/sessions/store.d.ts +17 -10
- package/dist/sessions/store.d.ts.map +1 -1
- package/dist/sessions/store.js +182 -47
- package/dist/sessions/store.js.map +1 -1
- package/dist/sessions/types.d.ts +74 -8
- package/dist/sessions/types.d.ts.map +1 -1
- package/dist/sessions/types.js +1 -1
- package/dist/sessions/types.js.map +1 -1
- package/dist/settings/apply.d.ts +16 -0
- package/dist/settings/apply.d.ts.map +1 -0
- package/dist/settings/apply.js +60 -0
- package/dist/settings/apply.js.map +1 -0
- package/dist/settings/index.d.ts +126 -0
- package/dist/settings/index.d.ts.map +1 -0
- package/dist/settings/index.js +422 -0
- package/dist/settings/index.js.map +1 -0
- package/dist/settings/migrate.d.ts +21 -0
- package/dist/settings/migrate.d.ts.map +1 -0
- package/dist/settings/migrate.js +86 -0
- package/dist/settings/migrate.js.map +1 -0
- package/dist/types.d.ts +330 -141
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -2
- package/dist/types.js.map +1 -1
- package/dist/vault/index.d.ts +52 -2
- package/dist/vault/index.d.ts.map +1 -1
- package/dist/vault/index.js +218 -86
- package/dist/vault/index.js.map +1 -1
- package/dist/vault/types.d.ts +6 -2
- package/dist/vault/types.d.ts.map +1 -1
- package/dist/vault/types.js.map +1 -1
- package/package.json +79 -40
- 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.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 +0 -61
- package/dist/provisioner.d.ts.map +0 -1
- 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 -23
- 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.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.map +0 -1
- 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.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.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.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}/sandbox.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/github}/types.js +0 -0
- /package/dist/{tools → adapters/web/admin}/types.js +0 -0
- /package/dist/{web/admin → adapters/web/login}/types.js +0 -0
- /package/dist/{web/login → adapters/web/session-view}/types.js +0 -0
- /package/dist/{web → adapters/web}/token-store.d.ts +0 -0
- /package/dist/{web → adapters/web}/types.d.ts +0 -0
- /package/dist/{web/session-view → adapters/web}/types.js +0 -0
- /package/dist/{download.d.ts → cli/download.d.ts} +0 -0
- /package/dist/{web → cli}/types.js +0 -0
- /package/dist/{adapters/slack → harness}/tools/attach.d.ts +0 -0
- /package/dist/{tools → harness/tools}/react.d.ts +0 -0
|
@@ -1,12 +1,31 @@
|
|
|
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 * as log from "
|
|
6
|
-
import { renderPortalShell } from "
|
|
7
|
-
import { reportUserFacingError } from "
|
|
8
|
-
import { inferConversationKind } from "
|
|
9
|
-
import {
|
|
9
|
+
import { createConversationEvent, createConversationMessage, } from "../../index.js";
|
|
10
|
+
import { createOfficeAddress } from "../../../office/index.js";
|
|
11
|
+
import * as log from "../../../log.js";
|
|
12
|
+
import { escapeHtml, jsonResponse as json, readJsonBody, renderPortalShell, } from "../portal-shell.js";
|
|
13
|
+
import { reportUserFacingError } from "../../../observability/index.js";
|
|
14
|
+
import { inferConversationKind } from "../../../sessions/session-key.js";
|
|
15
|
+
import { isThreadSessionKey, threadSuffixOf } from "../../../sessions/session-key.js";
|
|
16
|
+
const SESSION_VIEW_TOKEN_TTL_MS = 24 * 60 * 60 * 1000;
|
|
17
|
+
export class InMemorySessionViewTokenStore extends InMemoryTokenStore {
|
|
18
|
+
create(options) {
|
|
19
|
+
return this.createRecord(SESSION_VIEW_TOKEN_TTL_MS, {
|
|
20
|
+
platform: options.platform,
|
|
21
|
+
platformUserId: options.platformUserId,
|
|
22
|
+
...(options.platformUserName ? { platformUserName: options.platformUserName } : {}),
|
|
23
|
+
conversationId: options.conversationId,
|
|
24
|
+
sessionKey: options.sessionKey,
|
|
25
|
+
sessionFile: options.sessionFile,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
10
29
|
const markdown = new MarkdownIt({
|
|
11
30
|
html: false,
|
|
12
31
|
linkify: true,
|
|
@@ -16,8 +35,8 @@ const defaultLinkOpen = markdown.renderer.rules.link_open;
|
|
|
16
35
|
markdown.renderer.rules.link_open = (...args) => {
|
|
17
36
|
const [tokens, idx, options, env, self] = args;
|
|
18
37
|
const token = tokens[idx];
|
|
19
|
-
token
|
|
20
|
-
token
|
|
38
|
+
token?.attrSet("target", "_blank");
|
|
39
|
+
token?.attrSet("rel", "noreferrer noopener");
|
|
21
40
|
return defaultLinkOpen
|
|
22
41
|
? defaultLinkOpen(tokens, idx, options, env, self)
|
|
23
42
|
: self.renderToken(tokens, idx, options);
|
|
@@ -60,75 +79,93 @@ 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}`, error instanceof Error ? error.message : String(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
|
+
/**
|
|
126
|
+
* Token/session selection is shared by HTML, SSE, and message transports.
|
|
127
|
+
* Invalid or expired client capabilities are 400; missing server wiring is
|
|
128
|
+
* 503; a selected corrupt session is a server-side storage failure and is 500.
|
|
129
|
+
*/
|
|
130
|
+
async function resolveSessionRequestTarget(sessionViewTokenStore, rawToken, requestedSession) {
|
|
131
|
+
if (!sessionViewTokenStore) {
|
|
132
|
+
return { ok: false, status: 503, message: "Session view is not configured." };
|
|
103
133
|
}
|
|
134
|
+
const token = rawToken?.trim() ?? "";
|
|
135
|
+
const entry = token ? sessionViewTokenStore.peek(token) : undefined;
|
|
136
|
+
if (!entry) {
|
|
137
|
+
return { ok: false, status: 400, message: "This session link is invalid or has expired." };
|
|
138
|
+
}
|
|
139
|
+
let targetSessionFile;
|
|
104
140
|
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));
|
|
141
|
+
targetSessionFile = await resolveRequestedSessionFile(entry.sessionFile, requestedSession);
|
|
113
142
|
}
|
|
114
143
|
catch (error) {
|
|
115
|
-
log.logWarning(`[${entry.conversationId}]
|
|
144
|
+
log.logWarning(`[${entry.conversationId}] Corrupted session file referenced for ${entry.sessionFile}`, error instanceof Error ? error.message : String(error));
|
|
116
145
|
reportUserFacingError(error, {
|
|
117
146
|
domain: "session_view",
|
|
118
147
|
surface: "session_view",
|
|
119
|
-
operation: "
|
|
148
|
+
operation: "resolve_requested_session",
|
|
120
149
|
severity: "error",
|
|
121
150
|
platform: entry.platform,
|
|
122
151
|
context: {
|
|
123
152
|
conversationId: entry.conversationId,
|
|
124
153
|
sessionKey: entry.sessionKey,
|
|
125
|
-
sessionFile: basename(
|
|
154
|
+
sessionFile: basename(entry.sessionFile),
|
|
155
|
+
requestedSession,
|
|
126
156
|
},
|
|
127
157
|
});
|
|
128
|
-
|
|
129
|
-
res.end(renderStatusPage("Session unavailable", "The session could not be loaded right now."));
|
|
158
|
+
return { ok: false, status: 500, message: "The selected session file is corrupted." };
|
|
130
159
|
}
|
|
131
|
-
|
|
160
|
+
if (!targetSessionFile) {
|
|
161
|
+
return { ok: false, status: 400, message: "The selected session is invalid." };
|
|
162
|
+
}
|
|
163
|
+
return {
|
|
164
|
+
ok: true,
|
|
165
|
+
entry,
|
|
166
|
+
targetSessionFile,
|
|
167
|
+
activeSessionKey: resolveDisplayedSessionKey(entry, targetSessionFile),
|
|
168
|
+
};
|
|
132
169
|
}
|
|
133
170
|
function resolveDisplayedSessionKey(entry, sessionFile) {
|
|
134
171
|
if (entry.platform === "slack") {
|
|
@@ -148,7 +185,8 @@ function renderTimelineItems(items, token) {
|
|
|
148
185
|
? items.map((item) => renderItem(item, token)).join("\n")
|
|
149
186
|
: `<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
187
|
}
|
|
151
|
-
function renderSessionPage(
|
|
188
|
+
function renderSessionPage(options) {
|
|
189
|
+
const { model, token, expiresAt, isRunning, displayedSessionKey, conversationId } = options;
|
|
152
190
|
const items = renderTimelineItems(model.items, token);
|
|
153
191
|
const relatedSections = model.parent
|
|
154
192
|
? `<section class="related-card stack">
|
|
@@ -235,11 +273,11 @@ export function parseUserBody(raw) {
|
|
|
235
273
|
.filter(Boolean)
|
|
236
274
|
.join(" ");
|
|
237
275
|
return {
|
|
238
|
-
timestamp: m[1],
|
|
239
|
-
username: m[2],
|
|
276
|
+
timestamp: m[1] ?? null,
|
|
277
|
+
username: m[2] ?? null,
|
|
240
278
|
threadTs: m[3] ?? null,
|
|
241
279
|
header,
|
|
242
|
-
content: m[4],
|
|
280
|
+
content: m[4] ?? "",
|
|
243
281
|
};
|
|
244
282
|
}
|
|
245
283
|
// [username] [in-thread:ts]: content
|
|
@@ -248,10 +286,10 @@ export function parseUserBody(raw) {
|
|
|
248
286
|
const header = [`[${m[1]}]`, m[2] ? `[in-thread:${m[2]}]` : ""].filter(Boolean).join(" ");
|
|
249
287
|
return {
|
|
250
288
|
timestamp: null,
|
|
251
|
-
username: m[1],
|
|
289
|
+
username: m[1] ?? null,
|
|
252
290
|
threadTs: m[2] ?? null,
|
|
253
291
|
header,
|
|
254
|
-
content: m[3],
|
|
292
|
+
content: m[3] ?? "",
|
|
255
293
|
};
|
|
256
294
|
}
|
|
257
295
|
return { timestamp: null, username: null, threadTs: null, header: null, content: raw };
|
|
@@ -363,54 +401,28 @@ function renderLiveSystemEvent(text, tone = "default") {
|
|
|
363
401
|
return `<div class="system-event${cls}" data-live-item><span class="event-dot"></span><span class="event-text">${esc(text)}</span></div>`;
|
|
364
402
|
}
|
|
365
403
|
async function handleSessionStreamRequest(req, res, url, sessionViewTokenStore, interactive) {
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
res.
|
|
369
|
-
res.end("Session stream unavailable");
|
|
370
|
-
return;
|
|
371
|
-
}
|
|
372
|
-
const entry = sessionViewTokenStore.peek(token);
|
|
373
|
-
if (!entry) {
|
|
374
|
-
res.writeHead(400, { "Content-Type": "text/plain; charset=utf-8" });
|
|
375
|
-
res.end("Invalid session token");
|
|
376
|
-
return;
|
|
377
|
-
}
|
|
378
|
-
const requestedSession = url.searchParams.get("session");
|
|
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");
|
|
404
|
+
if (!interactive) {
|
|
405
|
+
res.writeHead(503, { "Content-Type": "text/plain; charset=utf-8" });
|
|
406
|
+
res.end("Session stream is not configured.");
|
|
399
407
|
return;
|
|
400
408
|
}
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
res.
|
|
409
|
+
const target = await resolveSessionRequestTarget(sessionViewTokenStore, url.searchParams.get("token"), url.searchParams.get("session"));
|
|
410
|
+
if (!target.ok) {
|
|
411
|
+
res.writeHead(target.status, { "Content-Type": "text/plain; charset=utf-8" });
|
|
412
|
+
res.end(target.message);
|
|
404
413
|
return;
|
|
405
414
|
}
|
|
406
|
-
const activeSessionKey =
|
|
415
|
+
const { activeSessionKey, entry } = target;
|
|
407
416
|
const streamKey = sessionStreamKey({ ...entry, sessionKey: activeSessionKey });
|
|
408
417
|
res.writeHead(200, {
|
|
409
418
|
"Content-Type": "text/event-stream; charset=utf-8",
|
|
410
419
|
"Cache-Control": "no-store",
|
|
411
420
|
Connection: "keep-alive",
|
|
412
421
|
});
|
|
413
|
-
res.write(`data: ${JSON.stringify({
|
|
422
|
+
res.write(`data: ${JSON.stringify({
|
|
423
|
+
type: "status",
|
|
424
|
+
running: interactive.handler.isRunning(createOfficeAddress(entry.platform, entry.conversationId), activeSessionKey),
|
|
425
|
+
})}\n\n`);
|
|
414
426
|
const unsubscribe = sessionViewStreamHub.subscribe(streamKey, (event) => {
|
|
415
427
|
res.write(`data: ${JSON.stringify(event)}\n\n`);
|
|
416
428
|
});
|
|
@@ -423,64 +435,43 @@ async function handleSessionStreamRequest(req, res, url, sessionViewTokenStore,
|
|
|
423
435
|
});
|
|
424
436
|
}
|
|
425
437
|
async function handleSessionMessageRequest(req, res, sessionViewTokenStore, interactive) {
|
|
426
|
-
if (!
|
|
438
|
+
if (!interactive) {
|
|
427
439
|
json(res, 503, { ok: false, error: "Session chat is not configured." });
|
|
428
440
|
return;
|
|
429
441
|
}
|
|
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." });
|
|
442
|
+
const body = await readJsonBody(req, res, 1024 * 1024);
|
|
443
|
+
if (!body)
|
|
439
444
|
return;
|
|
440
|
-
|
|
441
|
-
const
|
|
442
|
-
const
|
|
443
|
-
const
|
|
444
|
-
const requestedSessionKey = body.sessionKey?.trim() || "";
|
|
445
|
+
const token = typeof body.token === "string" ? body.token.trim() : "";
|
|
446
|
+
const text = typeof body.text === "string" ? body.text.trim() : "";
|
|
447
|
+
const requestedSession = typeof body.session === "string" ? body.session.trim() || null : null;
|
|
448
|
+
const requestedSessionKey = typeof body.sessionKey === "string" ? body.sessionKey.trim() : "";
|
|
445
449
|
if (!token || !text) {
|
|
446
450
|
json(res, 400, { ok: false, error: "Missing token or text." });
|
|
447
451
|
return;
|
|
448
452
|
}
|
|
449
|
-
const
|
|
450
|
-
if (!
|
|
451
|
-
json(res,
|
|
453
|
+
const target = await resolveSessionRequestTarget(sessionViewTokenStore, token, requestedSession);
|
|
454
|
+
if (!target.ok) {
|
|
455
|
+
json(res, target.status, { ok: false, error: target.message });
|
|
452
456
|
return;
|
|
453
457
|
}
|
|
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);
|
|
458
|
+
const { activeSessionKey, entry, targetSessionFile } = target;
|
|
480
459
|
if (requestedSessionKey && requestedSessionKey !== activeSessionKey) {
|
|
481
460
|
json(res, 400, { ok: false, error: "Session target mismatch." });
|
|
482
461
|
return;
|
|
483
462
|
}
|
|
463
|
+
await dispatchSessionViewMessage({
|
|
464
|
+
res,
|
|
465
|
+
interactive,
|
|
466
|
+
token,
|
|
467
|
+
text,
|
|
468
|
+
activeSessionKey,
|
|
469
|
+
entry,
|
|
470
|
+
targetSessionFile,
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
async function dispatchSessionViewMessage(input) {
|
|
474
|
+
const { res, interactive, token, text, activeSessionKey, entry, targetSessionFile } = input;
|
|
484
475
|
const bot = interactive.botsByPlatform[entry.platform];
|
|
485
476
|
if (!bot) {
|
|
486
477
|
json(res, 503, { ok: false, error: `No bot configured for ${entry.platform}.` });
|
|
@@ -497,7 +488,8 @@ async function handleSessionMessageRequest(req, res, sessionViewTokenStore, inte
|
|
|
497
488
|
const responder = createSessionViewResponseContext((event) => {
|
|
498
489
|
sessionViewStreamHub.publish(streamKey, event);
|
|
499
490
|
});
|
|
500
|
-
const event = {
|
|
491
|
+
const event = createConversationEvent({
|
|
492
|
+
platform: entry.platform,
|
|
501
493
|
type: "session_view",
|
|
502
494
|
conversationId: entry.conversationId,
|
|
503
495
|
conversationKind,
|
|
@@ -506,21 +498,25 @@ async function handleSessionMessageRequest(req, res, sessionViewTokenStore, inte
|
|
|
506
498
|
text,
|
|
507
499
|
attachments: [],
|
|
508
500
|
sessionKey: activeSessionKey,
|
|
509
|
-
...(activeSessionKey
|
|
510
|
-
? { thread_ts: activeSessionKey
|
|
501
|
+
...(isThreadSessionKey(activeSessionKey)
|
|
502
|
+
? { thread_ts: threadSuffixOf(activeSessionKey) }
|
|
511
503
|
: {}),
|
|
512
|
-
};
|
|
504
|
+
});
|
|
505
|
+
const message = createConversationMessage({
|
|
506
|
+
platform: entry.platform,
|
|
507
|
+
conversationId: entry.conversationId,
|
|
508
|
+
id: ts,
|
|
509
|
+
sessionKey: activeSessionKey,
|
|
510
|
+
conversationKind,
|
|
511
|
+
userId: entry.platformUserId,
|
|
512
|
+
userName: platformUserName,
|
|
513
|
+
text,
|
|
514
|
+
attachments: [],
|
|
515
|
+
threadTs: event.thread_ts,
|
|
516
|
+
});
|
|
513
517
|
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
|
-
},
|
|
518
|
+
address: event.address,
|
|
519
|
+
message,
|
|
524
520
|
responder,
|
|
525
521
|
platform: { ...platformInfo, diagnostics: { showUsageSummary: false } },
|
|
526
522
|
};
|
|
@@ -531,12 +527,8 @@ async function handleSessionMessageRequest(req, res, sessionViewTokenStore, inte
|
|
|
531
527
|
});
|
|
532
528
|
void interactive.handler
|
|
533
529
|
.handleEvent(event, bot, context)
|
|
534
|
-
.then(() => {
|
|
535
|
-
|
|
536
|
-
sessionViewStreamHub.publish(streamKey, { type: "status", running: false });
|
|
537
|
-
return;
|
|
538
|
-
}
|
|
539
|
-
const model = loadSessionViewModel(targetSessionFile);
|
|
530
|
+
.then(async () => {
|
|
531
|
+
const model = await loadSessionViewModel(targetSessionFile);
|
|
540
532
|
sessionViewStreamHub.publish(streamKey, {
|
|
541
533
|
type: "refresh",
|
|
542
534
|
timelineHtml: renderTimelineItems(model.items, token),
|
|
@@ -600,13 +592,6 @@ function createSessionViewResponseContext(publish) {
|
|
|
600
592
|
},
|
|
601
593
|
};
|
|
602
594
|
}
|
|
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
595
|
function renderStatusPage(title, message) {
|
|
611
596
|
return renderHtmlDocument(title, `<section class="card stack">
|
|
612
597
|
<p class="eyebrow">mikan</p>
|
|
@@ -1648,4 +1633,490 @@ const sessionViewStyles = `
|
|
|
1648
1633
|
.asst-card { border-radius: 4px 14px 14px 14px; }
|
|
1649
1634
|
}
|
|
1650
1635
|
`;
|
|
1636
|
+
// ── Session view model (formerly service.ts) ──────────────────────────────────
|
|
1637
|
+
function entryIsoTime(entry) {
|
|
1638
|
+
if (!entry || typeof entry.timestamp !== "number" || !Number.isFinite(entry.timestamp)) {
|
|
1639
|
+
return undefined;
|
|
1640
|
+
}
|
|
1641
|
+
return new Date(entry.timestamp).toISOString();
|
|
1642
|
+
}
|
|
1643
|
+
export function resolveExistingSessionFile(conversationDir, sessionKey) {
|
|
1644
|
+
if (isThreadSessionKey(sessionKey)) {
|
|
1645
|
+
return tryResolveThreadSession(getThreadSessionFile(conversationDir, sessionKey));
|
|
1646
|
+
}
|
|
1647
|
+
return resolveChannelSessionFile(conversationDir);
|
|
1648
|
+
}
|
|
1649
|
+
export async function loadSessionViewModel(sessionFile) {
|
|
1650
|
+
const resolvedFile = resolve(sessionFile);
|
|
1651
|
+
const sm = await SessionStore.inspect(resolvedFile);
|
|
1652
|
+
const header = sm.getHeader();
|
|
1653
|
+
const entries = await sm.getEntries();
|
|
1654
|
+
const updatedAt = entryIsoTime(entries.at(-1)) ?? header.timestamp;
|
|
1655
|
+
const title = (await sm.getSessionName()) || `Session ${header.id.slice(0, 8)}`;
|
|
1656
|
+
const parent = await resolveParentRelation(resolvedFile, header);
|
|
1657
|
+
const threadCandidates = [];
|
|
1658
|
+
for (const candidate of listRelatedSessionFiles(resolvedFile)) {
|
|
1659
|
+
if (candidate === resolvedFile)
|
|
1660
|
+
continue;
|
|
1661
|
+
const relation = await buildSessionRelation(candidate, "thread", resolvedFile, header.id, entries);
|
|
1662
|
+
if (relation)
|
|
1663
|
+
threadCandidates.push(relation);
|
|
1664
|
+
}
|
|
1665
|
+
const threads = threadCandidates.toSorted((a, b) => a.updatedAt < b.updatedAt ? -1 : a.updatedAt > b.updatedAt ? 1 : 0);
|
|
1666
|
+
const threadsByEntryId = new Map();
|
|
1667
|
+
for (const thread of threads) {
|
|
1668
|
+
if (!thread.anchorEntryId)
|
|
1669
|
+
continue;
|
|
1670
|
+
const bucket = threadsByEntryId.get(thread.anchorEntryId) ?? [];
|
|
1671
|
+
bucket.push(thread);
|
|
1672
|
+
threadsByEntryId.set(thread.anchorEntryId, bucket);
|
|
1673
|
+
}
|
|
1674
|
+
const items = entries.flatMap((entry) => {
|
|
1675
|
+
const item = mapEntryToItem(entry);
|
|
1676
|
+
if (!item)
|
|
1677
|
+
return [];
|
|
1678
|
+
if (item.entryId) {
|
|
1679
|
+
const anchoredThreads = threadsByEntryId.get(item.entryId);
|
|
1680
|
+
if (anchoredThreads) {
|
|
1681
|
+
item.threads = anchoredThreads;
|
|
1682
|
+
}
|
|
1683
|
+
}
|
|
1684
|
+
return [item];
|
|
1685
|
+
});
|
|
1686
|
+
return {
|
|
1687
|
+
sessionId: header.id,
|
|
1688
|
+
fileName: basename(resolvedFile),
|
|
1689
|
+
title,
|
|
1690
|
+
createdAt: header.timestamp,
|
|
1691
|
+
updatedAt,
|
|
1692
|
+
entryCount: entries.length,
|
|
1693
|
+
items,
|
|
1694
|
+
parent: parent ?? undefined,
|
|
1695
|
+
threads,
|
|
1696
|
+
};
|
|
1697
|
+
}
|
|
1698
|
+
async function resolveRequestedSessionFile(baseSessionFile, requestedFileName) {
|
|
1699
|
+
const resolvedBase = resolve(baseSessionFile);
|
|
1700
|
+
if (!requestedFileName)
|
|
1701
|
+
return resolvedBase;
|
|
1702
|
+
const trimmed = requestedFileName.trim();
|
|
1703
|
+
if (!trimmed)
|
|
1704
|
+
return resolvedBase;
|
|
1705
|
+
const fileName = basename(trimmed);
|
|
1706
|
+
if (fileName !== trimmed || !fileName.endsWith(".jsonl"))
|
|
1707
|
+
return null;
|
|
1708
|
+
const candidate = join(dirname(resolvedBase), fileName);
|
|
1709
|
+
if (!existsSync(candidate))
|
|
1710
|
+
return null;
|
|
1711
|
+
try {
|
|
1712
|
+
if (!SessionStore.readHeader(candidate))
|
|
1713
|
+
throw new Error("Invalid session header");
|
|
1714
|
+
}
|
|
1715
|
+
catch (err) {
|
|
1716
|
+
throw new Error(`Session file is corrupted: ${candidate}: ${err instanceof Error ? err.message : String(err)}`, { cause: err });
|
|
1717
|
+
}
|
|
1718
|
+
return candidate;
|
|
1719
|
+
}
|
|
1720
|
+
function listRelatedSessionFiles(sessionFile) {
|
|
1721
|
+
const dir = dirname(sessionFile);
|
|
1722
|
+
if (!existsSync(dir))
|
|
1723
|
+
return [];
|
|
1724
|
+
return readdirSync(dir)
|
|
1725
|
+
.filter((name) => name.endsWith(".jsonl"))
|
|
1726
|
+
.map((fileName) => join(dir, fileName));
|
|
1727
|
+
}
|
|
1728
|
+
async function buildSessionRelation(sessionFile, kind, expectedParent, expectedParentId, expectedParentEntries) {
|
|
1729
|
+
let sm;
|
|
1730
|
+
try {
|
|
1731
|
+
sm = await SessionStore.inspect(sessionFile);
|
|
1732
|
+
}
|
|
1733
|
+
catch (err) {
|
|
1734
|
+
log.logWarning(`Skipping corrupted session file while building ${kind} relation: ${sessionFile}`, err instanceof Error ? err.message : String(err));
|
|
1735
|
+
return null;
|
|
1736
|
+
}
|
|
1737
|
+
const header = sm.getHeader();
|
|
1738
|
+
if (kind === "thread" &&
|
|
1739
|
+
!isChildThreadSession(sessionFile, header.parentSession, expectedParent, expectedParentId, header.parentSessionId)) {
|
|
1740
|
+
return null;
|
|
1741
|
+
}
|
|
1742
|
+
const entries = await sm.getEntries();
|
|
1743
|
+
const updatedAt = entryIsoTime(entries.at(-1)) ?? header.timestamp;
|
|
1744
|
+
const threadId = kind === "thread" ? getFixedThreadSessionId(sessionFile) : null;
|
|
1745
|
+
const anchorEntryId = kind === "thread" && expectedParent
|
|
1746
|
+
? findThreadAnchorEntryId(expectedParentEntries ??
|
|
1747
|
+
(await (await SessionStore.inspect(expectedParent)).getEntries()), entries, threadId)
|
|
1748
|
+
: undefined;
|
|
1749
|
+
return {
|
|
1750
|
+
kind,
|
|
1751
|
+
fileName: basename(sessionFile),
|
|
1752
|
+
sessionId: header.id,
|
|
1753
|
+
title: (await sm.getSessionName()) || `Session ${header.id.slice(0, 8)}`,
|
|
1754
|
+
updatedAt,
|
|
1755
|
+
entryCount: entries.length,
|
|
1756
|
+
summary: extractSessionSummary(entries),
|
|
1757
|
+
anchorEntryId,
|
|
1758
|
+
};
|
|
1759
|
+
}
|
|
1760
|
+
async function resolveParentRelation(sessionFile, header) {
|
|
1761
|
+
if (header.parentSession) {
|
|
1762
|
+
const parentPath = resolve(header.parentSession);
|
|
1763
|
+
if (existsSync(parentPath)) {
|
|
1764
|
+
return (await buildSessionRelation(parentPath, "parent")) ?? undefined;
|
|
1765
|
+
}
|
|
1766
|
+
// Path is stale — try UUID fallback before heuristic.
|
|
1767
|
+
if (header.parentSessionId) {
|
|
1768
|
+
const found = findSessionFileById(dirname(sessionFile), header.parentSessionId);
|
|
1769
|
+
if (found)
|
|
1770
|
+
return (await buildSessionRelation(found, "parent")) ?? undefined;
|
|
1771
|
+
}
|
|
1772
|
+
}
|
|
1773
|
+
return buildInferredThreadParentRelation(sessionFile);
|
|
1774
|
+
}
|
|
1775
|
+
function findSessionFileById(sessionDir, targetId) {
|
|
1776
|
+
if (!existsSync(sessionDir))
|
|
1777
|
+
return null;
|
|
1778
|
+
for (const name of readdirSync(sessionDir)) {
|
|
1779
|
+
if (!name.endsWith(".jsonl"))
|
|
1780
|
+
continue;
|
|
1781
|
+
try {
|
|
1782
|
+
const filePath = join(sessionDir, name);
|
|
1783
|
+
if (SessionStore.readHeader(filePath)?.id === targetId)
|
|
1784
|
+
return filePath;
|
|
1785
|
+
}
|
|
1786
|
+
catch {
|
|
1787
|
+
continue;
|
|
1788
|
+
}
|
|
1789
|
+
}
|
|
1790
|
+
return null;
|
|
1791
|
+
}
|
|
1792
|
+
async function buildInferredThreadParentRelation(sessionFile) {
|
|
1793
|
+
if (!getFixedThreadSessionId(sessionFile))
|
|
1794
|
+
return undefined;
|
|
1795
|
+
const parentSession = resolveChannelSessionFile(dirname(dirname(sessionFile)));
|
|
1796
|
+
if (!parentSession || parentSession === sessionFile)
|
|
1797
|
+
return undefined;
|
|
1798
|
+
return (await buildSessionRelation(parentSession, "parent")) ?? undefined;
|
|
1799
|
+
}
|
|
1800
|
+
function isChildThreadSession(sessionFile, parentSession, expectedParent, expectedParentId, threadParentSessionId) {
|
|
1801
|
+
if (!expectedParent)
|
|
1802
|
+
return false;
|
|
1803
|
+
if (parentSession) {
|
|
1804
|
+
const resolvedParent = resolve(parentSession);
|
|
1805
|
+
if (resolvedParent === expectedParent ||
|
|
1806
|
+
(isPlatformHistorySession(expectedParent) && isPlatformHistorySession(resolvedParent))) {
|
|
1807
|
+
return true;
|
|
1808
|
+
}
|
|
1809
|
+
// Path is stale — fall back to UUID comparison.
|
|
1810
|
+
if (expectedParentId && threadParentSessionId) {
|
|
1811
|
+
return threadParentSessionId === expectedParentId;
|
|
1812
|
+
}
|
|
1813
|
+
return false;
|
|
1814
|
+
}
|
|
1815
|
+
if (!getFixedThreadSessionId(sessionFile))
|
|
1816
|
+
return false;
|
|
1817
|
+
return resolveChannelSessionFile(dirname(dirname(sessionFile))) === expectedParent;
|
|
1818
|
+
}
|
|
1819
|
+
function getFixedThreadSessionId(sessionFile) {
|
|
1820
|
+
const fileName = basename(sessionFile);
|
|
1821
|
+
if (!fileName.endsWith(".jsonl"))
|
|
1822
|
+
return null;
|
|
1823
|
+
if (/^\d{4}-\d{2}-\d{2}T.+_[0-9a-f]{8}\.jsonl$/i.test(fileName))
|
|
1824
|
+
return null;
|
|
1825
|
+
return fileName.slice(0, -".jsonl".length);
|
|
1826
|
+
}
|
|
1827
|
+
function findThreadAnchorEntryId(parentEntries, childEntries, threadId) {
|
|
1828
|
+
const threadTimestamp = threadId ? Number(threadId) * 1000 : undefined;
|
|
1829
|
+
if (threadTimestamp !== undefined && Number.isFinite(threadTimestamp)) {
|
|
1830
|
+
const timestampAnchor = findEntryIdByMessageTimestamp(parentEntries, threadTimestamp);
|
|
1831
|
+
if (timestampAnchor)
|
|
1832
|
+
return timestampAnchor;
|
|
1833
|
+
}
|
|
1834
|
+
let sharedCount = 0;
|
|
1835
|
+
while (sharedCount < parentEntries.length &&
|
|
1836
|
+
sharedCount < childEntries.length &&
|
|
1837
|
+
parentEntries[sharedCount]?.id === childEntries[sharedCount]?.id) {
|
|
1838
|
+
sharedCount += 1;
|
|
1839
|
+
}
|
|
1840
|
+
if (sharedCount > 0) {
|
|
1841
|
+
return parentEntries[sharedCount - 1]?.id;
|
|
1842
|
+
}
|
|
1843
|
+
const contentAnchor = findSharedContentAnchorEntryId(parentEntries, childEntries);
|
|
1844
|
+
if (contentAnchor)
|
|
1845
|
+
return contentAnchor;
|
|
1846
|
+
const childRoot = findComparableUserMessage(childEntries);
|
|
1847
|
+
if (!childRoot)
|
|
1848
|
+
return undefined;
|
|
1849
|
+
return findParentAnchorByRootMessage(parentEntries, childRoot);
|
|
1850
|
+
}
|
|
1851
|
+
function findEntryIdByMessageTimestamp(entries, timestamp) {
|
|
1852
|
+
for (const entry of entries) {
|
|
1853
|
+
if (entry.type !== "message")
|
|
1854
|
+
continue;
|
|
1855
|
+
const messageTimestamp = entry.message.timestamp;
|
|
1856
|
+
if (messageTimestamp === timestamp)
|
|
1857
|
+
return entry.id;
|
|
1858
|
+
}
|
|
1859
|
+
return undefined;
|
|
1860
|
+
}
|
|
1861
|
+
function findSharedContentAnchorEntryId(parentEntries, childEntries) {
|
|
1862
|
+
const parentMessages = parentEntries.flatMap((entry) => {
|
|
1863
|
+
const comparable = getComparableSessionMessage(entry);
|
|
1864
|
+
return comparable ? [comparable] : [];
|
|
1865
|
+
});
|
|
1866
|
+
const childMessages = childEntries.flatMap((entry) => {
|
|
1867
|
+
const comparable = getComparableSessionMessage(entry);
|
|
1868
|
+
return comparable ? [comparable] : [];
|
|
1869
|
+
});
|
|
1870
|
+
if (parentMessages.length === 0 || childMessages.length === 0)
|
|
1871
|
+
return undefined;
|
|
1872
|
+
let bestParentEnd = -1;
|
|
1873
|
+
let bestLength = 0;
|
|
1874
|
+
for (let parentStart = 0; parentStart < parentMessages.length; parentStart++) {
|
|
1875
|
+
let length = 0;
|
|
1876
|
+
while (parentStart + length < parentMessages.length && length < childMessages.length) {
|
|
1877
|
+
const parentMessage = parentMessages[parentStart + length];
|
|
1878
|
+
const childMessage = childMessages[length];
|
|
1879
|
+
if (parentMessage === undefined ||
|
|
1880
|
+
childMessage === undefined ||
|
|
1881
|
+
parentMessage.role !== childMessage.role ||
|
|
1882
|
+
parentMessage.normalizedText !== childMessage.normalizedText) {
|
|
1883
|
+
break;
|
|
1884
|
+
}
|
|
1885
|
+
length += 1;
|
|
1886
|
+
}
|
|
1887
|
+
if (length > bestLength) {
|
|
1888
|
+
bestLength = length;
|
|
1889
|
+
bestParentEnd = parentStart + length - 1;
|
|
1890
|
+
}
|
|
1891
|
+
}
|
|
1892
|
+
return bestLength > 0 ? parentMessages[bestParentEnd]?.entryId : undefined;
|
|
1893
|
+
}
|
|
1894
|
+
function getComparableSessionMessage(entry) {
|
|
1895
|
+
if (entry.type !== "message")
|
|
1896
|
+
return null;
|
|
1897
|
+
const role = entry.message.role;
|
|
1898
|
+
if (role !== "user" && role !== "assistant")
|
|
1899
|
+
return null;
|
|
1900
|
+
const body = contentToText(entry.message.content);
|
|
1901
|
+
const normalizedText = normalizeComparableSessionText(body, role);
|
|
1902
|
+
if (!normalizedText)
|
|
1903
|
+
return null;
|
|
1904
|
+
return { entryId: entry.id, role, normalizedText };
|
|
1905
|
+
}
|
|
1906
|
+
function normalizeComparableSessionText(text, role) {
|
|
1907
|
+
const normalized = role === "user" ? normalizeComparableUserText(text) : text.trim();
|
|
1908
|
+
return normalized.replace(/\s+/g, " ").trim();
|
|
1909
|
+
}
|
|
1910
|
+
function findParentAnchorByRootMessage(parentEntries, childRoot) {
|
|
1911
|
+
let textMatchId;
|
|
1912
|
+
for (const entry of parentEntries) {
|
|
1913
|
+
const comparable = getComparableUserMessage(entry);
|
|
1914
|
+
if (!comparable)
|
|
1915
|
+
continue;
|
|
1916
|
+
if (comparable.normalizedText !== childRoot.normalizedText)
|
|
1917
|
+
continue;
|
|
1918
|
+
if (childRoot.messageTimestamp !== undefined &&
|
|
1919
|
+
comparable.messageTimestamp !== undefined &&
|
|
1920
|
+
comparable.messageTimestamp === childRoot.messageTimestamp) {
|
|
1921
|
+
return entry.id;
|
|
1922
|
+
}
|
|
1923
|
+
textMatchId ??= entry.id;
|
|
1924
|
+
}
|
|
1925
|
+
return textMatchId;
|
|
1926
|
+
}
|
|
1927
|
+
function findComparableUserMessage(entries) {
|
|
1928
|
+
for (const entry of entries) {
|
|
1929
|
+
const comparable = getComparableUserMessage(entry);
|
|
1930
|
+
if (comparable)
|
|
1931
|
+
return comparable;
|
|
1932
|
+
}
|
|
1933
|
+
return null;
|
|
1934
|
+
}
|
|
1935
|
+
function getComparableUserMessage(entry) {
|
|
1936
|
+
if (entry.type !== "message" || entry.message.role !== "user")
|
|
1937
|
+
return null;
|
|
1938
|
+
const body = contentToText(entry.message.content);
|
|
1939
|
+
const normalizedText = normalizeComparableUserText(body);
|
|
1940
|
+
if (!normalizedText)
|
|
1941
|
+
return null;
|
|
1942
|
+
const messageTimestamp = typeof entry.message.timestamp === "number" ? entry.message.timestamp : undefined;
|
|
1943
|
+
return { normalizedText, messageTimestamp };
|
|
1944
|
+
}
|
|
1945
|
+
function normalizeComparableUserText(text) {
|
|
1946
|
+
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)/, "");
|
|
1947
|
+
return withoutTimestamp
|
|
1948
|
+
.replace(/\n*<slack_attachments>\n[\s\S]*?\n<\/slack_attachments>\s*$/g, "")
|
|
1949
|
+
.trim();
|
|
1950
|
+
}
|
|
1951
|
+
function extractSessionSummary(entries) {
|
|
1952
|
+
for (const entry of entries) {
|
|
1953
|
+
if (entry.type !== "message")
|
|
1954
|
+
continue;
|
|
1955
|
+
const item = mapEntryToItem(entry);
|
|
1956
|
+
if (!item?.body)
|
|
1957
|
+
continue;
|
|
1958
|
+
return collapseSummary(item.body);
|
|
1959
|
+
}
|
|
1960
|
+
return undefined;
|
|
1961
|
+
}
|
|
1962
|
+
function collapseSummary(text) {
|
|
1963
|
+
const singleLine = text.replace(/\s+/g, " ").trim();
|
|
1964
|
+
return singleLine.length > 96 ? `${singleLine.slice(0, 93)}…` : singleLine;
|
|
1965
|
+
}
|
|
1966
|
+
function mapEntryToItem(entry) {
|
|
1967
|
+
switch (entry.type) {
|
|
1968
|
+
case "message":
|
|
1969
|
+
return mapMessageEntry(entry);
|
|
1970
|
+
case "compaction":
|
|
1971
|
+
return mapCompactionEntry(entry);
|
|
1972
|
+
case "branch_summary":
|
|
1973
|
+
return mapSessionSummaryEntry(entry);
|
|
1974
|
+
case "custom":
|
|
1975
|
+
return {
|
|
1976
|
+
kind: "system",
|
|
1977
|
+
title: `Custom data · ${entry.customType}`,
|
|
1978
|
+
body: entry.data === undefined ? "(no data)" : JSON.stringify(entry.data, null, 2),
|
|
1979
|
+
meta: entryIsoTime(entry) ?? "",
|
|
1980
|
+
tone: "muted",
|
|
1981
|
+
};
|
|
1982
|
+
default:
|
|
1983
|
+
return null;
|
|
1984
|
+
}
|
|
1985
|
+
}
|
|
1986
|
+
function mapMessageEntry(entry) {
|
|
1987
|
+
const message = entry.message;
|
|
1988
|
+
switch (message.role) {
|
|
1989
|
+
case "user":
|
|
1990
|
+
return {
|
|
1991
|
+
kind: "user",
|
|
1992
|
+
title: "User",
|
|
1993
|
+
body: contentToText(message.content),
|
|
1994
|
+
meta: entryIsoTime(entry) ?? "",
|
|
1995
|
+
entryId: entry.id,
|
|
1996
|
+
};
|
|
1997
|
+
case "assistant": {
|
|
1998
|
+
const assistantBody = contentToText(message.content) || (message.errorMessage ? `_${message.errorMessage}_` : "");
|
|
1999
|
+
const metaParts = [message.provider, message.model, message.stopReason].filter(Boolean);
|
|
2000
|
+
return {
|
|
2001
|
+
kind: "assistant",
|
|
2002
|
+
title: "Assistant",
|
|
2003
|
+
body: assistantBody,
|
|
2004
|
+
meta: metaParts.length > 0
|
|
2005
|
+
? `${entryIsoTime(entry) ?? ""} · ${metaParts.join(" · ")}`
|
|
2006
|
+
: (entryIsoTime(entry) ?? ""),
|
|
2007
|
+
entryId: entry.id,
|
|
2008
|
+
};
|
|
2009
|
+
}
|
|
2010
|
+
case "toolResult":
|
|
2011
|
+
return {
|
|
2012
|
+
kind: "tool",
|
|
2013
|
+
title: `Tool result · ${String(message.toolName ?? "unknown")}`,
|
|
2014
|
+
body: contentToText(message.content),
|
|
2015
|
+
meta: entryIsoTime(entry) ?? "",
|
|
2016
|
+
tone: message.isError ? "err" : "ok",
|
|
2017
|
+
entryId: entry.id,
|
|
2018
|
+
};
|
|
2019
|
+
case "bashExecution": {
|
|
2020
|
+
const command = String(message.command ?? "").trim();
|
|
2021
|
+
const output = String(message.output ?? "").trim();
|
|
2022
|
+
const details = [
|
|
2023
|
+
typeof message.exitCode === "number" ? `[exitCode] ${message.exitCode}` : "",
|
|
2024
|
+
message.cancelled ? `[cancelled] true` : "",
|
|
2025
|
+
message.truncated ? `[truncated] true` : "",
|
|
2026
|
+
].filter(Boolean);
|
|
2027
|
+
const body = [command ? `$ ${command}` : "", output, ...details].filter(Boolean).join("\n\n");
|
|
2028
|
+
return {
|
|
2029
|
+
kind: "tool",
|
|
2030
|
+
title: "Bash execution",
|
|
2031
|
+
body: body || "(no output)",
|
|
2032
|
+
meta: entryIsoTime(entry) ?? "",
|
|
2033
|
+
entryId: entry.id,
|
|
2034
|
+
};
|
|
2035
|
+
}
|
|
2036
|
+
case "custom":
|
|
2037
|
+
return {
|
|
2038
|
+
kind: "system",
|
|
2039
|
+
title: `Custom message · ${String(message.customType ?? "custom")}`,
|
|
2040
|
+
body: contentToText(message.content),
|
|
2041
|
+
meta: entryIsoTime(entry) ?? "",
|
|
2042
|
+
tone: "muted",
|
|
2043
|
+
entryId: entry.id,
|
|
2044
|
+
};
|
|
2045
|
+
case "branchSummary":
|
|
2046
|
+
return {
|
|
2047
|
+
kind: "system",
|
|
2048
|
+
title: "Session summary",
|
|
2049
|
+
body: String(message.summary ?? ""),
|
|
2050
|
+
meta: entryIsoTime(entry) ?? "",
|
|
2051
|
+
tone: "muted",
|
|
2052
|
+
entryId: entry.id,
|
|
2053
|
+
};
|
|
2054
|
+
case "compactionSummary":
|
|
2055
|
+
return {
|
|
2056
|
+
kind: "system",
|
|
2057
|
+
title: "Compaction summary",
|
|
2058
|
+
body: String(message.summary ?? ""),
|
|
2059
|
+
meta: entryIsoTime(entry) ?? "",
|
|
2060
|
+
tone: "muted",
|
|
2061
|
+
entryId: entry.id,
|
|
2062
|
+
};
|
|
2063
|
+
default:
|
|
2064
|
+
return {
|
|
2065
|
+
kind: "system",
|
|
2066
|
+
title: `Message · ${String(message.role ?? "unknown")}`,
|
|
2067
|
+
body: contentToText(message.content),
|
|
2068
|
+
meta: entryIsoTime(entry) ?? "",
|
|
2069
|
+
tone: "muted",
|
|
2070
|
+
entryId: entry.id,
|
|
2071
|
+
};
|
|
2072
|
+
}
|
|
2073
|
+
}
|
|
2074
|
+
function mapCompactionEntry(entry) {
|
|
2075
|
+
return {
|
|
2076
|
+
kind: "system",
|
|
2077
|
+
title: "Context compacted",
|
|
2078
|
+
body: entry.summary,
|
|
2079
|
+
meta: `${entryIsoTime(entry) ?? ""} · ${entry.tokensBefore} tokens before compaction`,
|
|
2080
|
+
tone: "muted",
|
|
2081
|
+
};
|
|
2082
|
+
}
|
|
2083
|
+
function mapSessionSummaryEntry(entry) {
|
|
2084
|
+
return {
|
|
2085
|
+
kind: "system",
|
|
2086
|
+
title: "Session summary",
|
|
2087
|
+
body: entry.summary,
|
|
2088
|
+
meta: entryIsoTime(entry) ?? "",
|
|
2089
|
+
tone: "muted",
|
|
2090
|
+
};
|
|
2091
|
+
}
|
|
2092
|
+
function contentToText(content) {
|
|
2093
|
+
if (typeof content === "string")
|
|
2094
|
+
return content;
|
|
2095
|
+
if (!Array.isArray(content))
|
|
2096
|
+
return "";
|
|
2097
|
+
const lines = [];
|
|
2098
|
+
for (const block of content) {
|
|
2099
|
+
if (!block || typeof block !== "object")
|
|
2100
|
+
continue;
|
|
2101
|
+
const value = block;
|
|
2102
|
+
if (value.type === "text" && typeof value.text === "string") {
|
|
2103
|
+
lines.push(value.text);
|
|
2104
|
+
continue;
|
|
2105
|
+
}
|
|
2106
|
+
if (value.type === "thinking" && typeof value.thinking === "string") {
|
|
2107
|
+
lines.push(`[thinking]\n${value.thinking}`);
|
|
2108
|
+
continue;
|
|
2109
|
+
}
|
|
2110
|
+
if (value.type === "toolCall") {
|
|
2111
|
+
const name = typeof value.name === "string" ? value.name : "tool";
|
|
2112
|
+
const args = value.arguments === undefined ? "" : JSON.stringify(value.arguments, null, 2);
|
|
2113
|
+
lines.push([`[toolCall] ${name}`, args].filter(Boolean).join("\n"));
|
|
2114
|
+
continue;
|
|
2115
|
+
}
|
|
2116
|
+
if (value.type === "image") {
|
|
2117
|
+
lines.push(`[image ${String(value.mimeType ?? "unknown")}]`);
|
|
2118
|
+
}
|
|
2119
|
+
}
|
|
2120
|
+
return lines.join("\n\n");
|
|
2121
|
+
}
|
|
1651
2122
|
//# sourceMappingURL=portal.js.map
|