@geminixiang/mikan 1.0.0-beta.6 → 1.0.0-beta.60
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 +926 -0
- package/README.md +95 -37
- package/dist/adapter.d.ts +11 -1
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +18 -1
- package/dist/adapter.js.map +1 -1
- 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 +38 -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 +148 -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 +218 -252
- 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 +63 -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 +7 -0
- 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/intake.d.ts +16 -5
- package/dist/adapters/intake.d.ts.map +1 -1
- package/dist/adapters/intake.js +86 -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/adapters/progressive-renderer.d.ts +7 -0
- package/dist/adapters/progressive-renderer.d.ts.map +1 -0
- package/dist/adapters/progressive-renderer.js +439 -0
- package/dist/adapters/progressive-renderer.js.map +1 -0
- package/dist/adapters/shared.d.ts +35 -11
- package/dist/adapters/shared.d.ts.map +1 -1
- package/dist/adapters/shared.js +105 -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/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 +116 -18
- package/dist/adapters/slack/bot.d.ts.map +1 -1
- package/dist/adapters/slack/bot.js +760 -468
- 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/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/response-lifecycle.d.ts.map +1 -1
- package/dist/adapters/slack/response-lifecycle.js +240 -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/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 +129 -198
- 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 +52 -190
- package/dist/adapters/telegram/context.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 +3284 -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 +50 -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 +11 -8
- package/dist/adapters/web/server.d.ts.map +1 -0
- package/dist/{web → adapters/web}/server.js +16 -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 +632 -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 +83 -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/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/config.d.ts +38 -39
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +256 -215
- package/dist/config.js.map +1 -1
- 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 +32 -0
- package/dist/env-manifest.d.ts.map +1 -0
- package/dist/env-manifest.js +244 -0
- package/dist/env-manifest.js.map +1 -0
- package/dist/events/index.d.ts +150 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +249 -0
- package/dist/events/index.js.map +1 -0
- package/dist/{events.d.ts → events/watcher.d.ts} +4 -4
- package/dist/events/watcher.d.ts.map +1 -0
- package/dist/{events.js → events/watcher.js} +23 -84
- package/dist/events/watcher.js.map +1 -0
- package/dist/{utils/file-guards.d.ts → file-guards.d.ts} +9 -0
- package/dist/file-guards.d.ts.map +1 -0
- package/dist/{utils/file-guards.js → file-guards.js} +44 -1
- 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 +17 -13
- package/dist/harness/index.d.ts.map +1 -1
- package/dist/harness/index.js +10 -11
- package/dist/harness/index.js.map +1 -1
- package/dist/harness/mcp.d.ts +38 -0
- package/dist/harness/mcp.d.ts.map +1 -0
- package/dist/harness/mcp.js +306 -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 +14 -0
- package/dist/harness/open-connector.d.ts.map +1 -0
- package/dist/harness/open-connector.js +204 -0
- package/dist/harness/open-connector.js.map +1 -0
- package/dist/harness/presenter.d.ts +30 -0
- package/dist/harness/presenter.d.ts.map +1 -0
- package/dist/harness/presenter.js +804 -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 +426 -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 +505 -417
- package/dist/harness/runner.js.map +1 -1
- package/dist/harness/session.d.ts +119 -0
- package/dist/harness/session.d.ts.map +1 -0
- package/dist/harness/session.js +561 -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 +284 -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 +3 -32
- package/dist/harness/tools/event.d.ts.map +1 -0
- package/dist/harness/tools/event.js +178 -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 +38 -0
- package/dist/harness/tools/index.d.ts.map +1 -0
- package/dist/harness/tools/index.js +45 -0
- package/dist/harness/tools/index.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 +88 -0
- package/dist/harness/tools/subagent.d.ts.map +1 -0
- package/dist/harness/tools/subagent.js +681 -0
- package/dist/harness/tools/subagent.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/main.js +344 -188
- 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 +138 -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 +22 -0
- package/dist/office/projection.d.ts.map +1 -0
- package/dist/office/projection.js +208 -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/platform-messages.d.ts +1 -0
- package/dist/platform-messages.d.ts.map +1 -1
- package/dist/platform-messages.js +3 -0
- package/dist/platform-messages.js.map +1 -1
- package/dist/process-lifecycle.d.ts +19 -0
- package/dist/process-lifecycle.d.ts.map +1 -0
- package/dist/process-lifecycle.js +67 -0
- package/dist/process-lifecycle.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 +398 -149
- 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 +58 -14
- 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 +16 -6
- package/dist/sandbox/index.d.ts.map +1 -1
- package/dist/sandbox/index.js +73 -17
- package/dist/sandbox/index.js.map +1 -1
- package/dist/sandbox/provisioner.d.ts +121 -0
- package/dist/sandbox/provisioner.d.ts.map +1 -0
- package/dist/{provisioner.js → sandbox/provisioner.js} +352 -20
- 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} +234 -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 +51 -0
- package/dist/sessions/session-store.d.ts.map +1 -0
- package/dist/sessions/session-store.js +658 -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 +73 -7
- 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-mutation.d.ts +40 -0
- package/dist/settings-mutation.d.ts.map +1 -0
- package/dist/settings-mutation.js +66 -0
- package/dist/settings-mutation.js.map +1 -0
- package/dist/types.d.ts +331 -140
- 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 +77 -39
- 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/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/download.d.ts.map +0 -1
- package/dist/download.js +0 -89
- package/dist/download.js.map +0 -1
- package/dist/events.d.ts.map +0 -1
- 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 -62
- package/dist/harness/extensions/loader.d.ts.map +0 -1
- package/dist/harness/extensions/loader.js +0 -374
- 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/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.map +0 -1
- 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,32 +1,33 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { atomicWritePrivateFile } from "../utils/fs-atomic.js";
|
|
1
|
+
import { officeSessionsDir } from "../office/index.js";
|
|
2
|
+
import { SessionStore } from "./session-store.js";
|
|
3
|
+
import { join } from "node:path";
|
|
5
4
|
import * as log from "../log.js";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
5
|
+
import { isRecord, parseJsonValue, readTextFileIfExists } from "../file-guards.js";
|
|
6
|
+
import { isCommandText } from "../adapters/commands/manifest.js";
|
|
7
|
+
import { formatHistoryLine, stripHistoryLinePrefix } from "./history-line.js";
|
|
8
|
+
import { isPlatformHistorySession } from "./store.js";
|
|
9
|
+
import { isThreadSessionKey } from "./session-key.js";
|
|
10
|
+
import { archiveManagedSessionFile, createManagedSessionFile, createManagedSessionFileAtPath, extractSessionSuffix, getThreadSessionFile, openManagedSession, resolveChannelSessionFile, resolveParentSessionForThread, tryResolveCurrentSession, tryResolveThreadSession, } from "./store.js";
|
|
8
11
|
const DEFAULT_RECENT_DAYS = 14;
|
|
9
12
|
const DEFAULT_MAX_TOP_LEVEL_MESSAGES = 200;
|
|
10
13
|
const CHAT_SYNC_CUSTOM_TYPE = "mikan.chat_sync";
|
|
11
|
-
const BIWEEKLY_ROTATION_ANCHOR = new Date(2026, 0, 4); // Sunday
|
|
12
|
-
const BIWEEKLY_MS = 14 * 24 * 60 * 60 * 1000;
|
|
13
14
|
export function hasMaterializedChatSession(options) {
|
|
14
|
-
if (!options.sessionKey
|
|
15
|
+
if (!isThreadSessionKey(options.sessionKey)) {
|
|
15
16
|
return resolveChannelSessionFile(options.conversationDir) !== null;
|
|
16
17
|
}
|
|
17
18
|
return (tryResolveThreadSession(getThreadSessionFile(options.conversationDir, options.sessionKey)) !==
|
|
18
19
|
null);
|
|
19
20
|
}
|
|
20
21
|
export function registerThreadSession(options) {
|
|
21
|
-
if (!options.sessionKey
|
|
22
|
+
if (!isThreadSessionKey(options.sessionKey))
|
|
22
23
|
return null;
|
|
23
24
|
const threadFile = getThreadSessionFile(options.conversationDir, options.sessionKey);
|
|
24
25
|
return (tryResolveThreadSession(threadFile) ??
|
|
25
|
-
createManagedSessionFileAtPath(threadFile, options.cwd ?? options.conversationDir));
|
|
26
|
+
createManagedSessionFileAtPath(threadFile, options.cwd ?? options.conversationDir, resolveParentSessionForThread(options.conversationDir, extractSessionSuffix(options.sessionKey)) ?? undefined));
|
|
26
27
|
}
|
|
27
28
|
export async function waitForThreadSessionBootstrap(options) {
|
|
28
29
|
const { parentSessionKey, sessionKey, hasThreadSession, isParentRunning, sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)), pollMs = 100, } = options;
|
|
29
|
-
if (!sessionKey
|
|
30
|
+
if (!isThreadSessionKey(sessionKey))
|
|
30
31
|
return false;
|
|
31
32
|
if (sessionKey === parentSessionKey)
|
|
32
33
|
return false;
|
|
@@ -39,7 +40,13 @@ export async function waitForThreadSessionBootstrap(options) {
|
|
|
39
40
|
}
|
|
40
41
|
return waited;
|
|
41
42
|
}
|
|
42
|
-
|
|
43
|
+
/**
|
|
44
|
+
* Syncs the platform chat transcript (log.jsonl) into managed session files:
|
|
45
|
+
* resolves which session file a message belongs to (top-level vs thread,
|
|
46
|
+
* with biweekly rotation), bootstraps new sessions from recent history, and
|
|
47
|
+
* incrementally appends log messages the session does not yet represent.
|
|
48
|
+
*/
|
|
49
|
+
export class ChatHistorySync {
|
|
43
50
|
constructor(options = {}) {
|
|
44
51
|
this.recentDays = options.recentDays ?? DEFAULT_RECENT_DAYS;
|
|
45
52
|
this.maxTopLevelMessages = options.maxTopLevelMessages ?? DEFAULT_MAX_TOP_LEVEL_MESSAGES;
|
|
@@ -47,14 +54,13 @@ export class AgentMemoryFileManager {
|
|
|
47
54
|
}
|
|
48
55
|
async resolveSessionScope(options) {
|
|
49
56
|
const cwd = options.cwd ?? options.conversationDir;
|
|
50
|
-
const sessionDir =
|
|
51
|
-
if (!options.sessionKey
|
|
52
|
-
const contextFile = this.resolveTopLevelSessionFile({
|
|
57
|
+
const sessionDir = officeSessionsDir(options.conversationDir);
|
|
58
|
+
if (!isThreadSessionKey(options.sessionKey)) {
|
|
59
|
+
const contextFile = await this.resolveTopLevelSessionFile({
|
|
53
60
|
conversationDir: options.conversationDir,
|
|
54
61
|
sessionDir,
|
|
55
62
|
cwd,
|
|
56
63
|
currentMessageId: options.currentMessageId,
|
|
57
|
-
rotateTopLevelSession: options.rotateTopLevelSession === true,
|
|
58
64
|
});
|
|
59
65
|
return { sessionDir, contextFile, threadRootMessage: null };
|
|
60
66
|
}
|
|
@@ -66,32 +72,49 @@ export class AgentMemoryFileManager {
|
|
|
66
72
|
currentMessageId: options.currentMessageId,
|
|
67
73
|
});
|
|
68
74
|
}
|
|
69
|
-
syncSessionManager(options) {
|
|
75
|
+
async syncSessionManager(options) {
|
|
70
76
|
const records = readConversationLog(options.conversationDir);
|
|
71
|
-
syncSessionManagerFromLog(options.sessionManager, selectExistingSessionSyncMessages(records, {
|
|
72
|
-
sessionKey: options.sessionKey
|
|
77
|
+
return syncSessionManagerFromLog(options.sessionManager, selectExistingSessionSyncMessages(records, {
|
|
78
|
+
sessionKey: isThreadSessionKey(options.sessionKey) ? options.sessionKey : null,
|
|
73
79
|
excludeMessageId: options.currentMessageId,
|
|
74
|
-
}),
|
|
80
|
+
}), {
|
|
81
|
+
recentDays: this.recentDays,
|
|
82
|
+
maxMessages: this.maxTopLevelMessages,
|
|
83
|
+
now: this.now(),
|
|
84
|
+
});
|
|
75
85
|
}
|
|
76
|
-
resetSession(options) {
|
|
86
|
+
async resetSession(options) {
|
|
77
87
|
const cwd = options.cwd ?? options.conversationDir;
|
|
78
|
-
|
|
79
|
-
|
|
88
|
+
const sessionFile = isThreadSessionKey(options.sessionKey)
|
|
89
|
+
? resetThreadSessionFile(options.conversationDir, options.sessionKey, cwd)
|
|
90
|
+
: createManagedSessionFile(officeSessionsDir(options.conversationDir), cwd);
|
|
91
|
+
const records = readConversationLog(options.conversationDir);
|
|
92
|
+
const lastMessageId = latestSyncMessageId(records, {
|
|
93
|
+
sessionKey: isThreadSessionKey(options.sessionKey) ? options.sessionKey : null,
|
|
94
|
+
});
|
|
95
|
+
const sessionManager = await openManagedSession(sessionFile, cwd);
|
|
96
|
+
try {
|
|
97
|
+
await sessionManager.appendCustomEntry(CHAT_SYNC_CUSTOM_TYPE, {
|
|
98
|
+
source: "log.jsonl",
|
|
99
|
+
messageCount: 0,
|
|
100
|
+
resetAt: this.now().toISOString(),
|
|
101
|
+
...(lastMessageId ? { lastMessageId } : {}),
|
|
102
|
+
});
|
|
80
103
|
}
|
|
81
|
-
|
|
104
|
+
finally {
|
|
105
|
+
await sessionManager.close();
|
|
106
|
+
}
|
|
107
|
+
return sessionFile;
|
|
82
108
|
}
|
|
83
|
-
resolveTopLevelSessionFile(options) {
|
|
84
|
-
|
|
109
|
+
async resolveTopLevelSessionFile(options) {
|
|
110
|
+
// Materialization only: an existing session is returned as-is. The
|
|
111
|
+
// runtime performs the one incremental log sync per event through the
|
|
112
|
+
// runner, after the writer is created — syncing here too made every
|
|
113
|
+
// cache-miss event run the pipeline twice.
|
|
85
114
|
const existing = tryResolveCurrentSession(options.sessionDir);
|
|
86
|
-
if (existing && !isPlatformHistorySession(existing))
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
sessionKey: null,
|
|
90
|
-
excludeMessageId: options.currentMessageId,
|
|
91
|
-
}), this.historyWindow());
|
|
92
|
-
return existing;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
115
|
+
if (existing && !isPlatformHistorySession(existing))
|
|
116
|
+
return existing;
|
|
117
|
+
const records = readConversationLog(options.conversationDir);
|
|
95
118
|
const sessionFile = createManagedSessionFile(options.sessionDir, options.cwd);
|
|
96
119
|
const bootstrapRecords = selectRecentTopLevelMessages(records, {
|
|
97
120
|
recentDays: this.recentDays,
|
|
@@ -99,119 +122,81 @@ export class AgentMemoryFileManager {
|
|
|
99
122
|
now: this.now(),
|
|
100
123
|
excludeMessageId: options.currentMessageId,
|
|
101
124
|
});
|
|
102
|
-
bootstrapSessionFromLog(sessionFile, options.cwd, bootstrapRecords, latestSyncMessageId(records, {
|
|
125
|
+
await bootstrapSessionFromLog(sessionFile, options.cwd, bootstrapRecords, latestSyncMessageId(records, {
|
|
103
126
|
sessionKey: null,
|
|
104
127
|
excludeMessageId: options.currentMessageId,
|
|
105
128
|
}));
|
|
106
129
|
return sessionFile;
|
|
107
130
|
}
|
|
108
|
-
|
|
109
|
-
return { recentDays: this.recentDays, maxMessages: this.maxTopLevelMessages, now: this.now() };
|
|
110
|
-
}
|
|
111
|
-
resolveThreadSessionScope(options) {
|
|
131
|
+
async resolveThreadSessionScope(options) {
|
|
112
132
|
const threadFile = getThreadSessionFile(options.conversationDir, options.sessionKey);
|
|
113
133
|
const threadId = extractSessionSuffix(options.sessionKey);
|
|
114
134
|
const records = readConversationLog(options.conversationDir);
|
|
115
135
|
const threadRootMessage = buildThreadRootSeed(findLogRecordById(records, threadId)?.message);
|
|
116
136
|
const existing = tryResolveThreadSession(threadFile);
|
|
117
137
|
if (existing) {
|
|
118
|
-
|
|
119
|
-
sessionKey: options.sessionKey,
|
|
120
|
-
excludeMessageId: options.currentMessageId,
|
|
121
|
-
}), this.historyWindow());
|
|
138
|
+
// Materialization only; the runtime owns the per-event incremental sync.
|
|
122
139
|
return { sessionDir: options.sessionDir, contextFile: existing, threadRootMessage };
|
|
123
140
|
}
|
|
124
|
-
createManagedSessionFileAtPath(threadFile, options.cwd);
|
|
141
|
+
createManagedSessionFileAtPath(threadFile, options.cwd, resolveParentSessionForThread(options.conversationDir, threadId) ?? undefined);
|
|
125
142
|
const bootstrapRecords = selectThreadBootstrapMessages(records, threadId, {
|
|
126
143
|
recentDays: this.recentDays,
|
|
127
144
|
maxTopLevelMessages: this.maxTopLevelMessages,
|
|
128
145
|
now: this.now(),
|
|
129
146
|
excludeMessageId: options.currentMessageId,
|
|
130
147
|
});
|
|
131
|
-
bootstrapSessionFromLog(threadFile, options.cwd, bootstrapRecords, latestSyncMessageId(records, {
|
|
148
|
+
await bootstrapSessionFromLog(threadFile, options.cwd, bootstrapRecords, latestSyncMessageId(records, {
|
|
132
149
|
sessionKey: options.sessionKey,
|
|
133
150
|
excludeMessageId: options.currentMessageId,
|
|
134
151
|
}));
|
|
135
152
|
return { sessionDir: options.sessionDir, contextFile: threadFile, threadRootMessage };
|
|
136
153
|
}
|
|
137
154
|
}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
}
|
|
142
|
-
function readSessionTimestamp(sessionFile) {
|
|
143
|
-
const raw = readTextFileIfExists(sessionFile);
|
|
144
|
-
if (raw === undefined)
|
|
145
|
-
return null;
|
|
146
|
-
const firstLine = raw.split("\n").find((line) => line.trim());
|
|
147
|
-
if (!firstLine)
|
|
148
|
-
return null;
|
|
155
|
+
/** The recorded parent of an existing thread session, kept across a reset. */
|
|
156
|
+
function existingThreadParent(threadFile) {
|
|
157
|
+
let header;
|
|
149
158
|
try {
|
|
150
|
-
|
|
151
|
-
if (typeof header.timestamp !== "string")
|
|
152
|
-
return null;
|
|
153
|
-
const date = new Date(header.timestamp);
|
|
154
|
-
return Number.isFinite(date.getTime()) ? date : null;
|
|
159
|
+
header = SessionStore.readHeader(threadFile);
|
|
155
160
|
}
|
|
156
161
|
catch {
|
|
157
|
-
return
|
|
162
|
+
return undefined; // File missing or corrupted — the session is recreated.
|
|
158
163
|
}
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
const logFile = join(conversationDir, "log.jsonl");
|
|
170
|
-
const raw = readTextFileIfExists(logFile);
|
|
171
|
-
if (raw === undefined)
|
|
172
|
-
return [];
|
|
173
|
-
const lines = raw.trim().split("\n").filter(Boolean);
|
|
174
|
-
const records = [];
|
|
175
|
-
for (let i = 0; i < lines.length; i++) {
|
|
176
|
-
try {
|
|
177
|
-
const message = parseJsonValue(lines[i], (value) => isRecord(value), (detail) => (detail === "unexpected JSON shape" ? "expected a JSON object" : detail));
|
|
178
|
-
records.push({ message, index: i });
|
|
179
|
-
}
|
|
180
|
-
catch (err) {
|
|
181
|
-
log.logWarning(`Skipping malformed log entry at ${logFile}:${i + 1}`, err instanceof Error ? err.message : String(err));
|
|
182
|
-
}
|
|
164
|
+
const path = header?.parentSession;
|
|
165
|
+
if (!header || !path)
|
|
166
|
+
return undefined;
|
|
167
|
+
// Prefer the stored UUID; legacy sessions without it need the parent file.
|
|
168
|
+
const id = header.parentSessionId ?? readParentSessionId(path);
|
|
169
|
+
return id ? { path, id } : undefined;
|
|
170
|
+
}
|
|
171
|
+
function readParentSessionId(parentPath) {
|
|
172
|
+
try {
|
|
173
|
+
return SessionStore.readHeader(parentPath)?.id;
|
|
183
174
|
}
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
function coalesceMessagingBotLogChunks(records) {
|
|
187
|
-
const coalesced = [];
|
|
188
|
-
for (const record of records) {
|
|
189
|
-
const previous = coalesced.at(-1);
|
|
190
|
-
if (previous && canCoalesceMessagingBotLogChunk(previous.message, record.message)) {
|
|
191
|
-
previous.message.text = `${previous.message.text ?? ""}${record.message.text ?? ""}`;
|
|
192
|
-
continue;
|
|
193
|
-
}
|
|
194
|
-
coalesced.push({ ...record, message: { ...record.message } });
|
|
175
|
+
catch {
|
|
176
|
+
return undefined;
|
|
195
177
|
}
|
|
196
|
-
return coalesced;
|
|
197
178
|
}
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
179
|
+
/**
|
|
180
|
+
* Archive a thread session and create its replacement, preserving lineage:
|
|
181
|
+
* the original parent is kept rather than re-bound to the current session.
|
|
182
|
+
*/
|
|
183
|
+
function resetThreadSessionFile(conversationDir, sessionKey, cwd) {
|
|
184
|
+
const threadFile = getThreadSessionFile(conversationDir, sessionKey);
|
|
185
|
+
const parent = existingThreadParent(threadFile) ??
|
|
186
|
+
resolveParentSessionForThread(conversationDir, extractSessionSuffix(sessionKey)) ??
|
|
187
|
+
undefined;
|
|
188
|
+
archiveManagedSessionFile(threadFile);
|
|
189
|
+
return createManagedSessionFileAtPath(threadFile, cwd, parent);
|
|
205
190
|
}
|
|
206
191
|
function findLogRecordById(records, messageId) {
|
|
207
192
|
for (let i = records.length - 1; i >= 0; i--) {
|
|
208
|
-
if (records[i]
|
|
193
|
+
if (records[i]?.message.ts === messageId)
|
|
209
194
|
return records[i];
|
|
210
195
|
}
|
|
211
196
|
return undefined;
|
|
212
197
|
}
|
|
213
198
|
function selectRecentTopLevelMessages(records, options) {
|
|
214
|
-
return selectRecentMessages(records.filter((record) => isTopLevelHistoryMessage(record.message, options.excludeMessageId)), options);
|
|
199
|
+
return selectRecentMessages(recordsBeforeCurrentMessage(records, options.excludeMessageId).filter((record) => isTopLevelHistoryMessage(record.message, options.excludeMessageId)), options);
|
|
215
200
|
}
|
|
216
201
|
function selectRecentMessages(records, options) {
|
|
217
202
|
const sinceMs = options.now.getTime() - options.recentDays * 24 * 60 * 60 * 1000;
|
|
@@ -220,17 +205,18 @@ function selectRecentMessages(records, options) {
|
|
|
220
205
|
.slice(-options.maxMessages);
|
|
221
206
|
}
|
|
222
207
|
function selectThreadBootstrapMessages(records, threadId, options) {
|
|
223
|
-
const
|
|
208
|
+
const scopedRecords = recordsBeforeCurrentMessage(records, options.excludeMessageId);
|
|
209
|
+
const rootRecord = findLogRecordById(scopedRecords, threadId);
|
|
224
210
|
const topLevelSource = rootRecord
|
|
225
|
-
?
|
|
226
|
-
:
|
|
211
|
+
? scopedRecords.filter((record) => record.index <= rootRecord.index)
|
|
212
|
+
: scopedRecords;
|
|
227
213
|
const topLevelRecords = selectRecentTopLevelMessages(topLevelSource, {
|
|
228
214
|
recentDays: options.recentDays,
|
|
229
215
|
maxMessages: options.maxTopLevelMessages,
|
|
230
216
|
now: options.now,
|
|
231
217
|
excludeMessageId: options.excludeMessageId,
|
|
232
218
|
});
|
|
233
|
-
const threadRecords =
|
|
219
|
+
const threadRecords = scopedRecords.filter((record) => isRenderableConversationMessage(record.message, options.excludeMessageId) &&
|
|
234
220
|
(record.message.ts === threadId || record.message.threadTs === threadId));
|
|
235
221
|
return dedupeAndSortRecords([...topLevelRecords, ...threadRecords]);
|
|
236
222
|
}
|
|
@@ -247,7 +233,7 @@ function isRecentHistoryMessage(message, sinceMs) {
|
|
|
247
233
|
}
|
|
248
234
|
function selectExistingSessionSyncMessages(records, options) {
|
|
249
235
|
const threadId = options.sessionKey ? extractSessionSuffix(options.sessionKey) : null;
|
|
250
|
-
return dedupeAndSortRecords(records.filter((record) => {
|
|
236
|
+
return dedupeAndSortRecords(recordsBeforeCurrentMessage(records, options.excludeMessageId).filter((record) => {
|
|
251
237
|
if (!isRenderableConversationMessage(record.message, options.excludeMessageId))
|
|
252
238
|
return false;
|
|
253
239
|
if (!threadId)
|
|
@@ -255,21 +241,29 @@ function selectExistingSessionSyncMessages(records, options) {
|
|
|
255
241
|
return record.message.ts === threadId || record.message.threadTs === threadId;
|
|
256
242
|
}));
|
|
257
243
|
}
|
|
244
|
+
/**
|
|
245
|
+
* Slack logs messages before enqueueing them, so a later queued turn may
|
|
246
|
+
* already be present while the current turn is being prepared. Chat history
|
|
247
|
+
* must stop at the current record rather than merely removing that one id.
|
|
248
|
+
*/
|
|
249
|
+
function recordsBeforeCurrentMessage(records, currentMessageId) {
|
|
250
|
+
if (!currentMessageId)
|
|
251
|
+
return records;
|
|
252
|
+
const currentRecord = findLogRecordById(records, currentMessageId);
|
|
253
|
+
if (!currentRecord)
|
|
254
|
+
return records;
|
|
255
|
+
return records.filter((record) => record.index < currentRecord.index);
|
|
256
|
+
}
|
|
258
257
|
function latestSyncMessageId(records, options) {
|
|
259
258
|
return selectExistingSessionSyncMessages(records, options).at(-1)?.message.ts;
|
|
260
259
|
}
|
|
261
260
|
function isRenderableConversationMessage(message, excludeMessageId) {
|
|
262
261
|
if (excludeMessageId && message.ts === excludeMessageId)
|
|
263
262
|
return false;
|
|
264
|
-
if (
|
|
263
|
+
if (!message.isMessagingBot && isCommandText(message.text ?? ""))
|
|
265
264
|
return false;
|
|
266
265
|
return !!message.text?.trim();
|
|
267
266
|
}
|
|
268
|
-
function isChatCommandMessage(message) {
|
|
269
|
-
const text = message.text?.trim() ?? "";
|
|
270
|
-
return (!message.isMessagingBot &&
|
|
271
|
-
/^\/(?:pi-[\w-]+|login|session|new|stop|model|sandbox|admin|auto-reply)(?:@\w+)?(?:\s|$)/i.test(text));
|
|
272
|
-
}
|
|
273
267
|
function dedupeAndSortRecords(records) {
|
|
274
268
|
const byKey = new Map();
|
|
275
269
|
for (const record of records) {
|
|
@@ -296,74 +290,93 @@ function sortTime(record) {
|
|
|
296
290
|
}
|
|
297
291
|
return record.index;
|
|
298
292
|
}
|
|
299
|
-
function bootstrapSessionFromLog(sessionFile, cwd, records, lastMessageId = records.at(-1)?.message.ts) {
|
|
293
|
+
async function bootstrapSessionFromLog(sessionFile, cwd, records, lastMessageId = records.at(-1)?.message.ts) {
|
|
300
294
|
if (records.length === 0 && !lastMessageId)
|
|
301
295
|
return;
|
|
302
|
-
const sessionManager = openManagedSession(sessionFile, cwd);
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
syncSessionManagerFromLog(openManagedSession(sessionFile, cwd), records, historyWindow);
|
|
296
|
+
const sessionManager = await openManagedSession(sessionFile, cwd);
|
|
297
|
+
try {
|
|
298
|
+
await appendLogRecordsToSession(sessionManager, records);
|
|
299
|
+
await sessionManager.appendCustomEntry(CHAT_SYNC_CUSTOM_TYPE, {
|
|
300
|
+
source: "log.jsonl",
|
|
301
|
+
messageCount: records.length,
|
|
302
|
+
lastMessageId,
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
finally {
|
|
306
|
+
await sessionManager.close();
|
|
307
|
+
}
|
|
315
308
|
}
|
|
316
|
-
function syncSessionManagerFromLog(sessionManager, records, historyWindow) {
|
|
309
|
+
async function syncSessionManagerFromLog(sessionManager, records, historyWindow) {
|
|
317
310
|
if (records.length === 0)
|
|
318
|
-
return;
|
|
319
|
-
const existingEntries = sessionManager.getEntries();
|
|
311
|
+
return { appended: 0 };
|
|
312
|
+
const existingEntries = await sessionManager.getEntries();
|
|
313
|
+
const resetAt = getLatestChatSyncResetAt(existingEntries);
|
|
314
|
+
const eligibleRecords = resetAt
|
|
315
|
+
? records.filter((record) => isAfterReset(record, resetAt))
|
|
316
|
+
: records;
|
|
320
317
|
const lastSyncedMessageId = getLatestChatSyncMessageId(existingEntries);
|
|
321
318
|
const lastSyncedIndex = lastSyncedMessageId
|
|
322
|
-
?
|
|
319
|
+
? eligibleRecords.findIndex((record) => record.message.ts === lastSyncedMessageId)
|
|
323
320
|
: -1;
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
const syncCandidates = selectRecentMessages(
|
|
321
|
+
// A truncated or rebuilt log may no longer contain the watermark. Replay the
|
|
322
|
+
// current bounded history; represented-message matching below prevents duplicates.
|
|
323
|
+
const syncCandidates = selectRecentMessages(eligibleRecords.slice(lastSyncedIndex + 1), historyWindow);
|
|
327
324
|
if (syncCandidates.length === 0)
|
|
328
|
-
return;
|
|
325
|
+
return { appended: 0 };
|
|
329
326
|
const represented = buildRepresentedMessageCounts(existingEntries);
|
|
330
327
|
const newRecords = syncCandidates.filter((record) => !consumeRepresentedLogMessage(record, represented));
|
|
331
328
|
if (newRecords.length === 0)
|
|
332
|
-
return;
|
|
333
|
-
|
|
334
|
-
sessionManager
|
|
329
|
+
return { appended: 0 };
|
|
330
|
+
const lastMessageId = syncCandidates.at(-1)?.message.ts;
|
|
331
|
+
await appendLogRecordsToSession(sessionManager, newRecords);
|
|
332
|
+
await sessionManager.appendCustomEntry(CHAT_SYNC_CUSTOM_TYPE, {
|
|
335
333
|
source: "log.jsonl",
|
|
336
334
|
messageCount: newRecords.length,
|
|
337
|
-
lastMessageId
|
|
335
|
+
lastMessageId,
|
|
338
336
|
});
|
|
337
|
+
return {
|
|
338
|
+
appended: newRecords.length,
|
|
339
|
+
...(lastMessageId !== undefined ? { lastMessageId } : {}),
|
|
340
|
+
};
|
|
339
341
|
}
|
|
340
|
-
function appendLogRecordsToSession(sessionManager, records) {
|
|
342
|
+
async function appendLogRecordsToSession(sessionManager, records) {
|
|
341
343
|
for (const record of records) {
|
|
342
344
|
const message = buildHistorySessionMessage(record.message);
|
|
343
345
|
if (message)
|
|
344
|
-
sessionManager.appendMessage(message);
|
|
346
|
+
await sessionManager.appendMessage(message);
|
|
345
347
|
}
|
|
346
348
|
}
|
|
347
|
-
function
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
349
|
+
function isChatSyncMarker(entry) {
|
|
350
|
+
return entry.type === "custom" && entry.customType === CHAT_SYNC_CUSTOM_TYPE;
|
|
351
|
+
}
|
|
352
|
+
/** The reset timestamp a chat-sync marker records, when it carries a usable one. */
|
|
353
|
+
function markerResetAt(entry) {
|
|
354
|
+
if (!isChatSyncMarker(entry))
|
|
355
|
+
return undefined;
|
|
356
|
+
if (!isRecord(entry.data) || typeof entry.data.resetAt !== "string")
|
|
357
|
+
return undefined;
|
|
358
|
+
const resetAt = new Date(entry.data.resetAt).getTime();
|
|
359
|
+
return Number.isFinite(resetAt) ? resetAt : undefined;
|
|
360
|
+
}
|
|
361
|
+
function getLatestChatSyncResetAt(entries) {
|
|
362
|
+
for (const entry of entries.toReversed()) {
|
|
363
|
+
const resetAt = markerResetAt(entry);
|
|
364
|
+
if (resetAt !== undefined)
|
|
365
|
+
return resetAt;
|
|
364
366
|
}
|
|
365
367
|
return undefined;
|
|
366
368
|
}
|
|
369
|
+
function isAfterReset(record, resetAt) {
|
|
370
|
+
if (!record.message.date)
|
|
371
|
+
return false;
|
|
372
|
+
const messageTime = new Date(record.message.date).getTime();
|
|
373
|
+
return Number.isFinite(messageTime) && messageTime >= resetAt;
|
|
374
|
+
}
|
|
375
|
+
function getLatestChatSyncMessageId(entries) {
|
|
376
|
+
const marker = entries.toReversed().find(isChatSyncMarker);
|
|
377
|
+
const lastMessageId = isRecord(marker?.data) ? marker.data.lastMessageId : undefined;
|
|
378
|
+
return typeof lastMessageId === "string" ? lastMessageId : undefined;
|
|
379
|
+
}
|
|
367
380
|
function buildRepresentedMessageCounts(entries) {
|
|
368
381
|
const counts = new Map();
|
|
369
382
|
for (const entry of entries) {
|
|
@@ -413,11 +426,7 @@ function getSessionMessageText(entry) {
|
|
|
413
426
|
.map((part) => (part.type === "text" && "text" in part ? part.text : ""))
|
|
414
427
|
.join("\n");
|
|
415
428
|
}
|
|
416
|
-
|
|
417
|
-
return text
|
|
418
|
-
.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*/, "")
|
|
419
|
-
.trim();
|
|
420
|
-
}
|
|
429
|
+
const normalizeComparableText = stripHistoryLinePrefix;
|
|
421
430
|
function buildHistorySessionMessage(message) {
|
|
422
431
|
const text = message.text?.trim();
|
|
423
432
|
if (!text)
|
|
@@ -466,10 +475,11 @@ function parseMessageTimestamp(message) {
|
|
|
466
475
|
return undefined;
|
|
467
476
|
}
|
|
468
477
|
function formatHistoryMessage(message) {
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
478
|
+
return formatHistoryLine({
|
|
479
|
+
date: message.date ? new Date(message.date) : undefined,
|
|
480
|
+
userName: message.userName || message.user,
|
|
481
|
+
text: message.text?.trim() ?? "",
|
|
482
|
+
});
|
|
473
483
|
}
|
|
474
484
|
function zeroUsage() {
|
|
475
485
|
return {
|
|
@@ -481,4 +491,53 @@ function zeroUsage() {
|
|
|
481
491
|
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
|
|
482
492
|
};
|
|
483
493
|
}
|
|
484
|
-
|
|
494
|
+
// ── Conversation platform log (log.jsonl) ─────────────────────────────────────
|
|
495
|
+
/**
|
|
496
|
+
* Read a conversation's platform chat log (log.jsonl): skip malformed lines,
|
|
497
|
+
* and coalesce consecutive messaging-bot chunks that share a ts — streamed
|
|
498
|
+
* responses are logged in pieces but represent one message.
|
|
499
|
+
*/
|
|
500
|
+
function readConversationLog(conversationDir) {
|
|
501
|
+
const logFile = join(conversationDir, "log.jsonl");
|
|
502
|
+
const raw = readTextFileIfExists(logFile);
|
|
503
|
+
if (raw === undefined)
|
|
504
|
+
return [];
|
|
505
|
+
const records = [];
|
|
506
|
+
for (const [index, line] of raw.trim().split("\n").filter(Boolean).entries()) {
|
|
507
|
+
const message = parseLogLine(line, logFile, index + 1);
|
|
508
|
+
if (message)
|
|
509
|
+
records.push({ message, index });
|
|
510
|
+
}
|
|
511
|
+
return coalesceMessagingBotLogChunks(records);
|
|
512
|
+
}
|
|
513
|
+
/** One log line, or `undefined` after warning about a malformed one. */
|
|
514
|
+
function parseLogLine(line, logFile, lineNumber) {
|
|
515
|
+
try {
|
|
516
|
+
return parseJsonValue(line, (value) => isRecord(value), (detail) => (detail === "unexpected JSON shape" ? "expected a JSON object" : detail));
|
|
517
|
+
}
|
|
518
|
+
catch (err) {
|
|
519
|
+
log.logWarning(`Skipping malformed log entry at ${logFile}:${lineNumber}`, err instanceof Error ? err.message : String(err));
|
|
520
|
+
return undefined;
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
function coalesceMessagingBotLogChunks(records) {
|
|
524
|
+
const coalesced = [];
|
|
525
|
+
for (const record of records) {
|
|
526
|
+
const previous = coalesced.at(-1);
|
|
527
|
+
if (previous && canCoalesceMessagingBotLogChunk(previous.message, record.message)) {
|
|
528
|
+
previous.message.text = `${previous.message.text ?? ""}${record.message.text ?? ""}`;
|
|
529
|
+
continue;
|
|
530
|
+
}
|
|
531
|
+
coalesced.push({ ...record, message: { ...record.message } });
|
|
532
|
+
}
|
|
533
|
+
return coalesced;
|
|
534
|
+
}
|
|
535
|
+
function canCoalesceMessagingBotLogChunk(previous, current) {
|
|
536
|
+
return (previous.isMessagingBot === true &&
|
|
537
|
+
current.isMessagingBot === true &&
|
|
538
|
+
!!previous.ts &&
|
|
539
|
+
previous.ts === current.ts &&
|
|
540
|
+
previous.threadTs === current.threadTs &&
|
|
541
|
+
previous.user === current.user);
|
|
542
|
+
}
|
|
543
|
+
//# sourceMappingURL=chat-history-sync.js.map
|