@maudecode/talaria-web 1.18.0 → 1.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/_release.json +8 -8
- package/dist/api/auth-raw.js +16 -16
- package/dist/api/auth-raw.js.map +1 -1
- package/dist/api/automation-raw.d.ts +2 -2
- package/dist/api/automation-raw.js +93 -38
- package/dist/api/automation-raw.js.map +1 -1
- package/dist/api/automation-router.d.ts +99 -17
- package/dist/api/automation-router.js +22 -14
- package/dist/api/automation-router.js.map +1 -1
- package/dist/api/chat-router.d.ts +1433 -37
- package/dist/api/chat-router.js +205 -90
- package/dist/api/chat-router.js.map +1 -1
- package/dist/api/git-router.d.ts +6 -2
- package/dist/api/git-router.js +30 -30
- package/dist/api/git-router.js.map +1 -1
- package/dist/api/raw-routes.d.ts +3 -3
- package/dist/api/raw-routes.js +76 -62
- package/dist/api/raw-routes.js.map +1 -1
- package/dist/api/router.d.ts +5 -5
- package/dist/api/router.js +22 -22
- package/dist/api/router.js.map +1 -1
- package/dist/api/session-visibility.d.ts +4 -4
- package/dist/api/session-visibility.js +26 -16
- package/dist/api/session-visibility.js.map +1 -1
- package/dist/api/sessions-router.d.ts +2635 -151
- package/dist/api/sessions-router.js +193 -177
- package/dist/api/sessions-router.js.map +1 -1
- package/dist/api/settings-router.d.ts +450 -11
- package/dist/api/settings-router.js +102 -49
- package/dist/api/settings-router.js.map +1 -1
- package/dist/api/sse-routes.d.ts +2 -2
- package/dist/api/sse-routes.js +102 -80
- package/dist/api/sse-routes.js.map +1 -1
- package/dist/api/tools-raw.d.ts +5 -0
- package/dist/api/tools-raw.js +58 -33
- package/dist/api/tools-raw.js.map +1 -1
- package/dist/api/tools-router.d.ts +963 -109
- package/dist/api/tools-router.js +426 -72
- package/dist/api/tools-router.js.map +1 -1
- package/dist/api/transcribe-stream.d.ts +16 -0
- package/dist/api/transcribe-stream.js +172 -0
- package/dist/api/transcribe-stream.js.map +1 -0
- package/dist/app.d.ts +4 -1
- package/dist/app.js +80 -57
- package/dist/app.js.map +1 -1
- package/dist/auth/crypto.d.ts +3 -0
- package/dist/auth/crypto.js +18 -0
- package/dist/auth/crypto.js.map +1 -1
- package/dist/auth/gate.js +14 -9
- package/dist/auth/gate.js.map +1 -1
- package/dist/auth/passkeys.d.ts +15 -14
- package/dist/auth/passkeys.js +89 -91
- package/dist/auth/passkeys.js.map +1 -1
- package/dist/auth/store.d.ts +17 -7
- package/dist/auth/store.js +93 -52
- package/dist/auth/store.js.map +1 -1
- package/dist/bin/talaria-web.js +12 -81
- package/dist/bin/talaria-web.js.map +1 -1
- package/dist/cli/ctl.js +8 -2
- package/dist/cli/ctl.js.map +1 -1
- package/dist/cli/dotenv.d.ts +5 -0
- package/dist/cli/dotenv.js +14 -2
- package/dist/cli/dotenv.js.map +1 -1
- package/dist/cli/launcher.js +5 -5
- package/dist/cli/launcher.js.map +1 -1
- package/dist/cli/main.d.ts +1 -0
- package/dist/cli/main.js +90 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/supervise.d.ts +24 -0
- package/dist/cli/supervise.js +147 -6
- package/dist/cli/supervise.js.map +1 -1
- package/dist/config/agent-config.d.ts +37 -11
- package/dist/config/agent-config.js +146 -64
- package/dist/config/agent-config.js.map +1 -1
- package/dist/config.d.ts +2 -0
- package/dist/config.js +14 -5
- package/dist/config.js.map +1 -1
- package/dist/fs/atomic.d.ts +4 -0
- package/dist/fs/atomic.js +19 -2
- package/dist/fs/atomic.js.map +1 -1
- package/dist/fs/stat.d.ts +7 -0
- package/dist/fs/stat.js +27 -0
- package/dist/fs/stat.js.map +1 -0
- package/dist/http/context.d.ts +28 -9
- package/dist/http/context.js +77 -25
- package/dist/http/context.js.map +1 -1
- package/dist/onboarding.d.ts +2 -2
- package/dist/onboarding.js +10 -8
- package/dist/onboarding.js.map +1 -1
- package/dist/profiles/profiles.d.ts +12 -4
- package/dist/profiles/profiles.js +78 -30
- package/dist/profiles/profiles.js.map +1 -1
- package/dist/projects.d.ts +15 -6
- package/dist/projects.js +55 -47
- package/dist/projects.js.map +1 -1
- package/dist/providers/catalog.d.ts +85 -14
- package/dist/providers/catalog.js +502 -146
- package/dist/providers/catalog.js.map +1 -1
- package/dist/providers/env-file.d.ts +10 -3
- package/dist/providers/env-file.js +24 -75
- package/dist/providers/env-file.js.map +1 -1
- package/dist/providers/runtime-env.d.ts +4 -2
- package/dist/providers/runtime-env.js +9 -6
- package/dist/providers/runtime-env.js.map +1 -1
- package/dist/providers/tables.d.ts +3 -1
- package/dist/providers/tables.js +4 -2
- package/dist/providers/tables.js.map +1 -1
- package/dist/redact.js +56 -23
- package/dist/redact.js.map +1 -1
- package/dist/release.d.ts +7 -0
- package/dist/release.js +19 -3
- package/dist/release.js.map +1 -1
- package/dist/runtime.d.ts +5 -1
- package/dist/runtime.js +303 -96
- package/dist/runtime.js.map +1 -1
- package/dist/server.js +31 -18
- package/dist/server.js.map +1 -1
- package/dist/sessions/anchor.d.ts +11 -4
- package/dist/sessions/anchor.js +33 -37
- package/dist/sessions/anchor.js.map +1 -1
- package/dist/sessions/background-events.d.ts +2 -0
- package/dist/sessions/background-events.js +10 -0
- package/dist/sessions/background-events.js.map +1 -0
- package/dist/sessions/background-tasks.d.ts +49 -23
- package/dist/sessions/background-tasks.js +161 -89
- package/dist/sessions/background-tasks.js.map +1 -1
- package/dist/sessions/background-updates.d.ts +15 -8
- package/dist/sessions/background-updates.js +101 -25
- package/dist/sessions/background-updates.js.map +1 -1
- package/dist/sessions/cli-sessions.d.ts +23 -6
- package/dist/sessions/cli-sessions.js +84 -84
- package/dist/sessions/cli-sessions.js.map +1 -1
- package/dist/sessions/completions.d.ts +38 -2
- package/dist/sessions/completions.js +348 -77
- package/dist/sessions/completions.js.map +1 -1
- package/dist/sessions/compress.d.ts +8 -0
- package/dist/sessions/compress.js +2 -2
- package/dist/sessions/compress.js.map +1 -1
- package/dist/sessions/drafts.d.ts +14 -10
- package/dist/sessions/drafts.js +38 -43
- package/dist/sessions/drafts.js.map +1 -1
- package/dist/sessions/export.d.ts +2 -0
- package/dist/sessions/export.js +6 -2
- package/dist/sessions/export.js.map +1 -1
- package/dist/sessions/gateway-sessions.d.ts +86 -0
- package/dist/sessions/gateway-sessions.js +914 -0
- package/dist/sessions/gateway-sessions.js.map +1 -0
- package/dist/sessions/gateway-watcher.d.ts +10 -11
- package/dist/sessions/gateway-watcher.js +25 -21
- package/dist/sessions/gateway-watcher.js.map +1 -1
- package/dist/sessions/goals.d.ts +31 -0
- package/dist/sessions/goals.js +75 -0
- package/dist/sessions/goals.js.map +1 -0
- package/dist/sessions/journal.d.ts +5 -79
- package/dist/sessions/journal.js +15 -606
- package/dist/sessions/journal.js.map +1 -1
- package/dist/sessions/list.d.ts +34 -18
- package/dist/sessions/list.js +161 -147
- package/dist/sessions/list.js.map +1 -1
- package/dist/sessions/merge.d.ts +77 -13
- package/dist/sessions/merge.js +315 -65
- package/dist/sessions/merge.js.map +1 -1
- package/dist/sessions/notices.d.ts +22 -0
- package/dist/sessions/notices.js +72 -0
- package/dist/sessions/notices.js.map +1 -0
- package/dist/sessions/pending.d.ts +10 -4
- package/dist/sessions/pending.js +83 -7
- package/dist/sessions/pending.js.map +1 -1
- package/dist/sessions/prefix-index.d.ts +85 -0
- package/dist/sessions/prefix-index.js +243 -0
- package/dist/sessions/prefix-index.js.map +1 -0
- package/dist/sessions/recovery.d.ts +4 -7
- package/dist/sessions/recovery.js +100 -283
- package/dist/sessions/recovery.js.map +1 -1
- package/dist/sessions/relay.d.ts +20 -20
- package/dist/sessions/relay.js +205 -127
- package/dist/sessions/relay.js.map +1 -1
- package/dist/sessions/service.d.ts +251 -78
- package/dist/sessions/service.js +1510 -564
- package/dist/sessions/service.js.map +1 -1
- package/dist/sessions/session.d.ts +20 -2
- package/dist/sessions/session.js +33 -5
- package/dist/sessions/session.js.map +1 -1
- package/dist/sessions/shares.d.ts +7 -6
- package/dist/sessions/shares.js +22 -45
- package/dist/sessions/shares.js.map +1 -1
- package/dist/sessions/source-kind.js +1 -0
- package/dist/sessions/source-kind.js.map +1 -1
- package/dist/sessions/state-db-identity.d.ts +18 -0
- package/dist/sessions/state-db-identity.js +67 -0
- package/dist/sessions/state-db-identity.js.map +1 -0
- package/dist/sessions/state-db-worker.js +24 -5
- package/dist/sessions/state-db-worker.js.map +1 -1
- package/dist/sessions/state-db.d.ts +157 -21
- package/dist/sessions/state-db.js +1145 -204
- package/dist/sessions/state-db.js.map +1 -1
- package/dist/sessions/state-saved.d.ts +1 -1
- package/dist/sessions/state-saved.js +35 -11
- package/dist/sessions/state-saved.js.map +1 -1
- package/dist/sessions/storage/backend.d.ts +171 -0
- package/dist/sessions/storage/backend.js +19 -0
- package/dist/sessions/storage/backend.js.map +1 -0
- package/dist/sessions/storage/conformance.d.ts +20 -0
- package/dist/sessions/storage/conformance.js +237 -0
- package/dist/sessions/storage/conformance.js.map +1 -0
- package/dist/sessions/storage/document.d.ts +16 -0
- package/dist/sessions/storage/document.js +44 -0
- package/dist/sessions/storage/document.js.map +1 -0
- package/dist/sessions/storage/json-documents.d.ts +25 -0
- package/dist/sessions/storage/json-documents.js +277 -0
- package/dist/sessions/storage/json-documents.js.map +1 -0
- package/dist/sessions/storage/json-files.d.ts +23 -0
- package/dist/sessions/storage/json-files.js +244 -0
- package/dist/sessions/storage/json-files.js.map +1 -0
- package/dist/sessions/storage/json-installation.d.ts +3 -0
- package/dist/sessions/storage/json-installation.js +31 -0
- package/dist/sessions/storage/json-installation.js.map +1 -0
- package/dist/sessions/storage/json-journal.d.ts +113 -0
- package/dist/sessions/storage/json-journal.js +756 -0
- package/dist/sessions/storage/json-journal.js.map +1 -0
- package/dist/sessions/storage/json-recovery.d.ts +4 -0
- package/dist/sessions/storage/json-recovery.js +195 -0
- package/dist/sessions/storage/json-recovery.js.map +1 -0
- package/dist/sessions/storage/json.d.ts +82 -0
- package/dist/sessions/storage/json.js +350 -0
- package/dist/sessions/storage/json.js.map +1 -0
- package/dist/sessions/storage/row.d.ts +6 -0
- package/dist/sessions/storage/row.js +49 -0
- package/dist/sessions/storage/row.js.map +1 -0
- package/dist/sessions/storage/search-text.d.ts +4 -0
- package/dist/sessions/storage/search-text.js +16 -0
- package/dist/sessions/storage/search-text.js.map +1 -0
- package/dist/sessions/store.d.ts +67 -73
- package/dist/sessions/store.js +341 -607
- package/dist/sessions/store.js.map +1 -1
- package/dist/sessions/streams.d.ts +12 -7
- package/dist/sessions/streams.js +58 -15
- package/dist/sessions/streams.js.map +1 -1
- package/dist/sessions/titles.js +1 -1
- package/dist/sessions/titles.js.map +1 -1
- package/dist/sessions/todo.d.ts +5 -0
- package/dist/sessions/todo.js +28 -21
- package/dist/sessions/todo.js.map +1 -1
- package/dist/sessions/tool-display.d.ts +8 -5
- package/dist/sessions/tool-display.js +28 -16
- package/dist/sessions/tool-display.js.map +1 -1
- package/dist/sessions/turn-context.d.ts +10 -1
- package/dist/sessions/turn-context.js +13 -6
- package/dist/sessions/turn-context.js.map +1 -1
- package/dist/sessions/turn.d.ts +110 -22
- package/dist/sessions/turn.js +918 -380
- package/dist/sessions/turn.js.map +1 -1
- package/dist/sessions/wakeup-pause.d.ts +8 -13
- package/dist/sessions/wakeup-pause.js +31 -49
- package/dist/sessions/wakeup-pause.js.map +1 -1
- package/dist/sessions/window.js +13 -12
- package/dist/sessions/window.js.map +1 -1
- package/dist/settings.d.ts +19 -7
- package/dist/settings.js +179 -183
- package/dist/settings.js.map +1 -1
- package/dist/sidecar/client.d.ts +41 -4
- package/dist/sidecar/client.js +192 -42
- package/dist/sidecar/client.js.map +1 -1
- package/dist/sidecar/discover.d.ts +2 -1
- package/dist/sidecar/discover.js +93 -10
- package/dist/sidecar/discover.js.map +1 -1
- package/dist/sidecar/env.d.ts +4 -0
- package/dist/sidecar/env.js +3 -0
- package/dist/sidecar/env.js.map +1 -0
- package/dist/sidecar/fake.d.ts +6 -2
- package/dist/sidecar/fake.js +34 -4
- package/dist/sidecar/fake.js.map +1 -1
- package/dist/spa.d.ts +9 -4
- package/dist/spa.js +36 -12
- package/dist/spa.js.map +1 -1
- package/dist/startup-timing.d.ts +66 -0
- package/dist/startup-timing.js +129 -0
- package/dist/startup-timing.js.map +1 -0
- package/dist/test/env-file.d.ts +5 -0
- package/dist/test/env-file.js +88 -0
- package/dist/test/env-file.js.map +1 -0
- package/dist/test/fs-handles.d.ts +11 -0
- package/dist/test/fs-handles.js +31 -0
- package/dist/test/fs-handles.js.map +1 -0
- package/dist/test/harness.d.ts +1 -0
- package/dist/test/harness.js +1 -1
- package/dist/test/harness.js.map +1 -1
- package/dist/test/passkeys.d.ts +22 -0
- package/dist/test/passkeys.js +62 -0
- package/dist/test/passkeys.js.map +1 -0
- package/dist/test/storage.d.ts +15 -0
- package/dist/test/storage.js +26 -0
- package/dist/test/storage.js.map +1 -0
- package/dist/tools/commands.d.ts +6 -1
- package/dist/tools/commands.js +8 -2
- package/dist/tools/commands.js.map +1 -1
- package/dist/tools/connectors.d.ts +33 -0
- package/dist/tools/connectors.js +121 -0
- package/dist/tools/connectors.js.map +1 -0
- package/dist/tools/crons.d.ts +46 -5
- package/dist/tools/crons.js +100 -26
- package/dist/tools/crons.js.map +1 -1
- package/dist/tools/dashboard-plugins.d.ts +34 -5
- package/dist/tools/dashboard-plugins.js +146 -14
- package/dist/tools/dashboard-plugins.js.map +1 -1
- package/dist/tools/extensions.d.ts +5 -4
- package/dist/tools/extensions.js +213 -207
- package/dist/tools/extensions.js.map +1 -1
- package/dist/tools/gateway-restart.d.ts +82 -0
- package/dist/tools/gateway-restart.js +222 -0
- package/dist/tools/gateway-restart.js.map +1 -0
- package/dist/tools/health.d.ts +28 -4
- package/dist/tools/health.js +171 -50
- package/dist/tools/health.js.map +1 -1
- package/dist/tools/hygiene.d.ts +4 -3
- package/dist/tools/hygiene.js +23 -9
- package/dist/tools/hygiene.js.map +1 -1
- package/dist/tools/insights.d.ts +1 -1
- package/dist/tools/insights.js +2 -2
- package/dist/tools/insights.js.map +1 -1
- package/dist/tools/kanban.d.ts +4 -2
- package/dist/tools/kanban.js +28 -19
- package/dist/tools/kanban.js.map +1 -1
- package/dist/tools/mcp-health.js +74 -24
- package/dist/tools/mcp-health.js.map +1 -1
- package/dist/tools/mcp.js +19 -1
- package/dist/tools/mcp.js.map +1 -1
- package/dist/tools/memory-masks.d.ts +5 -0
- package/dist/tools/memory-masks.js +256 -0
- package/dist/tools/memory-masks.js.map +1 -0
- package/dist/tools/memory.d.ts +29 -3
- package/dist/tools/memory.js +69 -27
- package/dist/tools/memory.js.map +1 -1
- package/dist/tools/plugin-oauth.d.ts +14 -0
- package/dist/tools/plugin-oauth.js +53 -0
- package/dist/tools/plugin-oauth.js.map +1 -0
- package/dist/tools/plugin-settings.d.ts +15 -0
- package/dist/tools/plugin-settings.js +90 -0
- package/dist/tools/plugin-settings.js.map +1 -0
- package/dist/tools/prune-advice.d.ts +50 -0
- package/dist/tools/prune-advice.js +114 -0
- package/dist/tools/prune-advice.js.map +1 -0
- package/dist/tools/skills.d.ts +13 -5
- package/dist/tools/skills.js +53 -19
- package/dist/tools/skills.js.map +1 -1
- package/dist/tools/update-notifications.d.ts +102 -17
- package/dist/tools/update-notifications.js +400 -82
- package/dist/tools/update-notifications.js.map +1 -1
- package/dist/tools/update-rollback.d.ts +11 -0
- package/dist/tools/update-rollback.js +28 -0
- package/dist/tools/update-rollback.js.map +1 -0
- package/dist/tools/updates.d.ts +100 -33
- package/dist/tools/updates.js +1085 -345
- package/dist/tools/updates.js.map +1 -1
- package/dist/util.d.ts +2 -0
- package/dist/util.js +5 -0
- package/dist/util.js.map +1 -1
- package/dist/workspace/git.d.ts +16 -1
- package/dist/workspace/git.js +291 -11
- package/dist/workspace/git.js.map +1 -1
- package/dist/workspace/media.d.ts +12 -9
- package/dist/workspace/media.js +98 -38
- package/dist/workspace/media.js.map +1 -1
- package/dist/workspace/preview.js +4 -14
- package/dist/workspace/preview.js.map +1 -1
- package/dist/workspace/rollback.d.ts +8 -4
- package/dist/workspace/rollback.js +22 -12
- package/dist/workspace/rollback.js.map +1 -1
- package/dist/workspace/workspaces.d.ts +15 -19
- package/dist/workspace/workspaces.js +55 -127
- package/dist/workspace/workspaces.js.map +1 -1
- package/dist/workspace/worktrees.js +170 -32
- package/dist/workspace/worktrees.js.map +1 -1
- package/package.json +6 -4
- package/sidecar/agent_dependency.json +4 -4
- package/sidecar/agent_support.json +29 -0
- package/sidecar/scripts/record-fixtures.py +12 -3
- package/sidecar/scripts/replay_sidecar.py +8 -0
- package/sidecar/scripts/suite_runner.py +458 -0
- package/sidecar/scripts/test.sh +11 -5
- package/sidecar/talaria_sidecar/__init__.py +6 -1
- package/sidecar/talaria_sidecar/__main__.py +13 -4
- package/sidecar/talaria_sidecar/agent_mutation.py +1111 -0
- package/sidecar/talaria_sidecar/agent_services.py +1116 -0
- package/sidecar/talaria_sidecar/context_detail.py +59 -0
- package/sidecar/talaria_sidecar/dependency_sync.py +85 -0
- package/sidecar/talaria_sidecar/home.py +133 -14
- package/sidecar/talaria_sidecar/methods/__init__.py +2 -2
- package/sidecar/talaria_sidecar/methods/aux.py +211 -41
- package/sidecar/talaria_sidecar/methods/chat.py +1378 -200
- package/sidecar/talaria_sidecar/methods/checkpoints.py +29 -4
- package/sidecar/talaria_sidecar/methods/commands.py +483 -13
- package/sidecar/talaria_sidecar/methods/config.py +195 -6
- package/sidecar/talaria_sidecar/methods/connectors.py +375 -0
- package/sidecar/talaria_sidecar/methods/cron.py +374 -36
- package/sidecar/talaria_sidecar/methods/cron_execution.py +284 -0
- package/sidecar/talaria_sidecar/methods/dashboard_plugins.py +301 -0
- package/sidecar/talaria_sidecar/methods/gateway.py +215 -55
- package/sidecar/talaria_sidecar/methods/gateway_sessions.py +418 -0
- package/sidecar/talaria_sidecar/methods/goals.py +81 -41
- package/sidecar/talaria_sidecar/methods/kanban.py +82 -30
- package/sidecar/talaria_sidecar/methods/memory.py +84 -0
- package/sidecar/talaria_sidecar/methods/oauth.py +144 -13
- package/sidecar/talaria_sidecar/methods/plugin_catalog.py +198 -0
- package/sidecar/talaria_sidecar/methods/plugin_oauth.py +234 -0
- package/sidecar/talaria_sidecar/methods/process.py +229 -16
- package/sidecar/talaria_sidecar/methods/profiles.py +48 -9
- package/sidecar/talaria_sidecar/methods/providers.py +196 -26
- package/sidecar/talaria_sidecar/methods/runtime.py +71 -1
- package/sidecar/talaria_sidecar/methods/skills.py +83 -5
- package/sidecar/talaria_sidecar/methods/state_db.py +405 -112
- package/sidecar/talaria_sidecar/methods/stt.py +159 -78
- package/sidecar/talaria_sidecar/methods/text.py +14 -1
- package/sidecar/talaria_sidecar/methods/toolsets.py +51 -0
- package/sidecar/talaria_sidecar/methods/usage.py +113 -14
- package/sidecar/talaria_sidecar/methods/worktree.py +145 -19
- package/sidecar/talaria_sidecar/methods/write_approval.py +181 -0
- package/sidecar/talaria_sidecar/rpc.py +70 -7
- package/sidecar/talaria_sidecar/runtime.py +122 -14
- package/sidecar/talaria_sidecar/speed.py +47 -0
- package/sidecar/talaria_sidecar/startup_timing.py +119 -0
- package/static/dist/FILES.txt +242 -215
- package/static/dist/THIRD_PARTY_LICENSES.md +6 -22
- package/static/dist/assets/AppShell-3isgvoro.js +8 -0
- package/static/dist/assets/Button-f4n6dapf.js +1 -0
- package/static/dist/assets/ChatPage-k7b6xfax.js +4 -0
- package/static/dist/assets/ConnectTargets-juqvt5lm.js +1 -0
- package/static/dist/assets/Dialog-hta5utr3.js +1 -0
- package/static/dist/assets/ExtensionRoute-zrhjn0wm.js +1 -0
- package/static/dist/assets/Field-b6ez48oz.js +1 -0
- package/static/dist/assets/HubRoute-iwvso2tz.js +2 -0
- package/static/dist/assets/LinkCheckContext-ix6zqqkk.js +1 -0
- package/static/dist/assets/Markdown-jdeth7zq.js +2 -0
- package/static/dist/assets/MarkdownRenderer-fbswsgld.js +302 -0
- package/static/dist/assets/MarkdownRenderer-i9o6nr38.css +1 -0
- package/static/dist/assets/OAuthSignIn-bpd8hom3.js +1 -0
- package/static/dist/assets/ResourceSwitch-odi6dy2o.js +1 -0
- package/static/dist/assets/RightPanel-eu6enlo6.js +1 -0
- package/static/dist/assets/Select-kr07928w.js +1 -0
- package/static/dist/assets/SessionListPanel-etb2i54l.js +1 -0
- package/static/dist/assets/SettingsLayout-eu3xxp23.js +1 -0
- package/static/dist/assets/States-icab19yg.js +1 -0
- package/static/dist/assets/TerminalPanel-hngmsr8b.js +16 -0
- package/static/dist/assets/Toaster-nb2uzjw1.js +1 -0
- package/static/dist/assets/_app-ga1moszl.js +1 -0
- package/static/dist/assets/_app.ext._extensionId-na62087t.js +1 -0
- package/static/dist/assets/_app.index-jypgdqoi.js +1 -0
- package/static/dist/assets/_app.insights-kabejdtm.js +1 -0
- package/static/dist/assets/_app.kanban-m19kfcmx.js +1 -0
- package/static/dist/assets/_app.logs-iw4m96sz.js +1 -0
- package/static/dist/assets/_app.memory-jq5frwcg.js +1 -0
- package/static/dist/assets/_app.profiles-kwa3m7rp.js +1 -0
- package/static/dist/assets/_app.session._sessionId-o5lyeipj.js +1 -0
- package/static/dist/assets/_app.settings-ckl8hdll.js +1 -0
- package/static/dist/assets/_app.settings._section-dtdjk98a.js +3 -0
- package/static/dist/assets/_app.skills-n016rihd.js +1 -0
- package/static/dist/assets/_app.tasks-n8zuqsqe.js +1 -0
- package/static/dist/assets/_app.todos-btew5v2s.js +1 -0
- package/static/dist/assets/_app.workspaces-lnfk95ch.js +1 -0
- package/static/dist/assets/abnfDiagram-VCTEODGH-dttheegb.js +1 -0
- package/static/dist/assets/{angular-html-nu6l31w3.js → angular-html-l28bd5fo.js} +1 -1
- package/static/dist/assets/{angular-ts-fbx4f8mm.js → angular-ts-ffzx1vj0.js} +1 -1
- package/static/dist/assets/{apl-bx2xr7dh.js → apl-b7h7mmy4.js} +1 -1
- package/static/dist/assets/{arc-7popfhbk.js → arc-fk1b21lm.js} +1 -1
- package/static/dist/assets/architecture-7GRP2DOG-ic435919.js +1 -0
- package/static/dist/assets/architectureDiagram-5GKGNRK7-8r3glgiq.js +36 -0
- package/static/dist/assets/archive-il7c6053.js +1 -0
- package/static/dist/assets/{astro-g77i97cb.js → astro-k117fy0t.js} +1 -1
- package/static/dist/assets/back-gu3nu279.js +1 -0
- package/static/dist/assets/{blade-boo0u92y.js → blade-npefsmn8.js} +1 -1
- package/static/dist/assets/{blockDiagram-I7D4REHJ-jzthp1wa.js → blockDiagram-I7D4REHJ-jenyos6c.js} +4 -4
- package/static/dist/assets/{c-cat0w3sc.js → c-2umg6kbn.js} +1 -1
- package/static/dist/assets/{c4Diagram-7LVT6UL2-mwr67mt8.js → c4Diagram-7LVT6UL2-nzlx7yc4.js} +1 -1
- package/static/dist/assets/cancel-bsnfo36u.js +1 -0
- package/static/dist/assets/channel-dsbtk01y.js +1 -0
- package/static/dist/assets/{chunk-4HAMMTFA-gpq1y228.js → chunk-4HAMMTFA-g0cru63b.js} +20 -20
- package/static/dist/assets/{chunk-75Z2AOVW-ktje58c4.js → chunk-75Z2AOVW-7rkswkjw.js} +1 -1
- package/static/dist/assets/chunk-DU6HZSFF-fn73jzdo.js +128 -0
- package/static/dist/assets/{chunk-F27PBJKO-cmev85ti.js → chunk-F27PBJKO-oey8e72m.js} +1 -1
- package/static/dist/assets/{chunk-FOHPRMQF-opuflp73.js → chunk-FOHPRMQF-ipewusgj.js} +8 -8
- package/static/dist/assets/{chunk-GMAD6QVW-htjgt22y.js → chunk-GMAD6QVW-l2a32wiy.js} +6 -6
- package/static/dist/assets/{chunk-GVQU2GXP-qndvoxl7.js → chunk-GVQU2GXP-o9dwzh8h.js} +1 -1
- package/static/dist/assets/{chunk-IMKFNOWR-e5bkd5q6.js → chunk-IMKFNOWR-eblwj20b.js} +5 -5
- package/static/dist/assets/{chunk-L3NEJ4N5-mj1155r6.js → chunk-L3NEJ4N5-o2mufspb.js} +1 -1
- package/static/dist/assets/chunk-OSK3NFVY-ijp9pw29.js +10 -0
- package/static/dist/assets/{chunk-P2QGCYS3-f7t54xfm.js → chunk-P2QGCYS3-hs9hqwl4.js} +1 -1
- package/static/dist/assets/{chunk-POPQ4Y6H-i927v9oa.js → chunk-POPQ4Y6H-bp9rsqez.js} +1 -1
- package/static/dist/assets/{chunk-PWAF6VOD-m84lmnyt.js → chunk-PWAF6VOD-brkprov6.js} +1 -1
- package/static/dist/assets/{chunk-SHT3W25Y-mi0tlcu9.js → chunk-SHT3W25Y-gmpv0pxz.js} +13 -13
- package/static/dist/assets/{chunk-SVP7TREG-dnau702j.js → chunk-SVP7TREG-oldm08fu.js} +4 -4
- package/static/dist/assets/{chunk-TICWLB2K-edem1gkg.js → chunk-TICWLB2K-ooqilfv7.js} +6 -6
- package/static/dist/assets/{chunk-XXDRQBXY-n40pf9vy.js → chunk-XXDRQBXY-jkmnqu65.js} +1 -1
- package/static/dist/assets/classDiagram-ZZMXUADV-fvgcv24g.js +1 -0
- package/static/dist/assets/classDiagram-v2-VYDZK3BY-fvgcv24g.js +1 -0
- package/static/dist/assets/{cobol-go622aep.js → cobol-ssf9hkh7.js} +1 -1
- package/static/dist/assets/{coffee-jwo1xjhq.js → coffee-lsi9fwae.js} +1 -1
- package/static/dist/assets/copied-bz3gkazh.js +1 -0
- package/static/dist/assets/copy-jo006coq.js +1 -0
- package/static/dist/assets/cose-bilkent-JH36ORCC-layy2r27.js +1 -0
- package/static/dist/assets/{cpp-nre7j0kq.js → cpp-lfrh4y55.js} +1 -1
- package/static/dist/assets/{crystal-lviso2je.js → crystal-efh4pte7.js} +1 -1
- package/static/dist/assets/{css-ywz9j4hb.js → css-i82qdo89.js} +1 -1
- package/static/dist/assets/cynefin-OW5HDTMX-d47op7qs.js +1 -0
- package/static/dist/assets/cynefinDiagram-5FMLGOSQ-doa7594y.js +62 -0
- package/static/dist/assets/cytoscape.esm-fjn2algp.js +321 -0
- package/static/dist/assets/dagre-GXQ25YYZ-os768dp4.js +4 -0
- package/static/dist/assets/dagre-o5jmjz46.js +1 -0
- package/static/dist/assets/{diagram-S7CK7UJ4-l8abxaes.js → diagram-S7CK7UJ4-fyi81nxd.js} +4 -4
- package/static/dist/assets/diagram-UQ7AKVKN-j3exggaq.js +41 -0
- package/static/dist/assets/{diagram-VSXAHHWV-fnky6lvc.js → diagram-VSXAHHWV-omo1en2l.js} +1 -1
- package/static/dist/assets/diagram-VX7I27RA-oro2cyu0.js +24 -0
- package/static/dist/assets/diagram-Z3DM3KII-byt9vdb7.js +24 -0
- package/static/dist/assets/dist-crc46di9.js +7 -0
- package/static/dist/assets/dist-etpoyscq.js +44 -0
- package/static/dist/assets/{dist-c4c2m3kv.js → dist-nb670eu6.js} +1 -1
- package/static/dist/assets/ebnfDiagram-PWID7BFC-ee3haugh.js +1 -0
- package/static/dist/assets/{edge-dvv35byi.js → edge-lrob635n.js} +1 -1
- package/static/dist/assets/{elixir-i2f1ki1g.js → elixir-kdpxeq93.js} +1 -1
- package/static/dist/assets/{elm-cpepyjm4.js → elm-c8irj9uh.js} +1 -1
- package/static/dist/assets/erDiagram-RLTQ6QDP-d1e93yff.js +99 -0
- package/static/dist/assets/{erb-idlyfheg.js → erb-flwsv146.js} +1 -1
- package/static/dist/assets/eventmodeling-NTZA5JFV-i1ihb40c.js +1 -0
- package/static/dist/assets/flowDiagram-HODETNUW-jahfpiod.js +1 -0
- package/static/dist/assets/folder-plus-ivoglq98.js +1 -0
- package/static/dist/assets/{ganttDiagram-EL5Y4UJY-ngbsyp37.js → ganttDiagram-EL5Y4UJY-m7g0jud4.js} +1 -1
- package/static/dist/assets/{git-rebase-d9lpfpbn.js → git-rebase-bli19aoq.js} +1 -1
- package/static/dist/assets/gitGraph-4MIJSDKK-hzdj07yy.js +1 -0
- package/static/dist/assets/{gitGraphDiagram-WWUBYQGX-eravdti4.js → gitGraphDiagram-WWUBYQGX-dm9agbna.js} +1 -1
- package/static/dist/assets/{glimmer-js-39i0urfb.js → glimmer-js-d4icg38p.js} +1 -1
- package/static/dist/assets/{glimmer-ts-gdtd6n73.js → glimmer-ts-bk75772u.js} +1 -1
- package/static/dist/assets/{glsl-o1djm5pp.js → glsl-lqormp2b.js} +1 -1
- package/static/dist/assets/{graphql-kj6rz55t.js → graphql-hw6s5qzd.js} +1 -1
- package/static/dist/assets/{hack-pe1qqr2i.js → hack-ozrv6l4d.js} +1 -1
- package/static/dist/assets/{haml-cknnbcqs.js → haml-gytfosdt.js} +1 -1
- package/static/dist/assets/{handlebars-hwq64orh.js → handlebars-b6g7jffd.js} +1 -1
- package/static/dist/assets/highlighted-body-KPVGNVTW-mmgz2czu.js +1 -0
- package/static/dist/assets/host-fr6lni1p.js +1 -0
- package/static/dist/assets/{html-derivative-h2i2pyjc.js → html-derivative-f1tqcroo.js} +1 -1
- package/static/dist/assets/{html-ha05xtvt.js → html-on6oj6yj.js} +1 -1
- package/static/dist/assets/{http-cf94zu27.js → http-odhufsl7.js} +1 -1
- package/static/dist/assets/{hurl-lslax568.js → hurl-mu680336.js} +1 -1
- package/static/dist/assets/index-73649w7o.js +10 -0
- package/static/dist/assets/index-lhf1fsdf.css +2 -0
- package/static/dist/assets/info-A6RAGUB7-lll1dqmm.js +1 -0
- package/static/dist/assets/infoDiagram-27XIBGKW-k7esc639.js +2 -0
- package/static/dist/assets/{ishikawaDiagram-5VMMS53U-i6ypq351.js → ishikawaDiagram-5VMMS53U-lgr6k9wo.js} +6 -6
- package/static/dist/assets/{java-ndjf2o89.js → java-nxbe8uju.js} +1 -1
- package/static/dist/assets/{javascript-coftlwy3.js → javascript-lz3kxcyz.js} +1 -1
- package/static/dist/assets/{jinja-etei9wy7.js → jinja-l5pk84gt.js} +1 -1
- package/static/dist/assets/{jison-hyekgft1.js → jison-jdutdwyy.js} +1 -1
- package/static/dist/assets/{journeyDiagram-3NMN7TZE-lduf1z95.js → journeyDiagram-3NMN7TZE-ndmbxuqk.js} +1 -1
- package/static/dist/assets/{json-lok0yaho.js → json-dnge4ssf.js} +1 -1
- package/static/dist/assets/{jsx-b64w0nbx.js → jsx-c3lwhkep.js} +1 -1
- package/static/dist/assets/{jsx-runtime-eu92a5pu.js → jsx-runtime-o40ukmjl.js} +1 -1
- package/static/dist/assets/{julia-jxxzz2yn.js → julia-hwd4rrcb.js} +1 -1
- package/static/dist/assets/{just-mc29iw9t.js → just-nka3oxdx.js} +1 -1
- package/static/dist/assets/{kanban-definition-UXKFOSKX-e18bu4pg.js → kanban-definition-UXKFOSKX-mjxym0jp.js} +28 -28
- package/static/dist/assets/katex-cbdd1ohw.css +1 -0
- package/static/dist/assets/katex-pbij2oo6.js +257 -0
- package/static/dist/assets/{latex-pafa03ft.js → latex-iqmr7e40.js} +1 -1
- package/static/dist/assets/lazyRouteComponent-cwb6l7xh.js +1 -0
- package/static/dist/assets/{line-meizqsvn.js → line-mtr5k6il.js} +1 -1
- package/static/dist/assets/linear-jlwrvvy6.js +1 -0
- package/static/dist/assets/link-iadw4ghw.js +2 -0
- package/static/dist/assets/{liquid-hz5c2pov.js → liquid-okmk9tbp.js} +1 -1
- package/static/dist/assets/locale-cs-n41hptse.js +5 -0
- package/static/dist/assets/locale-de-k7ht47ew.js +5 -0
- package/static/dist/assets/locale-es-ih078lco.js +5 -0
- package/static/dist/assets/locale-fr-ojabnf41.js +5 -0
- package/static/dist/assets/locale-it-kb96jufy.js +5 -0
- package/static/dist/assets/locale-ja-jpsp3xs1.js +7 -0
- package/static/dist/assets/locale-ko-cpzuy0n7.js +5 -0
- package/static/dist/assets/locale-pl-dbap4leu.js +5 -0
- package/static/dist/assets/locale-pt-nci7w72x.js +5 -0
- package/static/dist/assets/locale-ru-soghe4cs.js +7 -0
- package/static/dist/assets/locale-tr-ks00mu68.js +5 -0
- package/static/dist/assets/locale-vi-ij7twfm6.js +5 -0
- package/static/dist/assets/locale-zh-Hant-feakwr7a.js +5 -0
- package/static/dist/assets/locale-zh-ren0vjyv.js +7 -0
- package/static/dist/assets/login-lkhtzfcl.js +1 -0
- package/static/dist/assets/{lua-leyf8mlb.js → lua-krx4xj5h.js} +1 -1
- package/static/dist/assets/{marko-cn1fzpdv.js → marko-gbvpfehz.js} +1 -1
- package/static/dist/assets/{mdc-huhy88df.js → mdc-c21zlyi5.js} +1 -1
- package/static/dist/assets/mermaid-HWGCJPDP-jx0q5dm2.js +1 -0
- package/static/dist/assets/mermaid-parser.core-k91vdnvi.js +7 -0
- package/static/dist/assets/micromark-factory-space-fnmnpi6s.js +1 -0
- package/static/dist/assets/{mindmap-definition-YA3MSWOX-27b26eok.js → mindmap-definition-YA3MSWOX-ehztfea4.js} +28 -28
- package/static/dist/assets/{nginx-e7lvhsmn.js → nginx-f3d68ed4.js} +1 -1
- package/static/dist/assets/{nim-dun5d8mk.js → nim-dw0jcy70.js} +1 -1
- package/static/dist/assets/onboarding-f67z0a2r.js +1 -0
- package/static/dist/assets/packet-AYTQ26CC-ok2xrblz.js +1 -0
- package/static/dist/assets/pcmTap.worklet-74EKjWAZ.js +1 -0
- package/static/dist/assets/pegDiagram-XKGWAZYB-ec3rpj0m.js +1 -0
- package/static/dist/assets/{perl-bj3oqtet.js → perl-3c0r45c8.js} +1 -1
- package/static/dist/assets/{php-buzp12r0.js → php-rznhidvp.js} +1 -1
- package/static/dist/assets/pie-WAS4IAKB-iwkir23u.js +1 -0
- package/static/dist/assets/pieDiagram-E7YTZNPT-fcpqpekh.js +39 -0
- package/static/dist/assets/{pug-mjad7he9.js → pug-f2le4f3y.js} +1 -1
- package/static/dist/assets/{qml-d1gdp10s.js → qml-e2wbq9cr.js} +1 -1
- package/static/dist/assets/{quadrantDiagram-AXDQQJYC-hhue7d8o.js → quadrantDiagram-AXDQQJYC-lqsync43.js} +1 -1
- package/static/dist/assets/queryKeys-ed4n2egc.js +9 -0
- package/static/dist/assets/{r-o3r9c7ao.js → r-epfzuw6q.js} +1 -1
- package/static/dist/assets/radar-RG4KPBEZ-hje4jbk6.js +1 -0
- package/static/dist/assets/railroad-74A4TZTK-gll9n6qi.js +1 -0
- package/static/dist/assets/railroad-abnf-HS5TGJTU-o6h6lpn4.js +1 -0
- package/static/dist/assets/railroad-ebnf-LZEXJU2U-juaefj6o.js +1 -0
- package/static/dist/assets/railroad-peg-WCYAUIDC-cgfhvpah.js +1 -0
- package/static/dist/assets/railroadDiagram-O6MQD6OU-lp3w7awf.js +1 -0
- package/static/dist/assets/{razor-ilc585yr.js → razor-pea1u1d0.js} +1 -1
- package/static/dist/assets/refresh-cw-iccm7a4e.js +1 -0
- package/static/dist/assets/refresh-i9ya9dvl.js +1 -0
- package/static/dist/assets/{regexp-mpjtcvwm.js → regexp-hzte0a5x.js} +1 -1
- package/static/dist/assets/registry-g7w3353u.js +1 -0
- package/static/dist/assets/requirementDiagram-BXWQKSXE-ha8eibcf.js +84 -0
- package/static/dist/assets/rolldown-runtime-bnnw9q4a.js +1 -0
- package/static/dist/assets/{rst-jrkwjdyi.js → rst-m6tugj5o.js} +1 -1
- package/static/dist/assets/{ruby-n4tjcbpz.js → ruby-l19vq3w1.js} +1 -1
- package/static/dist/assets/runtime-nlxpnegr.js +1 -0
- package/static/dist/assets/{sankeyDiagram-P5KCCOFB-fqb8xcjf.js → sankeyDiagram-P5KCCOFB-oxf31pr9.js} +1 -1
- package/static/dist/assets/{sas-hjo6y93k.js → sas-ktdxo397.js} +1 -1
- package/static/dist/assets/{scss-ncidjv48.js → scss-kn3oxfwf.js} +1 -1
- package/static/dist/assets/{sequenceDiagram-WJ2MYXX4-dlcz6qjz.js → sequenceDiagram-WJ2MYXX4-jiq8lhyo.js} +11 -11
- package/static/dist/assets/settings_section_extensions_title-fadc7o65.js +1 -0
- package/static/dist/assets/share._token-o76ki0ly.js +2 -0
- package/static/dist/assets/{shellscript-m8whjpqd.js → shellscript-l100jtrg.js} +1 -1
- package/static/dist/assets/{shellsession-i5bj6syz.js → shellsession-m5qukwow.js} +1 -1
- package/static/dist/assets/sizeCapture-INFHLROL-dk1io13w.js +1 -0
- package/static/dist/assets/sliders-horizontal-ddcs88av.js +1 -0
- package/static/dist/assets/{soy-hhh36ysq.js → soy-mexlscur.js} +1 -1
- package/static/dist/assets/{sql-j21bzcl6.js → sql-o0ho5suh.js} +1 -1
- package/static/dist/assets/src-h89s0hs4.js +1 -0
- package/static/dist/assets/{stata-bbu2onh1.js → stata-be9ck1q3.js} +1 -1
- package/static/dist/assets/stateDiagram-D77RDMKH-f3fslnon.js +1 -0
- package/static/dist/assets/stateDiagram-v2-MP3YSRHH-hlt6yphw.js +1 -0
- package/static/dist/assets/{surrealql-l5vczuco.js → surrealql-gk1xkkyy.js} +1 -1
- package/static/dist/assets/{svelte-idn422g6.js → svelte-k6ecjilf.js} +1 -1
- package/static/dist/assets/swimlanes-42K2YHIH-k1hmk7jf.js +1 -0
- package/static/dist/assets/swimlanesDiagram-VR7AAH4N-hd5t9tnt.js +8 -0
- package/static/dist/assets/{templ-e22qou3c.js → templ-gf3bftk6.js} +1 -1
- package/static/dist/assets/{tex-deqpc5ee.js → tex-d21fqv1z.js} +1 -1
- package/static/dist/assets/{timeline-definition-24CTP7MA-b1vl2zil.js → timeline-definition-24CTP7MA-n3ncfy9r.js} +8 -8
- package/static/dist/assets/toast-liparz2j.js +56 -0
- package/static/dist/assets/treeView-Q6P3EWNA-l3y2pejt.js +1 -0
- package/static/dist/assets/treemap-WGGIJYW6-jown9axh.js +1 -0
- package/static/dist/assets/{ts-tags-ctnibc27.js → ts-tags-n0g61gr6.js} +1 -1
- package/static/dist/assets/{tsx-i163n32g.js → tsx-cvv7wv6q.js} +1 -1
- package/static/dist/assets/{twig-x0fi7wm8.js → twig-n1f67204.js} +1 -1
- package/static/dist/assets/{typescript-g18c34xz.js → typescript-og7o55cx.js} +1 -1
- package/static/dist/assets/untitled-mj86r4gz.js +1 -0
- package/static/dist/assets/useDebounced-g8r0ggve.js +1 -0
- package/static/dist/assets/useForm-o4uu74mx.js +1 -0
- package/static/dist/assets/{useParams-b4dq6n4q.js → useParams-ftsveu84.js} +1 -1
- package/static/dist/assets/{useSearch-ipfmv3he.js → useSearch-crqueqga.js} +1 -1
- package/static/dist/assets/vennDiagram-4TSXK5OY-dh59uq1c.js +34 -0
- package/static/dist/assets/{vue-mwu5l1bb.js → vue-ej4xpwqw.js} +1 -1
- package/static/dist/assets/{vue-html-nskj3du0.js → vue-html-d48xsjuo.js} +1 -1
- package/static/dist/assets/{vue-vine-cqe77smq.js → vue-vine-pev88ip6.js} +1 -1
- package/static/dist/assets/wardley-WFR3VGLG-e6d74b0j.js +1 -0
- package/static/dist/assets/wardleyDiagram-VM6X3IG4-hnofh78f.js +78 -0
- package/static/dist/assets/with-selector-nu1b5z0v.js +1 -0
- package/static/dist/assets/{xml-gau7gvrv.js → xml-ifxp6gqb.js} +1 -1
- package/static/dist/assets/{xsl-ew09zq8b.js → xsl-fug2cckc.js} +1 -1
- package/static/dist/assets/{xychartDiagram-S5SC5T6Z-e49523ab.js → xychartDiagram-S5SC5T6Z-bpymjelb.js} +6 -6
- package/static/dist/assets/{yaml-ofnrxtvf.js → yaml-fjmafnlo.js} +1 -1
- package/static/dist/extension-sdk.js +1 -1
- package/static/dist/index.html +1 -1
- package/static/dist/sw.js +180 -136
- package/static/dist/assets/AppShell-g3bkgnvt.js +0 -1
- package/static/dist/assets/ChatPage-oo7bdan6.js +0 -25
- package/static/dist/assets/Dialog-g355qxhp.js +0 -1
- package/static/dist/assets/ExtensionRoute-i2y9fvjm.js +0 -1
- package/static/dist/assets/HubRoute-lmkrbw47.js +0 -2
- package/static/dist/assets/Markdown-j4kut4j2.js +0 -598
- package/static/dist/assets/Markdown-lwviulmg.css +0 -1
- package/static/dist/assets/RightPanel-ohlsdzfl.js +0 -1
- package/static/dist/assets/Select-kddq75qc.js +0 -1
- package/static/dist/assets/SessionListPanel-lu3oy0hw.js +0 -1
- package/static/dist/assets/SettingsLayout-o9bv4mgb.js +0 -1
- package/static/dist/assets/States-eq6fe29m.js +0 -1
- package/static/dist/assets/Toaster-pc247u9f.js +0 -1
- package/static/dist/assets/_app-f8n1i0m1.js +0 -1
- package/static/dist/assets/_app.ext._extensionId-gfbzpoou.js +0 -1
- package/static/dist/assets/_app.index-bzzv80hk.js +0 -1
- package/static/dist/assets/_app.insights-dzixbryi.js +0 -1
- package/static/dist/assets/_app.kanban-c6hep2us.js +0 -1
- package/static/dist/assets/_app.logs-i69qds98.js +0 -1
- package/static/dist/assets/_app.memory-kl4vf0gd.js +0 -1
- package/static/dist/assets/_app.profiles-b8zinmyp.js +0 -1
- package/static/dist/assets/_app.session._sessionId-fn1bhde6.js +0 -1
- package/static/dist/assets/_app.settings-cg8plwmf.js +0 -1
- package/static/dist/assets/_app.settings._section-bkwbi9zn.js +0 -3
- package/static/dist/assets/_app.skills-cs47sbvs.js +0 -1
- package/static/dist/assets/_app.tasks-dwvk64tc.js +0 -1
- package/static/dist/assets/_app.todos-c8xjm8p3.js +0 -1
- package/static/dist/assets/_app.workspaces-ehvd1gds.js +0 -1
- package/static/dist/assets/abnfDiagram-VCTEODGH-c8kdixke.js +0 -1
- package/static/dist/assets/architecture-7GRP2DOG-6crvnylg.js +0 -1
- package/static/dist/assets/architectureDiagram-5GKGNRK7-cku06x1p.js +0 -36
- package/static/dist/assets/back-h7aun7ew.js +0 -1
- package/static/dist/assets/cancel-fhi0vcnu.js +0 -1
- package/static/dist/assets/channel-b2zo73z1.js +0 -1
- package/static/dist/assets/chunk-DU6HZSFF-ofajdixh.js +0 -128
- package/static/dist/assets/chunk-OSK3NFVY-e7gkikcw.js +0 -10
- package/static/dist/assets/classDiagram-ZZMXUADV-oe99st8x.js +0 -1
- package/static/dist/assets/classDiagram-v2-VYDZK3BY-oe99st8x.js +0 -1
- package/static/dist/assets/copied-hcplv46p.js +0 -1
- package/static/dist/assets/copy-magtofyp.js +0 -1
- package/static/dist/assets/cose-bilkent-JH36ORCC-eclcy6ja.js +0 -1
- package/static/dist/assets/cynefin-OW5HDTMX-siqlulkl.js +0 -1
- package/static/dist/assets/cynefinDiagram-5FMLGOSQ-i648tah9.js +0 -62
- package/static/dist/assets/cytoscape.esm-bqu53u12.js +0 -321
- package/static/dist/assets/dagre-GXQ25YYZ-mwn6uc17.js +0 -4
- package/static/dist/assets/dagre-lkoknbjn.js +0 -1
- package/static/dist/assets/diagram-UQ7AKVKN-mekq7zgq.js +0 -41
- package/static/dist/assets/diagram-VX7I27RA-xe6r5qfw.js +0 -24
- package/static/dist/assets/diagram-Z3DM3KII-nq07dg7k.js +0 -24
- package/static/dist/assets/ebnfDiagram-PWID7BFC-c62ipm3g.js +0 -1
- package/static/dist/assets/endpoints-klbxod4t.js +0 -64
- package/static/dist/assets/erDiagram-RLTQ6QDP-h39kmnzy.js +0 -99
- package/static/dist/assets/eventmodeling-NTZA5JFV-obfede4u.js +0 -1
- package/static/dist/assets/flowDiagram-HODETNUW-kdpsp1je.js +0 -1
- package/static/dist/assets/gitGraph-4MIJSDKK-fr2i7caa.js +0 -1
- package/static/dist/assets/highlighted-body-KPVGNVTW-jwpop9p8.js +0 -1
- package/static/dist/assets/host-i828xuo7.js +0 -1
- package/static/dist/assets/index-eh8zilnv.css +0 -2
- package/static/dist/assets/index-r648f4o1.js +0 -11
- package/static/dist/assets/info-A6RAGUB7-h11x0dxo.js +0 -1
- package/static/dist/assets/infoDiagram-27XIBGKW-dfh47dw9.js +0 -2
- package/static/dist/assets/lazyRouteComponent-e1y4t2i9.js +0 -1
- package/static/dist/assets/linear-becwlnhk.js +0 -1
- package/static/dist/assets/link-oot2yn73.js +0 -1
- package/static/dist/assets/login-gu28l9ou.js +0 -1
- package/static/dist/assets/mermaid-HWGCJPDP-mtwrj8fn.js +0 -1
- package/static/dist/assets/mermaid-parser.core-ntne45i9.js +0 -7
- package/static/dist/assets/not-found-ccnnac39.js +0 -1
- package/static/dist/assets/onboarding-lkphzu1s.js +0 -1
- package/static/dist/assets/onboarding_model_label-ftpjdwqk.js +0 -1
- package/static/dist/assets/packet-AYTQ26CC-l6jdka8p.js +0 -1
- package/static/dist/assets/pegDiagram-XKGWAZYB-g1er3bxj.js +0 -1
- package/static/dist/assets/pie-WAS4IAKB-i0ylcrt9.js +0 -1
- package/static/dist/assets/pieDiagram-E7YTZNPT-fbz1e55z.js +0 -39
- package/static/dist/assets/radar-RG4KPBEZ-f9b70aa4.js +0 -1
- package/static/dist/assets/railroad-74A4TZTK-lgsuoeda.js +0 -1
- package/static/dist/assets/railroad-abnf-HS5TGJTU-nf9d6pdx.js +0 -1
- package/static/dist/assets/railroad-ebnf-LZEXJU2U-f7ummkt5.js +0 -1
- package/static/dist/assets/railroad-peg-WCYAUIDC-oczq5tqs.js +0 -1
- package/static/dist/assets/railroadDiagram-O6MQD6OU-eqpy9fnz.js +0 -1
- package/static/dist/assets/refresh-abtu93ke.js +0 -1
- package/static/dist/assets/refresh-cw-hlwb02qv.js +0 -1
- package/static/dist/assets/requirementDiagram-BXWQKSXE-ogf6puhi.js +0 -84
- package/static/dist/assets/rolldown-runtime-b9miacsj.js +0 -1
- package/static/dist/assets/root-mbklpuv4.js +0 -1
- package/static/dist/assets/saved-girnabkf.js +0 -1
- package/static/dist/assets/settings_section_extensions_title-h14cwk6f.js +0 -1
- package/static/dist/assets/share._token-kl0r7ido.js +0 -2
- package/static/dist/assets/sizeCapture-INFHLROL-g612l48j.js +0 -1
- package/static/dist/assets/sliders-horizontal-n1zm34qq.js +0 -1
- package/static/dist/assets/src-hjyib4mu.js +0 -1
- package/static/dist/assets/sse-iwku0sjo.js +0 -1
- package/static/dist/assets/stateDiagram-D77RDMKH-fyoznpcs.js +0 -1
- package/static/dist/assets/stateDiagram-v2-MP3YSRHH-ixhx8r46.js +0 -1
- package/static/dist/assets/swimlanes-42K2YHIH-oefldhfy.js +0 -1
- package/static/dist/assets/swimlanesDiagram-VR7AAH4N-h9ersk2e.js +0 -8
- package/static/dist/assets/todoStore-jjr5yr78.js +0 -1
- package/static/dist/assets/treeView-Q6P3EWNA-f7hcci5o.js +0 -1
- package/static/dist/assets/treemap-WGGIJYW6-nl85071a.js +0 -1
- package/static/dist/assets/units-kgxzxfhi.js +0 -1
- package/static/dist/assets/untitled-cikfjntn.js +0 -1
- package/static/dist/assets/useForm-kqoqg0k9.js +0 -1
- package/static/dist/assets/useLocale-o59tbiea.js +0 -1
- package/static/dist/assets/vennDiagram-4TSXK5OY-h5hzbk0n.js +0 -34
- package/static/dist/assets/wardley-WFR3VGLG-jftvpm3e.js +0 -1
- package/static/dist/assets/wardleyDiagram-VM6X3IG4-hedh85ge.js +0 -78
- /package/static/dist/assets/{ChatPage-gmu5c7lf.css → TerminalPanel-gmu5c7lf.css} +0 -0
|
@@ -1,10 +1,14 @@
|
|
|
1
|
-
"""``worktree.*``: Hermes Agent git worktree creation (``hermes_cli.worktree_ops._setup_worktree``)."""
|
|
1
|
+
"""``worktree.*``: Hermes Agent git worktree creation (``hermes_cli.worktree_ops._setup_worktree``) and lock retention."""
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
import contextlib
|
|
5
6
|
import io
|
|
6
7
|
import logging
|
|
8
|
+
import os
|
|
9
|
+
import re
|
|
7
10
|
import subprocess
|
|
11
|
+
import uuid
|
|
8
12
|
from contextlib import redirect_stderr, redirect_stdout
|
|
9
13
|
from pathlib import Path
|
|
10
14
|
|
|
@@ -15,26 +19,136 @@ from ..rpc import CallContext
|
|
|
15
19
|
log = logging.getLogger("talaria_sidecar.worktree")
|
|
16
20
|
|
|
17
21
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
22
|
+
# Repository config can name a program for a filter driver its .gitattributes selects; the checkout runs it. A
|
|
23
|
+
# conditional include (onbranch:, gitdir:) can hold one back until the new worktree's checkout, so it counts too.
|
|
24
|
+
_REPO_FILTER_KEYS = r"^(filter\..*\.(smudge|clean|process)|includeif\..*\.path)$"
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _refuse_unneutralized_repo_filters(repo_root: str) -> None:
|
|
28
|
+
"""Agents before v0.21.6 check out with the repository's filter programs live; refuse a repo that configures one.
|
|
21
29
|
|
|
22
|
-
|
|
23
|
-
|
|
30
|
+
Only global and system config are the user's own; any other scope (local, worktree, an include from either) is
|
|
31
|
+
the repository's. Unreadable config fails closed, matching the Agent's own refusal from v0.21.6, and so does any
|
|
32
|
+
repository conditional include: this probe cannot evaluate it for the branch and gitdir the worktree will have.
|
|
33
|
+
"""
|
|
34
|
+
try:
|
|
35
|
+
from hermes_cli._subprocess_compat import noninteractive_repo_git_env # noqa: F401 - v0.21.6+ neutralizes them
|
|
36
|
+
return
|
|
37
|
+
except ImportError:
|
|
24
38
|
pass
|
|
39
|
+
probe = subprocess.run(["git", "-C", repo_root, "config", "--includes", "--show-scope", "-z", "--get-regexp", _REPO_FILTER_KEYS],
|
|
40
|
+
text=True, capture_output=True, timeout=5, check=False, stdin=subprocess.DEVNULL)
|
|
41
|
+
# -z --show-scope answers "<scope>\0<key>\n<value>\0" per match.
|
|
42
|
+
scopes = set(probe.stdout.split("\0")[::2]) - {""}
|
|
43
|
+
if probe.returncode not in (0, 1) or scopes - {"global", "system"}:
|
|
44
|
+
raise RpcError("This repository's git config can run filter programs; update Hermes Agent to v0.21.6 or later to create a worktree here",
|
|
45
|
+
condition="worktree_unsafe_repo")
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
# The Agent's own lock contract (``worktree_ops._worktree_lock_is_live``): its sweep keeps a tree whose ``hermes pid=`` owner runs.
|
|
49
|
+
_HERMES_PID_LOCK = re.compile(r"hermes pid=(\d+)(?: db=.+)?", re.DOTALL)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _pid_alive(pid: int) -> bool:
|
|
53
|
+
try:
|
|
54
|
+
os.kill(pid, 0)
|
|
55
|
+
except (ProcessLookupError, OverflowError): # gone, or a pid no process can have
|
|
56
|
+
return False
|
|
57
|
+
except OSError:
|
|
58
|
+
return True # exists, owned by someone else
|
|
59
|
+
return True
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
# Only these say the tree or its registration is gone; any other read failure leaves the tree unconfirmed (raised).
|
|
63
|
+
_GONE = (FileNotFoundError, NotADirectoryError, IsADirectoryError)
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def _admin_dir(tree: Path) -> Path | None:
|
|
67
|
+
"""The tree's ``<common-dir>/worktrees/<name>`` entry when git still registers it as a linked worktree."""
|
|
68
|
+
try:
|
|
69
|
+
link = (tree / ".git").read_text(encoding="utf-8-sig")
|
|
70
|
+
except _GONE:
|
|
71
|
+
return None
|
|
72
|
+
if not link.startswith("gitdir:"):
|
|
73
|
+
return None
|
|
74
|
+
admin = (tree / link[len("gitdir:"):].strip()).resolve()
|
|
75
|
+
try:
|
|
76
|
+
registered = Path((admin / "gitdir").read_text(encoding="utf-8-sig").strip()).resolve()
|
|
77
|
+
except _GONE:
|
|
78
|
+
return None
|
|
79
|
+
return admin if admin.parent.name == "worktrees" and registered == (tree / ".git").resolve() else None
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def _take_lock(admin: Path, expected: str) -> bool:
|
|
83
|
+
"""Remove the tree's lock only while it still reads ``expected``: it is moved aside first, so a lock written since it
|
|
84
|
+
was read is never deleted; anything else is put back unless a newer lock already holds the tree."""
|
|
85
|
+
lock, aside = admin / "locked", admin / f"locked.talaria-{uuid.uuid4().hex}"
|
|
86
|
+
try:
|
|
87
|
+
os.rename(lock, aside)
|
|
88
|
+
except FileNotFoundError:
|
|
89
|
+
return True
|
|
25
90
|
try:
|
|
26
|
-
|
|
91
|
+
stale = aside.read_text(encoding="utf-8-sig", errors="replace").strip(" \t\n\v\f\r") == expected
|
|
92
|
+
except OSError:
|
|
93
|
+
stale = False
|
|
94
|
+
if not stale:
|
|
95
|
+
try:
|
|
96
|
+
os.link(aside, lock)
|
|
97
|
+
except FileExistsError:
|
|
98
|
+
pass # a newer lock holds the tree
|
|
99
|
+
except OSError:
|
|
100
|
+
# No hard link here: move it back whole, never leave the tree unlocked by dropping it.
|
|
101
|
+
with contextlib.suppress(OSError):
|
|
102
|
+
os.rename(aside, lock)
|
|
103
|
+
return False
|
|
104
|
+
aside.unlink(missing_ok=True)
|
|
105
|
+
return stale
|
|
27
106
|
|
|
28
|
-
import hermes_cli
|
|
29
107
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
108
|
+
def retain(path: str) -> str:
|
|
109
|
+
"""Lock a Talaria worktree for this process, so the Agent's sweep reads its lock live (TAL-1254).
|
|
110
|
+
|
|
111
|
+
``missing`` when the tree is gone or git no longer registers it; ``foreign_lock`` when a lock that is not a ``hermes
|
|
112
|
+
pid=`` lock (a user's own) holds it, which stays untouched. A ``hermes pid=`` lock of an exited process is replaced;
|
|
113
|
+
one of a live other process (a reused pid, another instance) is left alone and raises, so the caller retries until
|
|
114
|
+
this sidecar holds the lock.
|
|
115
|
+
"""
|
|
116
|
+
tree = Path(path)
|
|
117
|
+
admin = _admin_dir(tree)
|
|
118
|
+
if admin is None:
|
|
119
|
+
return "missing"
|
|
120
|
+
ours = f"hermes pid={os.getpid()}"
|
|
121
|
+
try:
|
|
122
|
+
reason = (admin / "locked").read_text(encoding="utf-8-sig", errors="replace").strip(" \t\n\v\f\r")
|
|
123
|
+
except FileNotFoundError:
|
|
124
|
+
reason = None
|
|
125
|
+
if reason == ours:
|
|
126
|
+
return "retained"
|
|
127
|
+
if reason is not None:
|
|
128
|
+
lock = _HERMES_PID_LOCK.fullmatch(reason)
|
|
129
|
+
if lock is None:
|
|
130
|
+
return "foreign_lock"
|
|
131
|
+
if int(lock.group(1)) != os.getpid() and _pid_alive(int(lock.group(1))):
|
|
132
|
+
raise OSError(f"locked by running pid {lock.group(1)}")
|
|
133
|
+
if not _take_lock(admin, reason):
|
|
134
|
+
raise OSError("the lock changed while it was being replaced")
|
|
135
|
+
# git refuses to lock a tree someone locked meanwhile, so that lock stays too.
|
|
136
|
+
locked = subprocess.run(["git", "-C", str(tree), "worktree", "lock", "--reason", ours, str(tree)],
|
|
137
|
+
capture_output=True, timeout=10, check=False, stdin=subprocess.DEVNULL)
|
|
138
|
+
if locked.returncode != 0:
|
|
139
|
+
raise OSError(locked.stderr.decode(errors="replace").strip() or "git worktree lock failed")
|
|
140
|
+
return "retained"
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def retain_all(paths: list[str]) -> dict[str, str]:
|
|
144
|
+
"""``retain`` per path; a tree this sidecar cannot lock now is left out (unknown), never reported missing."""
|
|
145
|
+
results = {}
|
|
146
|
+
for path in dict.fromkeys(paths):
|
|
147
|
+
try:
|
|
148
|
+
results[path] = retain(path)
|
|
149
|
+
except (OSError, subprocess.SubprocessError) as exc:
|
|
150
|
+
log.warning("Could not retain worktree %s: %s", path, exc)
|
|
151
|
+
return results
|
|
38
152
|
|
|
39
153
|
|
|
40
154
|
def create(repo_root: str) -> dict:
|
|
@@ -44,17 +158,22 @@ def create(repo_root: str) -> dict:
|
|
|
44
158
|
probe = subprocess.run(["git", "rev-parse", "--show-toplevel"], cwd=str(root), text=True, capture_output=True, timeout=5, check=False)
|
|
45
159
|
if probe.returncode != 0 or not probe.stdout.strip():
|
|
46
160
|
raise RpcError("Workspace is not inside a git repository", condition="not_a_repo")
|
|
47
|
-
|
|
161
|
+
repo = str(Path(probe.stdout.strip()).resolve())
|
|
162
|
+
_refuse_unneutralized_repo_filters(repo)
|
|
163
|
+
from hermes_cli.worktree_ops import _setup_worktree
|
|
164
|
+
|
|
48
165
|
output = io.StringIO()
|
|
49
166
|
with redirect_stdout(output), redirect_stderr(output):
|
|
50
|
-
info =
|
|
167
|
+
info = _setup_worktree(repo)
|
|
51
168
|
emitted = output.getvalue().strip()
|
|
52
169
|
if emitted:
|
|
53
170
|
log.debug("Hermes Agent worktree helper output: %s", emitted)
|
|
54
171
|
if not info or not info.get("path") or not info.get("branch"):
|
|
55
172
|
raise RpcError("Hermes Agent failed to create a git worktree", condition="worktree_failed")
|
|
173
|
+
path = str(Path(info["path"]).expanduser().resolve())
|
|
174
|
+
retain_all([path]) # one owner for Talaria's lock text
|
|
56
175
|
return {
|
|
57
|
-
"path":
|
|
176
|
+
"path": path,
|
|
58
177
|
"branch": str(info["branch"]),
|
|
59
178
|
"repo_root": str(Path(info.get("repo_root") or probe.stdout.strip()).expanduser().resolve()),
|
|
60
179
|
"base": str(info["base"]) if info.get("base") else None,
|
|
@@ -69,3 +188,10 @@ def register(registry) -> None:
|
|
|
69
188
|
raise InvalidParams("repo_root is required")
|
|
70
189
|
with scoped_home(profile_home_param(params)):
|
|
71
190
|
return create(repo_root)
|
|
191
|
+
|
|
192
|
+
@registry.method("worktree.retain")
|
|
193
|
+
def retain_(ctx: CallContext, params: dict) -> dict:
|
|
194
|
+
paths = params.get("paths")
|
|
195
|
+
if not isinstance(paths, list) or not all(isinstance(p, str) and p for p in paths):
|
|
196
|
+
raise InvalidParams("paths must be a list of worktree paths")
|
|
197
|
+
return {"results": retain_all(paths)}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
"""``write_approval.*``: the Agent's staged skill and memory writes (TAL-819).
|
|
2
|
+
|
|
3
|
+
With ``skills.write_approval`` or ``memory.write_approval`` on, the Agent stages writes under
|
|
4
|
+
``<home>/pending/<kind>/<id>.json`` instead of committing them. These methods list them with
|
|
5
|
+
the diff an approval would apply, and approve or reject them through the Agent's own
|
|
6
|
+
``/skills`` and ``/memory`` review handlers.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import contextlib
|
|
12
|
+
import difflib
|
|
13
|
+
import hashlib
|
|
14
|
+
import re
|
|
15
|
+
import tempfile
|
|
16
|
+
import threading
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
|
|
19
|
+
from ..errors import InvalidParams, RpcError
|
|
20
|
+
from ..home import profile_home_param, scoped_home
|
|
21
|
+
from ..rpc import CallContext
|
|
22
|
+
|
|
23
|
+
KINDS = ("skills", "memory")
|
|
24
|
+
# The Agent names records ``uuid4().hex[:8]`` and builds their path from the id; anything else could leave the pending dir.
|
|
25
|
+
_ID = re.compile(r"[A-Za-z0-9_-]{1,64}")
|
|
26
|
+
# One review at a time in this process, so two approvals of one record cannot both replay it.
|
|
27
|
+
_LOCK = threading.Lock()
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _agent():
|
|
31
|
+
try:
|
|
32
|
+
from hermes_cli import write_approval_commands
|
|
33
|
+
from tools import write_approval
|
|
34
|
+
except ImportError as exc:
|
|
35
|
+
raise RpcError("This Hermes Agent cannot review staged writes", condition="write_approval_unavailable") from exc
|
|
36
|
+
return write_approval, write_approval_commands
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _kind(params: dict) -> str:
|
|
40
|
+
kind = str(params.get("kind") or "")
|
|
41
|
+
if kind not in KINDS:
|
|
42
|
+
raise InvalidParams("kind must be skills or memory")
|
|
43
|
+
return kind
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _memory_diff(payload: dict) -> str:
|
|
47
|
+
"""Replay the record on a scratch copy of its file through the Agent's approve path; the diff is what approval commits."""
|
|
48
|
+
from tools.memory_tool import ENTRY_DELIMITER, apply_memory_pending, load_on_disk_store
|
|
49
|
+
|
|
50
|
+
store = load_on_disk_store()
|
|
51
|
+
target = "user" if payload.get("target") == "user" else "memory"
|
|
52
|
+
real = store._path_for(target)
|
|
53
|
+
before = list(store._entries_for(target))
|
|
54
|
+
with tempfile.TemporaryDirectory(prefix="talaria-pending-") as scratch:
|
|
55
|
+
copy = Path(scratch) / real.name
|
|
56
|
+
if real.is_file():
|
|
57
|
+
copy.write_bytes(real.read_bytes())
|
|
58
|
+
# The store resolves every read, lock and write through ``self._path_for``.
|
|
59
|
+
store._path_for = lambda t: Path(scratch) / ("USER.md" if t == "user" else "MEMORY.md")
|
|
60
|
+
result = apply_memory_pending(payload, store)
|
|
61
|
+
after = list(store._entries_for(target))
|
|
62
|
+
if not result.get("success"):
|
|
63
|
+
raise _Unapprovable(f"(approve would fail: {result.get('error') or 'unknown error'})")
|
|
64
|
+
lines = lambda entries: ENTRY_DELIMITER.join(entries).splitlines(keepends=True) # noqa: E731
|
|
65
|
+
diff = difflib.unified_diff(lines(before), lines(after), fromfile=f"a/{real.name}", tofile=f"b/{real.name}")
|
|
66
|
+
return "".join(diff) or "(no textual change)"
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class _Unapprovable(Exception):
|
|
70
|
+
"""A write with no diff the user could review: its message replaces the diff and approval is refused."""
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def _skill_names(payload: dict) -> list[str]:
|
|
74
|
+
ops = payload.get("operations") or [] if payload.get("action") == "batch" else [payload]
|
|
75
|
+
return list(dict.fromkeys(str(op.get("name")) for op in ops if isinstance(op, dict) and op.get("name")))
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def _item(wa, kind: str, record: dict) -> dict:
|
|
79
|
+
payload = record.get("payload") if isinstance(record.get("payload"), dict) else {}
|
|
80
|
+
if kind == "memory":
|
|
81
|
+
target = "user" if payload.get("target") == "user" else "memory"
|
|
82
|
+
else:
|
|
83
|
+
target = ", ".join(_skill_names(payload))
|
|
84
|
+
diff, approvable = _diff(wa, kind, record)
|
|
85
|
+
return {
|
|
86
|
+
"id": str(record.get("id") or ""), "kind": kind, "target": target, "op": str(payload.get("action") or record.get("action") or ""),
|
|
87
|
+
"summary": str(record.get("summary") or ""), "origin": str(record.get("origin") or "foreground"),
|
|
88
|
+
"created_at": float(record.get("created_at") or 0), "diff": diff,
|
|
89
|
+
"approvable": approvable, "revision": _revision(diff) if approvable else "",
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def _diff(wa, kind: str, record: dict) -> tuple[str, bool]:
|
|
94
|
+
"""The diff approving ``record`` applies and whether it may be approved; a diff that cannot be built is never approvable."""
|
|
95
|
+
payload = record.get("payload") if isinstance(record.get("payload"), dict) else {}
|
|
96
|
+
try:
|
|
97
|
+
return (_memory_diff(payload) if kind == "memory" else wa.skill_pending_diff(record)), True
|
|
98
|
+
except _Unapprovable as exc:
|
|
99
|
+
return str(exc), False
|
|
100
|
+
except Exception as exc: # noqa: BLE001 - one unreadable record must not hide the rest
|
|
101
|
+
return f"(diff unavailable: {exc})", False
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def _apply_lock(kind: str, record: dict):
|
|
105
|
+
"""Hold the Agent's own per-skill locks across the revision check and the apply (they are re-entrant in this thread, so
|
|
106
|
+
the Agent's apply takes them again). Memory needs none: the Agent applies a staged remove/patch only to the exact entry
|
|
107
|
+
it pinned at staging and an add only appends, so a concurrent write can never be dropped by an approval."""
|
|
108
|
+
if kind != "skills":
|
|
109
|
+
return contextlib.nullcontext()
|
|
110
|
+
from tools.skill_manager_tool import _skill_mutation_locks
|
|
111
|
+
|
|
112
|
+
return _skill_mutation_locks(_skill_names(record.get("payload") if isinstance(record.get("payload"), dict) else {}))
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def _revision(diff: str) -> str:
|
|
116
|
+
"""What the reviewer saw: the diff changes whenever the record or the file it applies to does."""
|
|
117
|
+
return hashlib.sha256(diff.encode("utf-8")).hexdigest()
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def pending(kind: str) -> dict:
|
|
121
|
+
try:
|
|
122
|
+
wa, _ = _agent()
|
|
123
|
+
except RpcError:
|
|
124
|
+
return {"supported": False, "enabled": False, "items": []}
|
|
125
|
+
items = [_item(wa, kind, record) for record in wa.list_pending(kind) if _ID.fullmatch(str(record.get("id") or ""))]
|
|
126
|
+
return {"supported": True, "enabled": wa.write_approval_enabled(kind), "items": items}
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def review(kind: str, verb: str, writes: list[dict]) -> dict:
|
|
130
|
+
"""``approve`` or ``reject`` each write through the Agent's handler; a record that is gone afterwards was applied or dropped.
|
|
131
|
+
|
|
132
|
+
An approval applies only while the write's diff still has the ``revision`` the reviewer saw; a changed file or record
|
|
133
|
+
is refused, so nothing lands that the user did not review.
|
|
134
|
+
"""
|
|
135
|
+
wa, commands = _agent()
|
|
136
|
+
if not writes or any(not (isinstance(w, dict) and _ID.fullmatch(str(w.get("id") or "")) and isinstance(w.get("revision"), str)) for w in writes):
|
|
137
|
+
raise InvalidParams("writes must be pending write ids with the revision reviewed")
|
|
138
|
+
results = []
|
|
139
|
+
with _LOCK:
|
|
140
|
+
for write in writes:
|
|
141
|
+
pending_id = write["id"]
|
|
142
|
+
record = wa.get_pending(kind, pending_id)
|
|
143
|
+
if record is None:
|
|
144
|
+
results.append({"id": pending_id, "done": False, "message": f"No pending {kind} write with id '{pending_id}'."})
|
|
145
|
+
continue
|
|
146
|
+
if verb == "reject":
|
|
147
|
+
message = commands.handle_pending_subcommand(kind, [verb, pending_id]) or ""
|
|
148
|
+
else:
|
|
149
|
+
with _apply_lock(kind, record):
|
|
150
|
+
diff, approvable = _diff(wa, kind, record)
|
|
151
|
+
if not approvable:
|
|
152
|
+
results.append({"id": pending_id, "done": False, "message": f"This write cannot be approved: {diff}"})
|
|
153
|
+
continue
|
|
154
|
+
if _revision(diff) != write["revision"]:
|
|
155
|
+
results.append({"id": pending_id, "done": False, "message": "This write's diff changed after you reviewed it. Review the new diff, then approve again."})
|
|
156
|
+
continue
|
|
157
|
+
store = None
|
|
158
|
+
if kind == "memory":
|
|
159
|
+
from tools.memory_tool import load_on_disk_store
|
|
160
|
+
|
|
161
|
+
store = load_on_disk_store()
|
|
162
|
+
message = commands.handle_pending_subcommand(kind, [verb, pending_id], memory_store=store) or ""
|
|
163
|
+
results.append({"id": pending_id, "done": wa.get_pending(kind, pending_id) is None, "message": message})
|
|
164
|
+
return {"results": results}
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
def register(registry) -> None:
|
|
168
|
+
@registry.method("write_approval.pending")
|
|
169
|
+
def pending_(ctx: CallContext, params: dict) -> dict:
|
|
170
|
+
kind = _kind(params)
|
|
171
|
+
with scoped_home(profile_home_param(params)):
|
|
172
|
+
return pending(kind)
|
|
173
|
+
|
|
174
|
+
for verb in ("approve", "reject"):
|
|
175
|
+
def handler(ctx: CallContext, params: dict, verb: str = verb) -> dict:
|
|
176
|
+
kind = _kind(params)
|
|
177
|
+
writes = list(params.get("writes") or [])
|
|
178
|
+
with scoped_home(profile_home_param(params)):
|
|
179
|
+
return review(kind, verb, writes)
|
|
180
|
+
|
|
181
|
+
registry.method(f"write_approval.{verb}")(handler)
|
|
@@ -13,11 +13,16 @@ from __future__ import annotations
|
|
|
13
13
|
|
|
14
14
|
import json
|
|
15
15
|
import logging
|
|
16
|
+
import os
|
|
17
|
+
import queue
|
|
18
|
+
import time
|
|
16
19
|
import sys
|
|
17
20
|
import threading
|
|
18
21
|
import traceback
|
|
19
22
|
from typing import Any, Callable
|
|
20
23
|
|
|
24
|
+
from .startup_timing import StartupTiming, outcome_for
|
|
25
|
+
|
|
21
26
|
from .errors import (
|
|
22
27
|
APPLICATION_ERROR,
|
|
23
28
|
INTERNAL_ERROR,
|
|
@@ -39,11 +44,12 @@ DEFAULT_MAX_CALLS = 64
|
|
|
39
44
|
class CallContext:
|
|
40
45
|
"""Per-request handle: stream emission and cooperative cancellation."""
|
|
41
46
|
|
|
42
|
-
def __init__(self, server: "RpcServer", request_id: Any, method: str):
|
|
47
|
+
def __init__(self, server: "RpcServer", request_id: Any, method: str, request: dict | None = None):
|
|
43
48
|
self.server = server
|
|
44
49
|
self.id = request_id
|
|
45
50
|
self.method = method
|
|
46
51
|
self.cancel_event = threading.Event()
|
|
52
|
+
self.timing = StartupTiming(request) if method == "chat.start" and request is not None else None
|
|
47
53
|
self._seq = 0
|
|
48
54
|
self._seq_lock = threading.Lock()
|
|
49
55
|
|
|
@@ -60,6 +66,8 @@ class CallContext:
|
|
|
60
66
|
with self._seq_lock:
|
|
61
67
|
self._seq += 1
|
|
62
68
|
seq = self._seq
|
|
69
|
+
if self.timing:
|
|
70
|
+
self.timing.frame(event, data)
|
|
63
71
|
self.server.notify("stream", {"id": self.id, "seq": seq, "event": event, "data": data if data is not None else {}})
|
|
64
72
|
|
|
65
73
|
|
|
@@ -121,6 +129,11 @@ class RpcServer:
|
|
|
121
129
|
def request_shutdown(self, exit_code: int = 0) -> None:
|
|
122
130
|
self.exit_code = exit_code
|
|
123
131
|
self._closed.set()
|
|
132
|
+
with self._active_lock:
|
|
133
|
+
for ctx in self._active.values():
|
|
134
|
+
ctx.cancel_event.set()
|
|
135
|
+
if ctx.timing:
|
|
136
|
+
ctx.timing.finish("unknown")
|
|
124
137
|
|
|
125
138
|
# ── dispatch ──────────────────────────────────────────────────────────
|
|
126
139
|
def _register(self, request: dict) -> CallContext | None:
|
|
@@ -129,7 +142,7 @@ class RpcServer:
|
|
|
129
142
|
method = request.get("method")
|
|
130
143
|
if request_id is None or not isinstance(method, str):
|
|
131
144
|
return None
|
|
132
|
-
ctx = CallContext(self, request_id, method)
|
|
145
|
+
ctx = CallContext(self, request_id, method, request)
|
|
133
146
|
with self._active_lock:
|
|
134
147
|
self._active[request_id] = ctx
|
|
135
148
|
return ctx
|
|
@@ -141,6 +154,8 @@ class RpcServer:
|
|
|
141
154
|
if params is None:
|
|
142
155
|
params = {}
|
|
143
156
|
if not isinstance(method, str) or not isinstance(params, dict):
|
|
157
|
+
if ctx and ctx.timing:
|
|
158
|
+
ctx.timing.finish("refused")
|
|
144
159
|
if request_id is not None:
|
|
145
160
|
with self._active_lock:
|
|
146
161
|
self._active.pop(request_id, None)
|
|
@@ -154,19 +169,28 @@ class RpcServer:
|
|
|
154
169
|
self._error(request_id, METHOD_NOT_FOUND, f"unknown method {method}")
|
|
155
170
|
return
|
|
156
171
|
if ctx is None:
|
|
157
|
-
ctx = CallContext(self, request_id, method)
|
|
172
|
+
ctx = CallContext(self, request_id, method, request)
|
|
158
173
|
if request_id is not None:
|
|
159
174
|
with self._active_lock:
|
|
160
175
|
self._active[request_id] = ctx
|
|
176
|
+
outcome = "error"
|
|
177
|
+
if ctx.timing:
|
|
178
|
+
ctx.timing.end("rpc_wait")
|
|
179
|
+
ctx.timing.observe("rpc_start")
|
|
161
180
|
try:
|
|
162
181
|
result = handler(ctx, params)
|
|
182
|
+
status = result.get("status") if isinstance(result, dict) else None
|
|
183
|
+
failed = isinstance(result, dict) and bool(result.get("failed") or result.get("partial") or result.get("error"))
|
|
184
|
+
outcome = "cancelled" if ctx.cancelled or status == "cancelled" else "error" if status == "error" or failed else "ok"
|
|
163
185
|
if request_id is not None:
|
|
164
186
|
self._result(request_id, result if result is not None else {})
|
|
165
187
|
except RpcError as exc:
|
|
188
|
+
outcome = outcome_for(exc)
|
|
166
189
|
if request_id is not None:
|
|
167
190
|
error = exc.to_json()
|
|
168
191
|
self._error(request_id, error["code"], error["message"], error.get("data"))
|
|
169
192
|
except TypeError as exc:
|
|
193
|
+
outcome = "refused"
|
|
170
194
|
# Wrong keyword arguments reaching a wrapped Agent function.
|
|
171
195
|
log.debug("invalid params for %s", method, exc_info=True)
|
|
172
196
|
if request_id is not None:
|
|
@@ -176,18 +200,46 @@ class RpcServer:
|
|
|
176
200
|
if request_id is not None:
|
|
177
201
|
self._error(request_id, INTERNAL_ERROR, f"{type(exc).__name__}: {exc}")
|
|
178
202
|
finally:
|
|
203
|
+
if ctx.timing:
|
|
204
|
+
ctx.timing.finish(outcome)
|
|
179
205
|
if request_id is not None:
|
|
180
206
|
with self._active_lock:
|
|
181
207
|
self._active.pop(request_id, None)
|
|
182
208
|
|
|
183
209
|
def serve_forever(self) -> int:
|
|
184
210
|
"""Read requests until stdin closes or shutdown is requested."""
|
|
185
|
-
|
|
211
|
+
incoming = queue.Queue(maxsize=1)
|
|
212
|
+
def read_input():
|
|
186
213
|
try:
|
|
187
|
-
|
|
214
|
+
try:
|
|
215
|
+
fd = self._in.fileno()
|
|
216
|
+
except (AttributeError, OSError, ValueError):
|
|
217
|
+
fd = None
|
|
218
|
+
if fd is None:
|
|
219
|
+
while raw := self._in.readline():
|
|
220
|
+
incoming.put(raw)
|
|
221
|
+
else:
|
|
222
|
+
# An unbuffered OS read cannot hold sys.stdin's Python buffer lock at interpreter exit.
|
|
223
|
+
pending = []
|
|
224
|
+
while chunk := os.read(fd, 65536):
|
|
225
|
+
lines = chunk.split(b"\n")
|
|
226
|
+
pending.append(lines[0])
|
|
227
|
+
for line in lines[1:]:
|
|
228
|
+
incoming.put(b"".join(pending))
|
|
229
|
+
pending = [line]
|
|
230
|
+
if pending:
|
|
231
|
+
incoming.put(b"".join(pending))
|
|
188
232
|
except (OSError, ValueError):
|
|
189
|
-
|
|
190
|
-
|
|
233
|
+
pass
|
|
234
|
+
finally:
|
|
235
|
+
incoming.put(None)
|
|
236
|
+
threading.Thread(target=read_input, name="rpc-input", daemon=True).start()
|
|
237
|
+
while not self._closed.is_set():
|
|
238
|
+
try:
|
|
239
|
+
raw = incoming.get(timeout=.1)
|
|
240
|
+
except queue.Empty:
|
|
241
|
+
continue
|
|
242
|
+
if raw is None or self._closed.is_set():
|
|
191
243
|
break
|
|
192
244
|
raw = raw.strip()
|
|
193
245
|
if not raw:
|
|
@@ -205,10 +257,21 @@ class RpcServer:
|
|
|
205
257
|
self._dispatch(request)
|
|
206
258
|
continue
|
|
207
259
|
if not self._slots.acquire(blocking=False):
|
|
260
|
+
if request.get("method") == "chat.start":
|
|
261
|
+
StartupTiming(request).finish("refused")
|
|
208
262
|
self._error(request.get("id"), APPLICATION_ERROR, "sidecar is at its concurrent call limit", {"condition": "sidecar_busy"})
|
|
209
263
|
continue
|
|
210
264
|
ctx = self._register(request)
|
|
211
265
|
threading.Thread(target=self._dispatch_slot, args=(request, ctx), name=f"rpc-{request.get('method')}", daemon=True).start()
|
|
266
|
+
if self._closed.is_set():
|
|
267
|
+
# Let the terminal reply reach stdout before the process returns its final exit code.
|
|
268
|
+
deadline = time.monotonic() + 5
|
|
269
|
+
while time.monotonic() < deadline:
|
|
270
|
+
with self._active_lock:
|
|
271
|
+
terminal_reply = any(ctx.method in {"runtime.shutdown", "runtime.handshake"} for ctx in self._active.values())
|
|
272
|
+
if not terminal_reply:
|
|
273
|
+
break
|
|
274
|
+
threading.Event().wait(.01)
|
|
212
275
|
return self.exit_code
|
|
213
276
|
|
|
214
277
|
def _dispatch_slot(self, request: dict, ctx: CallContext | None) -> None:
|