@creativeintelligence/abbie 0.1.4 → 0.1.6
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/dist/cli/commands/login.js +26 -0
- package/dist/cli/commands/start.js +2 -1
- package/oclif.manifest.json +1 -1
- package/package.json +9 -5
- package/dist/cli/base-command.d.ts.map +0 -1
- package/dist/cli/commands/agent/list.d.ts.map +0 -1
- package/dist/cli/commands/annotation/ack.d.ts.map +0 -1
- package/dist/cli/commands/annotation/create.d.ts.map +0 -1
- package/dist/cli/commands/annotation/events.d.ts.map +0 -1
- package/dist/cli/commands/annotation/export.d.ts.map +0 -1
- package/dist/cli/commands/annotation/import.d.ts.map +0 -1
- package/dist/cli/commands/annotation/ingest.d.ts.map +0 -1
- package/dist/cli/commands/annotation/list.d.ts.map +0 -1
- package/dist/cli/commands/annotation/reply.d.ts.map +0 -1
- package/dist/cli/commands/annotation/resolve.d.ts.map +0 -1
- package/dist/cli/commands/auto/index.d.ts.map +0 -1
- package/dist/cli/commands/backlog/add.d.ts.map +0 -1
- package/dist/cli/commands/backlog/claim.d.ts.map +0 -1
- package/dist/cli/commands/backlog/complete.d.ts.map +0 -1
- package/dist/cli/commands/backlog/list.d.ts.map +0 -1
- package/dist/cli/commands/backlog/pick.d.ts.map +0 -1
- package/dist/cli/commands/backlog/sync.d.ts.map +0 -1
- package/dist/cli/commands/bootstrap.d.ts.map +0 -1
- package/dist/cli/commands/bridge.d.ts.map +0 -1
- package/dist/cli/commands/context/inject.d.ts.map +0 -1
- package/dist/cli/commands/context/list.d.ts.map +0 -1
- package/dist/cli/commands/context/publish.d.ts.map +0 -1
- package/dist/cli/commands/context/read.d.ts.map +0 -1
- package/dist/cli/commands/daemon.d.ts.map +0 -1
- package/dist/cli/commands/digest/index.d.ts.map +0 -1
- package/dist/cli/commands/docs/lint.d.ts.map +0 -1
- package/dist/cli/commands/docs/sync.d.ts.map +0 -1
- package/dist/cli/commands/doctor.d.ts.map +0 -1
- package/dist/cli/commands/find/index.d.ts.map +0 -1
- package/dist/cli/commands/gc.d.ts.map +0 -1
- package/dist/cli/commands/history/index.d.ts.map +0 -1
- package/dist/cli/commands/hooks/guard.d.ts.map +0 -1
- package/dist/cli/commands/hooks/list.d.ts.map +0 -1
- package/dist/cli/commands/hooks/lock.d.ts.map +0 -1
- package/dist/cli/commands/hooks/status.d.ts.map +0 -1
- package/dist/cli/commands/hooks/test.d.ts.map +0 -1
- package/dist/cli/commands/hooks/unlock.d.ts.map +0 -1
- package/dist/cli/commands/index.d.ts.map +0 -1
- package/dist/cli/commands/list.d.ts.map +0 -1
- package/dist/cli/commands/list.e2e.test.d.ts +0 -1
- package/dist/cli/commands/list.e2e.test.js +0 -47
- package/dist/cli/commands/login.d.ts.map +0 -1
- package/dist/cli/commands/logout.d.ts.map +0 -1
- package/dist/cli/commands/panes/broker.d.ts.map +0 -1
- package/dist/cli/commands/panes/pipe-sink.d.ts.map +0 -1
- package/dist/cli/commands/panes/snapshot.d.ts.map +0 -1
- package/dist/cli/commands/plan.d.ts.map +0 -1
- package/dist/cli/commands/plan.e2e.test.d.ts +0 -1
- package/dist/cli/commands/plan.e2e.test.js +0 -74
- package/dist/cli/commands/preview/index.d.ts.map +0 -1
- package/dist/cli/commands/preview/init.d.ts.map +0 -1
- package/dist/cli/commands/preview/list.d.ts.map +0 -1
- package/dist/cli/commands/preview/status.d.ts.map +0 -1
- package/dist/cli/commands/preview/stop.d.ts.map +0 -1
- package/dist/cli/commands/preview/sync.d.ts.map +0 -1
- package/dist/cli/commands/preview/watch.d.ts.map +0 -1
- package/dist/cli/commands/project/add.d.ts.map +0 -1
- package/dist/cli/commands/project/list.d.ts.map +0 -1
- package/dist/cli/commands/project/remove.d.ts.map +0 -1
- package/dist/cli/commands/push.d.ts.map +0 -1
- package/dist/cli/commands/reference/add.d.ts.map +0 -1
- package/dist/cli/commands/reference/delete.d.ts.map +0 -1
- package/dist/cli/commands/reference/extract.d.ts.map +0 -1
- package/dist/cli/commands/reference/list.d.ts.map +0 -1
- package/dist/cli/commands/reference/normalize.d.ts.map +0 -1
- package/dist/cli/commands/reference/open.d.ts.map +0 -1
- package/dist/cli/commands/reference/save.d.ts.map +0 -1
- package/dist/cli/commands/reference/search.d.ts.map +0 -1
- package/dist/cli/commands/reference/show.d.ts.map +0 -1
- package/dist/cli/commands/reference/update-index.d.ts.map +0 -1
- package/dist/cli/commands/reference/update.d.ts.map +0 -1
- package/dist/cli/commands/report/blocked.d.ts.map +0 -1
- package/dist/cli/commands/report/complete.d.ts.map +0 -1
- package/dist/cli/commands/report/progress.d.ts.map +0 -1
- package/dist/cli/commands/report/start.d.ts.map +0 -1
- package/dist/cli/commands/resource/acquire.d.ts.map +0 -1
- package/dist/cli/commands/resource/list.d.ts.map +0 -1
- package/dist/cli/commands/resource/release.d.ts.map +0 -1
- package/dist/cli/commands/resource/wait.d.ts.map +0 -1
- package/dist/cli/commands/review.d.ts.map +0 -1
- package/dist/cli/commands/session/attach.d.ts.map +0 -1
- package/dist/cli/commands/session/await.d.ts.map +0 -1
- package/dist/cli/commands/session/complete.d.ts.map +0 -1
- package/dist/cli/commands/session/create.d.ts.map +0 -1
- package/dist/cli/commands/session/heartbeat.d.ts.map +0 -1
- package/dist/cli/commands/session/list.d.ts.map +0 -1
- package/dist/cli/commands/session/mark-done.d.ts.map +0 -1
- package/dist/cli/commands/session/mine.d.ts.map +0 -1
- package/dist/cli/commands/session/replay.d.ts.map +0 -1
- package/dist/cli/commands/session/run.d.ts.map +0 -1
- package/dist/cli/commands/session/show.d.ts.map +0 -1
- package/dist/cli/commands/session/start.d.ts.map +0 -1
- package/dist/cli/commands/session/state/cleanup.d.ts.map +0 -1
- package/dist/cli/commands/session/state/end.d.ts.map +0 -1
- package/dist/cli/commands/session/state/get.d.ts.map +0 -1
- package/dist/cli/commands/session/state/init.d.ts.map +0 -1
- package/dist/cli/commands/session/state/list.d.ts.map +0 -1
- package/dist/cli/commands/session/state/update.d.ts.map +0 -1
- package/dist/cli/commands/session/stop.d.ts.map +0 -1
- package/dist/cli/commands/session/view.d.ts.map +0 -1
- package/dist/cli/commands/start.d.ts.map +0 -1
- package/dist/cli/commands/state/dump.d.ts.map +0 -1
- package/dist/cli/commands/status.d.ts.map +0 -1
- package/dist/cli/commands/sync.d.ts.map +0 -1
- package/dist/cli/commands/trace/export.d.ts.map +0 -1
- package/dist/cli/commands/triage/claim.d.ts.map +0 -1
- package/dist/cli/commands/triage/list.d.ts.map +0 -1
- package/dist/cli/commands/triage/next.d.ts.map +0 -1
- package/dist/cli/commands/triage/pull.d.ts.map +0 -1
- package/dist/cli/commands/triage/stats.d.ts.map +0 -1
- package/dist/cli/commands/tunnel/list.d.ts.map +0 -1
- package/dist/cli/commands/tunnel/start.d.ts.map +0 -1
- package/dist/cli/commands/tunnel/stop.d.ts.map +0 -1
- package/dist/cli/commands/tunnel/url.d.ts.map +0 -1
- package/dist/cli/commands/web/start.d.ts.map +0 -1
- package/dist/cli/commands/windows/context.d.ts.map +0 -1
- package/dist/cli/commands/windows/focus.d.ts.map +0 -1
- package/dist/cli/commands/windows/list.d.ts.map +0 -1
- package/dist/cli/commands/windows/map.d.ts.map +0 -1
- package/dist/cli/commands/windows/read.d.ts.map +0 -1
- package/dist/cli/commands/windows/search.d.ts.map +0 -1
- package/dist/cli/commands/windows/show.d.ts.map +0 -1
- package/dist/cli/commands/windows/watch.d.ts.map +0 -1
- package/dist/lib/active-sessions.d.ts.map +0 -1
- package/dist/lib/agent-adapters.d.ts.map +0 -1
- package/dist/lib/agent-sessions.d.ts.map +0 -1
- package/dist/lib/agent-trace.d.ts.map +0 -1
- package/dist/lib/analytics.d.ts.map +0 -1
- package/dist/lib/annotations-convex.d.ts.map +0 -1
- package/dist/lib/annotations.d.ts.map +0 -1
- package/dist/lib/auto/discover.d.ts.map +0 -1
- package/dist/lib/auto/ideate.d.ts.map +0 -1
- package/dist/lib/auto/spawn.d.ts.map +0 -1
- package/dist/lib/auto/workspace.d.ts.map +0 -1
- package/dist/lib/backlog.d.ts.map +0 -1
- package/dist/lib/backlog.test.d.ts +0 -1
- package/dist/lib/backlog.test.js +0 -162
- package/dist/lib/config-loader.d.ts.map +0 -1
- package/dist/lib/config-sync/adapters/claude.d.ts.map +0 -1
- package/dist/lib/config-sync/adapters/codex.d.ts.map +0 -1
- package/dist/lib/config-sync/adapters/copilot.d.ts.map +0 -1
- package/dist/lib/config-sync/adapters/gemini.d.ts.map +0 -1
- package/dist/lib/config-sync/adapters/index.d.ts.map +0 -1
- package/dist/lib/config-sync/adapters/opencode.d.ts.map +0 -1
- package/dist/lib/config-sync/index.d.ts.map +0 -1
- package/dist/lib/config-sync/types.d.ts.map +0 -1
- package/dist/lib/config-sync/writer.d.ts.map +0 -1
- package/dist/lib/content-sync/index.d.ts.map +0 -1
- package/dist/lib/content-sync/types.d.ts.map +0 -1
- package/dist/lib/contracts.d.ts.map +0 -1
- package/dist/lib/convex.d.ts.map +0 -1
- package/dist/lib/device.d.ts.map +0 -1
- package/dist/lib/digest/index.d.ts.map +0 -1
- package/dist/lib/docs/lint.d.ts.map +0 -1
- package/dist/lib/docs/lint.test.d.ts +0 -1
- package/dist/lib/docs/lint.test.js +0 -120
- package/dist/lib/docs/sync.d.ts.map +0 -1
- package/dist/lib/doctor/index.d.ts.map +0 -1
- package/dist/lib/doctor/repos.d.ts.map +0 -1
- package/dist/lib/doctor/templates.d.ts.map +0 -1
- package/dist/lib/errors.d.ts.map +0 -1
- package/dist/lib/events.d.ts.map +0 -1
- package/dist/lib/heartbeat.d.ts.map +0 -1
- package/dist/lib/heartbeat.test.d.ts +0 -1
- package/dist/lib/heartbeat.test.js +0 -124
- package/dist/lib/hooks/adapters/claude.d.ts.map +0 -1
- package/dist/lib/hooks/adapters/codex.d.ts.map +0 -1
- package/dist/lib/hooks/adapters/copilot.d.ts.map +0 -1
- package/dist/lib/hooks/context.d.ts.map +0 -1
- package/dist/lib/hooks/index.d.ts.map +0 -1
- package/dist/lib/hooks/registry.d.ts.map +0 -1
- package/dist/lib/hooks/runner.d.ts.map +0 -1
- package/dist/lib/hooks/types.d.ts.map +0 -1
- package/dist/lib/index.test.d.ts +0 -1
- package/dist/lib/index.test.js +0 -334
- package/dist/lib/managed-session.d.ts.map +0 -1
- package/dist/lib/math.d.ts.map +0 -1
- package/dist/lib/math.test.d.ts +0 -1
- package/dist/lib/math.test.js +0 -238
- package/dist/lib/ngrok.d.ts.map +0 -1
- package/dist/lib/nvim/discovery.d.ts.map +0 -1
- package/dist/lib/nvim/discovery.test.d.ts +0 -1
- package/dist/lib/nvim/discovery.test.js +0 -131
- package/dist/lib/nvim/index.d.ts.map +0 -1
- package/dist/lib/nvim/remote.d.ts.map +0 -1
- package/dist/lib/nvim/remote.test.d.ts +0 -1
- package/dist/lib/nvim/remote.test.js +0 -18
- package/dist/lib/panes/broker.d.ts.map +0 -1
- package/dist/lib/panes/index.d.ts.map +0 -1
- package/dist/lib/panes/server.d.ts.map +0 -1
- package/dist/lib/preview/detect.d.ts.map +0 -1
- package/dist/lib/preview/index.d.ts.map +0 -1
- package/dist/lib/preview/manager.d.ts.map +0 -1
- package/dist/lib/preview/schema.d.ts.map +0 -1
- package/dist/lib/preview/sprite.d.ts.map +0 -1
- package/dist/lib/preview/watcher.d.ts.map +0 -1
- package/dist/lib/process/index.d.ts.map +0 -1
- package/dist/lib/process/snapshot.d.ts.map +0 -1
- package/dist/lib/process/snapshot.test.d.ts +0 -1
- package/dist/lib/process/snapshot.test.js +0 -127
- package/dist/lib/project-identity.d.ts.map +0 -1
- package/dist/lib/provider-auth.d.ts.map +0 -1
- package/dist/lib/references.d.ts.map +0 -1
- package/dist/lib/report.d.ts.map +0 -1
- package/dist/lib/resources.d.ts.map +0 -1
- package/dist/lib/resources.test.d.ts +0 -1
- package/dist/lib/resources.test.js +0 -94
- package/dist/lib/runner.d.ts.map +0 -1
- package/dist/lib/runner.test.d.ts +0 -1
- package/dist/lib/runner.test.js +0 -234
- package/dist/lib/session-artifacts.d.ts.map +0 -1
- package/dist/lib/session-manager.d.ts.map +0 -1
- package/dist/lib/session-manager.test.d.ts +0 -1
- package/dist/lib/session-manager.test.js +0 -310
- package/dist/lib/session-result.d.ts.map +0 -1
- package/dist/lib/session-state.d.ts.map +0 -1
- package/dist/lib/slack-workspace.d.ts.map +0 -1
- package/dist/lib/tmux/bridge.d.ts.map +0 -1
- package/dist/lib/tmux/context.d.ts.map +0 -1
- package/dist/lib/tmux/context.test.d.ts +0 -1
- package/dist/lib/tmux/context.test.js +0 -215
- package/dist/lib/tmux/index.d.ts.map +0 -1
- package/dist/lib/tmux/map.d.ts.map +0 -1
- package/dist/lib/tmux/map.test.d.ts +0 -1
- package/dist/lib/tmux/map.test.js +0 -80
- package/dist/lib/tmux/panes.d.ts.map +0 -1
- package/dist/lib/tmux/redaction.d.ts.map +0 -1
- package/dist/lib/tmux/redaction.test.d.ts +0 -1
- package/dist/lib/tmux/redaction.test.js +0 -183
- package/dist/lib/triage-llm.d.ts.map +0 -1
- package/dist/lib/triage-tracker.d.ts.map +0 -1
- package/dist/lib/triage.d.ts.map +0 -1
- package/dist/lib/types.d.ts.map +0 -1
- package/dist/lib/windows/index.d.ts.map +0 -1
- package/dist/lib/windows/inventory.d.ts.map +0 -1
- package/dist/lib/windows/inventory.test.d.ts +0 -1
- package/dist/lib/windows/inventory.test.js +0 -292
- package/dist/lib/windows/types.d.ts.map +0 -1
- package/dist/lib.d.ts.map +0 -1
- package/dist/web/app/@overlay/default.d.ts +0 -1
- package/dist/web/app/@overlay/default.js +0 -3
- package/dist/web/app/about/page.d.ts +0 -1
- package/dist/web/app/about/page.js +0 -6
- package/dist/web/app/layout.d.ts +0 -7
- package/dist/web/app/layout.js +0 -19
- package/dist/web/app/page.d.ts +0 -1
- package/dist/web/app/page.js +0 -38
- package/dist/web/app/settings/page.d.ts +0 -1
- package/dist/web/app/settings/page.js +0 -6
- package/dist/web/app/shortcuts/page.d.ts +0 -1
- package/dist/web/app/shortcuts/page.js +0 -6
- package/dist/web/atoms/sidebar.d.ts +0 -16
- package/dist/web/atoms/sidebar.js +0 -58
- package/dist/web/atoms/state.d.ts +0 -24
- package/dist/web/atoms/state.js +0 -43
- package/dist/web/components/command-palette.d.ts +0 -6
- package/dist/web/components/command-palette.js +0 -297
- package/dist/web/components/main-view.d.ts +0 -1
- package/dist/web/components/main-view.js +0 -93
- package/dist/web/components/overlay/page-overlay.d.ts +0 -16
- package/dist/web/components/overlay/page-overlay.js +0 -84
- package/dist/web/components/pane-view.d.ts +0 -5
- package/dist/web/components/pane-view.js +0 -168
- package/dist/web/components/project-files-view.d.ts +0 -6
- package/dist/web/components/project-files-view.js +0 -205
- package/dist/web/components/project-planning-view.d.ts +0 -6
- package/dist/web/components/project-planning-view.js +0 -146
- package/dist/web/components/session-view.d.ts +0 -6
- package/dist/web/components/session-view.js +0 -211
- package/dist/web/components/sessions-list-view.d.ts +0 -1
- package/dist/web/components/sessions-list-view.js +0 -118
- package/dist/web/components/sidebar/index.d.ts +0 -9
- package/dist/web/components/sidebar/index.js +0 -29
- package/dist/web/components/sidebar/kbd.d.ts +0 -17
- package/dist/web/components/sidebar/kbd.js +0 -47
- package/dist/web/components/sidebar/nav-group.d.ts +0 -22
- package/dist/web/components/sidebar/nav-group.js +0 -43
- package/dist/web/components/sidebar/nav-item.d.ts +0 -17
- package/dist/web/components/sidebar/nav-item.js +0 -38
- package/dist/web/components/sidebar/sidebar-header.d.ts +0 -9
- package/dist/web/components/sidebar/sidebar-header.js +0 -18
- package/dist/web/components/sidebar/sidebar-nav.d.ts +0 -7
- package/dist/web/components/sidebar/sidebar-nav.js +0 -505
- package/dist/web/components/sidebar/sidebar-search.d.ts +0 -7
- package/dist/web/components/sidebar/sidebar-search.js +0 -18
- package/dist/web/components/sidebar/sidebar-settings.d.ts +0 -4
- package/dist/web/components/sidebar/sidebar-settings.js +0 -28
- package/dist/web/components/sidebar/sidebar-transition.d.ts +0 -12
- package/dist/web/components/sidebar/sidebar-transition.js +0 -58
- package/dist/web/components/status-bar.d.ts +0 -1
- package/dist/web/components/status-bar.js +0 -53
- package/dist/web/components/terminal.d.ts +0 -4
- package/dist/web/components/terminal.js +0 -324
- package/dist/web/components/toast.d.ts +0 -7
- package/dist/web/components/toast.js +0 -72
- package/dist/web/hooks/use-keybindings.d.ts +0 -30
- package/dist/web/hooks/use-keybindings.js +0 -322
- package/dist/web/hooks/use-state.d.ts +0 -11
- package/dist/web/hooks/use-state.js +0 -84
- package/dist/web/lib/api.d.ts +0 -179
- package/dist/web/lib/api.js +0 -79
- package/dist/web/lib/paths.d.ts +0 -2
- package/dist/web/lib/paths.js +0 -26
- package/dist/web/lib/utils.d.ts +0 -2
- package/dist/web/lib/utils.js +0 -5
- package/dist/web/lib/ws.d.ts +0 -18
- package/dist/web/lib/ws.js +0 -138
- package/dist/web/next.config.d.ts +0 -3
- package/dist/web/next.config.js +0 -9
- package/scripts/generate-manifest.ts +0 -44
- package/src/cli/base-command.ts +0 -233
- package/src/cli/commands/__tests__/annotations.test.ts +0 -704
- package/src/cli/commands/__tests__/bridge.test.ts +0 -101
- package/src/cli/commands/__tests__/daemon.test.ts +0 -79
- package/src/cli/commands/agent/list.ts +0 -75
- package/src/cli/commands/annotation/ack.ts +0 -37
- package/src/cli/commands/annotation/create.ts +0 -67
- package/src/cli/commands/annotation/events.ts +0 -63
- package/src/cli/commands/annotation/export.ts +0 -67
- package/src/cli/commands/annotation/import.ts +0 -98
- package/src/cli/commands/annotation/ingest.ts +0 -112
- package/src/cli/commands/annotation/list.ts +0 -57
- package/src/cli/commands/annotation/reply.ts +0 -46
- package/src/cli/commands/annotation/resolve.ts +0 -37
- package/src/cli/commands/auto/index.ts +0 -755
- package/src/cli/commands/backlog/add.ts +0 -74
- package/src/cli/commands/backlog/claim.ts +0 -53
- package/src/cli/commands/backlog/complete.ts +0 -51
- package/src/cli/commands/backlog/list.ts +0 -107
- package/src/cli/commands/backlog/pick.ts +0 -50
- package/src/cli/commands/backlog/sync.ts +0 -131
- package/src/cli/commands/bootstrap.ts +0 -205
- package/src/cli/commands/bridge.ts +0 -233
- package/src/cli/commands/context/inject.ts +0 -103
- package/src/cli/commands/context/list.ts +0 -112
- package/src/cli/commands/context/publish.ts +0 -83
- package/src/cli/commands/context/read.ts +0 -85
- package/src/cli/commands/daemon.ts +0 -1809
- package/src/cli/commands/digest/index.ts +0 -245
- package/src/cli/commands/docs/lint.ts +0 -93
- package/src/cli/commands/docs/sync.ts +0 -90
- package/src/cli/commands/doctor.ts +0 -267
- package/src/cli/commands/find/index.ts +0 -313
- package/src/cli/commands/history/index.ts +0 -269
- package/src/cli/commands/hooks/guard.ts +0 -71
- package/src/cli/commands/hooks/list.ts +0 -139
- package/src/cli/commands/hooks/lock.ts +0 -47
- package/src/cli/commands/hooks/status.ts +0 -56
- package/src/cli/commands/hooks/test.ts +0 -190
- package/src/cli/commands/hooks/unlock.ts +0 -56
- package/src/cli/commands/list.e2e.test.ts +0 -58
- package/src/cli/commands/list.ts +0 -96
- package/src/cli/commands/login.ts +0 -236
- package/src/cli/commands/logout.ts +0 -45
- package/src/cli/commands/panes/broker.ts +0 -68
- package/src/cli/commands/panes/pipe-sink.ts +0 -101
- package/src/cli/commands/panes/snapshot.ts +0 -156
- package/src/cli/commands/plan.e2e.test.ts +0 -90
- package/src/cli/commands/plan.ts +0 -68
- package/src/cli/commands/preview/index.ts +0 -282
- package/src/cli/commands/preview/list.ts +0 -116
- package/src/cli/commands/preview/status.ts +0 -137
- package/src/cli/commands/preview/stop.ts +0 -165
- package/src/cli/commands/project/add.ts +0 -110
- package/src/cli/commands/project/list.ts +0 -136
- package/src/cli/commands/project/remove.ts +0 -60
- package/src/cli/commands/push.ts +0 -115
- package/src/cli/commands/reference/add.ts +0 -266
- package/src/cli/commands/reference/delete.ts +0 -67
- package/src/cli/commands/reference/extract.ts +0 -389
- package/src/cli/commands/reference/list.ts +0 -117
- package/src/cli/commands/reference/normalize.ts +0 -90
- package/src/cli/commands/reference/open.ts +0 -92
- package/src/cli/commands/reference/save.ts +0 -103
- package/src/cli/commands/reference/search.ts +0 -85
- package/src/cli/commands/reference/show.ts +0 -174
- package/src/cli/commands/reference/update-index.ts +0 -103
- package/src/cli/commands/reference/update.ts +0 -136
- package/src/cli/commands/report/blocked.ts +0 -165
- package/src/cli/commands/report/complete.ts +0 -179
- package/src/cli/commands/report/progress.ts +0 -142
- package/src/cli/commands/report/start.ts +0 -140
- package/src/cli/commands/resource/acquire.ts +0 -116
- package/src/cli/commands/resource/list.ts +0 -77
- package/src/cli/commands/resource/release.ts +0 -64
- package/src/cli/commands/resource/wait.ts +0 -93
- package/src/cli/commands/review.ts +0 -105
- package/src/cli/commands/session/attach.ts +0 -200
- package/src/cli/commands/session/await.ts +0 -83
- package/src/cli/commands/session/complete.ts +0 -100
- package/src/cli/commands/session/create.ts +0 -92
- package/src/cli/commands/session/heartbeat.ts +0 -63
- package/src/cli/commands/session/list.ts +0 -281
- package/src/cli/commands/session/mark-done.ts +0 -132
- package/src/cli/commands/session/mine.ts +0 -189
- package/src/cli/commands/session/replay.ts +0 -659
- package/src/cli/commands/session/run.ts +0 -44
- package/src/cli/commands/session/show.ts +0 -177
- package/src/cli/commands/session/start.ts +0 -580
- package/src/cli/commands/session/state/cleanup.ts +0 -61
- package/src/cli/commands/session/state/end.ts +0 -47
- package/src/cli/commands/session/state/get.ts +0 -65
- package/src/cli/commands/session/state/init.ts +0 -50
- package/src/cli/commands/session/state/list.ts +0 -68
- package/src/cli/commands/session/state/update.ts +0 -108
- package/src/cli/commands/session/stop.ts +0 -134
- package/src/cli/commands/session/view.ts +0 -186
- package/src/cli/commands/start.ts +0 -256
- package/src/cli/commands/state/dump.ts +0 -449
- package/src/cli/commands/status.ts +0 -244
- package/src/cli/commands/sync.ts +0 -174
- package/src/cli/commands/trace/export.ts +0 -255
- package/src/cli/commands/triage/claim.ts +0 -203
- package/src/cli/commands/triage/list.ts +0 -137
- package/src/cli/commands/triage/next.ts +0 -73
- package/src/cli/commands/triage/pull.ts +0 -97
- package/src/cli/commands/triage/stats.ts +0 -82
- package/src/cli/commands/tunnel/list.ts +0 -113
- package/src/cli/commands/tunnel/start.ts +0 -122
- package/src/cli/commands/tunnel/stop.ts +0 -108
- package/src/cli/commands/tunnel/url.ts +0 -82
- package/src/cli/commands/web/start.ts +0 -125
- package/src/cli/commands/windows/context.ts +0 -439
- package/src/cli/commands/windows/focus.ts +0 -130
- package/src/cli/commands/windows/list.ts +0 -213
- package/src/cli/commands/windows/map.ts +0 -223
- package/src/cli/commands/windows/read.ts +0 -279
- package/src/cli/commands/windows/search.ts +0 -219
- package/src/cli/commands/windows/show.ts +0 -188
- package/src/cli/commands/windows/watch.ts +0 -262
- package/src/lib/__tests__/annotations-convex.test.ts +0 -104
- package/src/lib/active-sessions.ts +0 -1486
- package/src/lib/agent-adapters.ts +0 -412
- package/src/lib/agent-sessions.ts +0 -671
- package/src/lib/agent-trace.test.ts +0 -296
- package/src/lib/agent-trace.ts +0 -513
- package/src/lib/analytics.ts +0 -178
- package/src/lib/annotations-convex.ts +0 -296
- package/src/lib/annotations.test.ts +0 -274
- package/src/lib/annotations.ts +0 -836
- package/src/lib/auto/discover.ts +0 -545
- package/src/lib/auto/ideate.ts +0 -412
- package/src/lib/auto/spawn.ts +0 -549
- package/src/lib/auto/workspace.ts +0 -282
- package/src/lib/backlog.test.ts +0 -194
- package/src/lib/backlog.ts +0 -428
- package/src/lib/config-loader.ts +0 -391
- package/src/lib/config-sync/adapters/claude.ts +0 -91
- package/src/lib/config-sync/adapters/codex.ts +0 -135
- package/src/lib/config-sync/adapters/copilot.ts +0 -98
- package/src/lib/config-sync/adapters/gemini.ts +0 -86
- package/src/lib/config-sync/adapters/index.ts +0 -39
- package/src/lib/config-sync/adapters/opencode.ts +0 -94
- package/src/lib/config-sync/index.ts +0 -399
- package/src/lib/config-sync/types.ts +0 -92
- package/src/lib/config-sync/writer.ts +0 -188
- package/src/lib/content-sync/index.ts +0 -882
- package/src/lib/content-sync/types.ts +0 -104
- package/src/lib/contracts.test.ts +0 -186
- package/src/lib/contracts.ts +0 -195
- package/src/lib/convex.ts +0 -54
- package/src/lib/device.ts +0 -41
- package/src/lib/digest/index.ts +0 -529
- package/src/lib/docs/lint.test.ts +0 -135
- package/src/lib/docs/lint.ts +0 -310
- package/src/lib/docs/sync.ts +0 -184
- package/src/lib/doctor/index.ts +0 -647
- package/src/lib/doctor/repos.ts +0 -381
- package/src/lib/doctor/templates.ts +0 -191
- package/src/lib/errors.ts +0 -111
- package/src/lib/events.ts +0 -479
- package/src/lib/heartbeat.test.ts +0 -164
- package/src/lib/heartbeat.ts +0 -326
- package/src/lib/hooks/adapters/claude.ts +0 -115
- package/src/lib/hooks/adapters/codex.ts +0 -92
- package/src/lib/hooks/adapters/copilot.ts +0 -141
- package/src/lib/hooks/context.ts +0 -174
- package/src/lib/hooks/index.ts +0 -39
- package/src/lib/hooks/registry.ts +0 -101
- package/src/lib/hooks/runner.ts +0 -208
- package/src/lib/hooks/types.ts +0 -89
- package/src/lib/index.test.ts +0 -426
- package/src/lib/managed-session.ts +0 -117
- package/src/lib/math.test.ts +0 -299
- package/src/lib/math.ts +0 -120
- package/src/lib/ngrok.ts +0 -441
- package/src/lib/nvim/discovery.test.ts +0 -157
- package/src/lib/nvim/discovery.ts +0 -181
- package/src/lib/nvim/index.ts +0 -28
- package/src/lib/nvim/remote.test.ts +0 -21
- package/src/lib/nvim/remote.ts +0 -184
- package/src/lib/panes/README.md +0 -20
- package/src/lib/panes/broker.ts +0 -261
- package/src/lib/panes/index.ts +0 -1
- package/src/lib/panes/server.ts +0 -379
- package/src/lib/preview/detect.ts +0 -184
- package/src/lib/preview/index.ts +0 -1
- package/src/lib/process/index.ts +0 -16
- package/src/lib/process/snapshot.test.ts +0 -188
- package/src/lib/process/snapshot.ts +0 -257
- package/src/lib/provider-auth.ts +0 -258
- package/src/lib/references.ts +0 -481
- package/src/lib/report.ts +0 -973
- package/src/lib/resources.test.ts +0 -132
- package/src/lib/resources.ts +0 -429
- package/src/lib/runner.test.ts +0 -288
- package/src/lib/runner.ts +0 -1223
- package/src/lib/session-artifacts.test.ts +0 -107
- package/src/lib/session-artifacts.ts +0 -193
- package/src/lib/session-manager.test.ts +0 -402
- package/src/lib/session-manager.ts +0 -150
- package/src/lib/session-result.test.ts +0 -98
- package/src/lib/session-result.ts +0 -262
- package/src/lib/session-state.ts +0 -470
- package/src/lib/slack-workspace.ts +0 -25
- package/src/lib/tmux/bridge.ts +0 -439
- package/src/lib/tmux/context.test.ts +0 -242
- package/src/lib/tmux/context.ts +0 -380
- package/src/lib/tmux/index.ts +0 -46
- package/src/lib/tmux/map.test.ts +0 -99
- package/src/lib/tmux/map.ts +0 -252
- package/src/lib/tmux/panes.ts +0 -170
- package/src/lib/tmux/redaction.test.ts +0 -231
- package/src/lib/tmux/redaction.ts +0 -201
- package/src/lib/triage-llm.ts +0 -312
- package/src/lib/triage-tracker.ts +0 -400
- package/src/lib/triage.ts +0 -655
- package/src/lib/types.ts +0 -61
- package/src/lib/windows/index.ts +0 -2
- package/src/lib/windows/inventory.test.ts +0 -370
- package/src/lib/windows/inventory.ts +0 -352
- package/src/lib/windows/types.ts +0 -46
- package/src/lib.ts +0 -260
|
@@ -1,201 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Redaction utilities for tmux context.
|
|
3
|
-
* Detects and redacts sensitive data like API keys, tokens, and credentials.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
export type RedactMode = "balanced" | "strict";
|
|
7
|
-
|
|
8
|
-
const REDACTED_MARKER = "***REDACTED***";
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Pattern definitions for sensitive data.
|
|
12
|
-
*/
|
|
13
|
-
const PATTERNS = {
|
|
14
|
-
// OpenAI/OpenRouter/Anthropic-style keys
|
|
15
|
-
openaiKey: /sk-[A-Za-z0-9_-]{16,}/g,
|
|
16
|
-
anthropicKey: /sk-ant-[A-Za-z0-9_-]{16,}/g,
|
|
17
|
-
|
|
18
|
-
// GitHub tokens
|
|
19
|
-
githubPat: /ghp_[A-Za-z0-9]{20,}/g,
|
|
20
|
-
githubPatNew: /github_pat_[A-Za-z0-9_]{20,}/g,
|
|
21
|
-
githubOther: /gh[ours]_[A-Za-z0-9]{20,}/g,
|
|
22
|
-
|
|
23
|
-
// Slack tokens
|
|
24
|
-
slackToken: /xox[baprs]-[A-Za-z0-9-]{10,}/g,
|
|
25
|
-
|
|
26
|
-
// URLs with user:pass
|
|
27
|
-
urlWithAuth: /https?:\/\/[^:]+:[^@]+@[^\s'"]+/g,
|
|
28
|
-
|
|
29
|
-
// PEM private keys (multiline)
|
|
30
|
-
pemKey:
|
|
31
|
-
/-----BEGIN\s+(?:[A-Z\s]+)?PRIVATE\s+KEY-----[\s\S]*?-----END\s+(?:[A-Z\s]+)?PRIVATE\s+KEY-----/g,
|
|
32
|
-
|
|
33
|
-
// AWS keys
|
|
34
|
-
awsAccessKey: /AKIA[A-Z0-9]{16}/g,
|
|
35
|
-
|
|
36
|
-
// Generic secret-looking patterns (base64-ish long strings after common key names)
|
|
37
|
-
genericSecret:
|
|
38
|
-
/(?:api[_-]?key|secret[_-]?key|access[_-]?token|auth[_-]?token)\s*[:=]\s*["']?[A-Za-z0-9+/=_-]{20,}["']?/gi,
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Line-level patterns that should cause entire line redaction.
|
|
43
|
-
*/
|
|
44
|
-
const LINE_PATTERNS = [
|
|
45
|
-
// Common secret assignments (case-insensitive)
|
|
46
|
-
// Matches: API_KEY=, SECRET=, SECRET_KEY=, PASSWORD=, AUTH_TOKEN=, PRIVATE_KEY=, etc.
|
|
47
|
-
/(?:\S*(?:API_KEY|SECRET|TOKEN|PASSWORD|PASS|PRIVATE_KEY)\S*)\s*=/i,
|
|
48
|
-
// export with secret names
|
|
49
|
-
/export\s+(?:\S*(?:KEY|TOKEN|SECRET|PASSWORD|PASS)\S*)\s*=/i,
|
|
50
|
-
];
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Commands that typically contain sensitive output and should be fully redacted in strict mode.
|
|
54
|
-
*/
|
|
55
|
-
const SENSITIVE_COMMANDS = ["pass", "vault", "1password", "op", "aws configure"];
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Redact sensitive tokens within a string.
|
|
59
|
-
*/
|
|
60
|
-
export function redactTokens(text: string): string {
|
|
61
|
-
let result = text;
|
|
62
|
-
|
|
63
|
-
// Apply all token patterns
|
|
64
|
-
for (const pattern of Object.values(PATTERNS)) {
|
|
65
|
-
result = result.replace(pattern, REDACTED_MARKER);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
return result;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* Check if a line should be fully redacted.
|
|
73
|
-
*/
|
|
74
|
-
export function shouldRedactLine(line: string): boolean {
|
|
75
|
-
return LINE_PATTERNS.some((pattern) => pattern.test(line));
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* Redact a single line of text.
|
|
80
|
-
*/
|
|
81
|
-
export function redactLine(line: string): string {
|
|
82
|
-
// First check if entire line should be redacted
|
|
83
|
-
if (shouldRedactLine(line)) {
|
|
84
|
-
return REDACTED_MARKER;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
// Otherwise, apply token-level redaction
|
|
88
|
-
return redactTokens(line);
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* Redact sensitive data from text content.
|
|
93
|
-
* In strict mode, redacts more aggressively.
|
|
94
|
-
*/
|
|
95
|
-
export function redactContent(
|
|
96
|
-
text: string,
|
|
97
|
-
_mode: RedactMode = "balanced",
|
|
98
|
-
): { content: string; wasRedacted: boolean } {
|
|
99
|
-
const lines = text.split("\n");
|
|
100
|
-
let wasRedacted = false;
|
|
101
|
-
|
|
102
|
-
const redactedLines = lines.map((line) => {
|
|
103
|
-
const redacted = redactLine(line);
|
|
104
|
-
if (redacted !== line) {
|
|
105
|
-
wasRedacted = true;
|
|
106
|
-
}
|
|
107
|
-
return redacted;
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
return {
|
|
111
|
-
content: redactedLines.join("\n"),
|
|
112
|
-
wasRedacted,
|
|
113
|
-
};
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Check if a command is considered sensitive.
|
|
118
|
-
*/
|
|
119
|
-
export function isSensitiveCommand(command: string): boolean {
|
|
120
|
-
const lowerCmd = command.toLowerCase();
|
|
121
|
-
return SENSITIVE_COMMANDS.some((sc) => lowerCmd.includes(sc));
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
* Filter patterns for deny/allow lists.
|
|
126
|
-
*/
|
|
127
|
-
export interface FilterConfig {
|
|
128
|
-
denySessions?: string[];
|
|
129
|
-
denyWindows?: string[];
|
|
130
|
-
denyPaths?: string[];
|
|
131
|
-
denyCommands?: string[];
|
|
132
|
-
includeSessions?: string[];
|
|
133
|
-
includeWindows?: string[];
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
/**
|
|
137
|
-
* Check if a session should be filtered out.
|
|
138
|
-
*/
|
|
139
|
-
export function shouldFilterSession(sessionName: string, config: FilterConfig): boolean {
|
|
140
|
-
// If include list is specified, only include those
|
|
141
|
-
if (config.includeSessions?.length) {
|
|
142
|
-
return !config.includeSessions.some((pattern) => matchPattern(sessionName, pattern));
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
// Otherwise, check deny list
|
|
146
|
-
if (config.denySessions?.length) {
|
|
147
|
-
return config.denySessions.some((pattern) => matchPattern(sessionName, pattern));
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
return false;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
/**
|
|
154
|
-
* Check if a window should be filtered out.
|
|
155
|
-
*/
|
|
156
|
-
export function shouldFilterWindow(windowName: string, config: FilterConfig): boolean {
|
|
157
|
-
// If include list is specified, only include those
|
|
158
|
-
if (config.includeWindows?.length) {
|
|
159
|
-
return !config.includeWindows.some((pattern) => matchPattern(windowName, pattern));
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
// Otherwise, check deny list
|
|
163
|
-
if (config.denyWindows?.length) {
|
|
164
|
-
return config.denyWindows.some((pattern) => matchPattern(windowName, pattern));
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
return false;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
/**
|
|
171
|
-
* Check if a path should be filtered out.
|
|
172
|
-
*/
|
|
173
|
-
export function shouldFilterPath(path: string, config: FilterConfig): boolean {
|
|
174
|
-
if (config.denyPaths?.length) {
|
|
175
|
-
return config.denyPaths.some((pattern) => matchPattern(path, pattern));
|
|
176
|
-
}
|
|
177
|
-
return false;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
/**
|
|
181
|
-
* Check if a command should be filtered out.
|
|
182
|
-
*/
|
|
183
|
-
export function shouldFilterCommand(command: string, config: FilterConfig): boolean {
|
|
184
|
-
if (config.denyCommands?.length) {
|
|
185
|
-
return config.denyCommands.some((pattern) => matchPattern(command, pattern));
|
|
186
|
-
}
|
|
187
|
-
return false;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
/**
|
|
191
|
-
* Simple glob-like pattern matching (supports * wildcards).
|
|
192
|
-
*/
|
|
193
|
-
function matchPattern(value: string, pattern: string): boolean {
|
|
194
|
-
// Convert glob pattern to regex
|
|
195
|
-
const regexPattern = pattern
|
|
196
|
-
.replace(/[.+^${}()|[\]\\]/g, "\\$&") // Escape special chars except *
|
|
197
|
-
.replace(/\*/g, ".*"); // Convert * to .*
|
|
198
|
-
|
|
199
|
-
const regex = new RegExp(`^${regexPattern}$`, "i");
|
|
200
|
-
return regex.test(value);
|
|
201
|
-
}
|
package/src/lib/triage-llm.ts
DELETED
|
@@ -1,312 +0,0 @@
|
|
|
1
|
-
import { spawnSync } from "node:child_process";
|
|
2
|
-
import { telemetry } from "./analytics.js";
|
|
3
|
-
import type { AgentCapability, Complexity, IssueType, LinearIssue } from "./triage.js";
|
|
4
|
-
import { AGENT_CAPABILITIES } from "./types.js";
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* LLM classification result with full reasoning.
|
|
8
|
-
*/
|
|
9
|
-
export interface LLMClassification {
|
|
10
|
-
type: IssueType;
|
|
11
|
-
complexity: Complexity;
|
|
12
|
-
agent: AgentCapability;
|
|
13
|
-
confidence: number;
|
|
14
|
-
reasoning: string;
|
|
15
|
-
suggested_prompt: string;
|
|
16
|
-
tags: string[];
|
|
17
|
-
raw_response?: string;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Classification prompt template.
|
|
22
|
-
*/
|
|
23
|
-
const CLASSIFICATION_PROMPT = `You are a technical project manager triaging Linear issues for an AI coding assistant system.
|
|
24
|
-
|
|
25
|
-
<issue>
|
|
26
|
-
<identifier>{{IDENTIFIER}}</identifier>
|
|
27
|
-
<title>{{TITLE}}</title>
|
|
28
|
-
<description>
|
|
29
|
-
{{DESCRIPTION}}
|
|
30
|
-
</description>
|
|
31
|
-
<priority>{{PRIORITY}}</priority>
|
|
32
|
-
<labels>{{LABELS}}</labels>
|
|
33
|
-
</issue>
|
|
34
|
-
|
|
35
|
-
<context>
|
|
36
|
-
This is for Zo Computer, a cloud development environment with AI coding assistance.
|
|
37
|
-
Tech stack: Next.js 15, React 19, FastAPI, Modal, Neon Postgres, Cloudflare Workers.
|
|
38
|
-
The codebase is a monorepo with Python backend and TypeScript frontend.
|
|
39
|
-
</context>
|
|
40
|
-
|
|
41
|
-
<task>
|
|
42
|
-
Classify this issue for agent assignment. Consider:
|
|
43
|
-
1. **Type**: What kind of work is this?
|
|
44
|
-
2. **Complexity**: How much effort/scope?
|
|
45
|
-
3. **Agent**: Which agent is best suited?
|
|
46
|
-
4. **Prompt**: What should we tell the agent?
|
|
47
|
-
</task>
|
|
48
|
-
|
|
49
|
-
<output_contract>
|
|
50
|
-
Respond with ONLY valid JSON matching this schema:
|
|
51
|
-
{
|
|
52
|
-
"type": "bug" | "feature" | "refactor" | "improvement" | "chore",
|
|
53
|
-
"complexity": "trivial" | "simple" | "medium" | "complex" | "epic",
|
|
54
|
-
"agent": "copilot" | "claude" | "codex" | "human",
|
|
55
|
-
"confidence": 1-10,
|
|
56
|
-
"reasoning": "2-3 sentences explaining classification",
|
|
57
|
-
"suggested_prompt": "specific instructions for the agent",
|
|
58
|
-
"tags": ["relevant", "tags"]
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
Agent capabilities:
|
|
62
|
-
- copilot: Quick, good for simple bugs, chores, low-scope improvements (simple complexity max)
|
|
63
|
-
- claude: Orchestrator, good for features, improvements, moderate refactors (medium complexity max)
|
|
64
|
-
- codex: Implementer, deep reasoning, good for complex features and architecture work (complex max)
|
|
65
|
-
- human: Epic scope, ambiguous requirements, needs product decisions
|
|
66
|
-
|
|
67
|
-
Complexity guide:
|
|
68
|
-
- trivial: typo, copy change, single line fix
|
|
69
|
-
- simple: single file change, clear requirements
|
|
70
|
-
- medium: 2-5 files, some design decisions
|
|
71
|
-
- complex: cross-cutting concerns, architecture impact
|
|
72
|
-
- epic: multi-week, needs breakdown
|
|
73
|
-
</output_contract>`;
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* Build classification prompt for an issue.
|
|
77
|
-
*/
|
|
78
|
-
function buildPrompt(issue: LinearIssue): string {
|
|
79
|
-
const labels = issue.labels.nodes.map((l) => l.name).join(", ") || "none";
|
|
80
|
-
|
|
81
|
-
return CLASSIFICATION_PROMPT.replace("{{IDENTIFIER}}", issue.identifier)
|
|
82
|
-
.replace("{{TITLE}}", issue.title)
|
|
83
|
-
.replace("{{DESCRIPTION}}", issue.description || "No description provided.")
|
|
84
|
-
.replace("{{PRIORITY}}", issue.priorityLabel)
|
|
85
|
-
.replace("{{LABELS}}", labels);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Parse LLM response into structured classification.
|
|
90
|
-
*/
|
|
91
|
-
function parseResponse(response: string): LLMClassification | null {
|
|
92
|
-
const validTypes: IssueType[] = ["bug", "feature", "refactor", "improvement", "chore"];
|
|
93
|
-
const validComplexities: Complexity[] = ["trivial", "simple", "medium", "complex", "epic"];
|
|
94
|
-
const validAgents: AgentCapability[] = AGENT_CAPABILITIES;
|
|
95
|
-
|
|
96
|
-
const normalize = (candidate: unknown): LLMClassification => {
|
|
97
|
-
const parsed: Record<string, unknown> =
|
|
98
|
-
typeof candidate === "object" && candidate !== null
|
|
99
|
-
? (candidate as Record<string, unknown>)
|
|
100
|
-
: {};
|
|
101
|
-
|
|
102
|
-
const type =
|
|
103
|
-
typeof parsed.type === "string" && validTypes.includes(parsed.type as IssueType)
|
|
104
|
-
? (parsed.type as IssueType)
|
|
105
|
-
: "improvement";
|
|
106
|
-
const complexity =
|
|
107
|
-
typeof parsed.complexity === "string" &&
|
|
108
|
-
validComplexities.includes(parsed.complexity as Complexity)
|
|
109
|
-
? (parsed.complexity as Complexity)
|
|
110
|
-
: "medium";
|
|
111
|
-
const agent =
|
|
112
|
-
typeof parsed.agent === "string" && validAgents.includes(parsed.agent as AgentCapability)
|
|
113
|
-
? (parsed.agent as AgentCapability)
|
|
114
|
-
: "claude";
|
|
115
|
-
const confidence = typeof parsed.confidence === "number" ? parsed.confidence : 5;
|
|
116
|
-
const reasoning =
|
|
117
|
-
typeof parsed.reasoning === "string" ? parsed.reasoning : "No reasoning provided";
|
|
118
|
-
const suggested_prompt =
|
|
119
|
-
typeof parsed.suggested_prompt === "string" ? parsed.suggested_prompt : `Work on: ${type}`;
|
|
120
|
-
const tags = Array.isArray(parsed.tags)
|
|
121
|
-
? parsed.tags.filter((t): t is string => typeof t === "string")
|
|
122
|
-
: [];
|
|
123
|
-
|
|
124
|
-
return {
|
|
125
|
-
type,
|
|
126
|
-
complexity,
|
|
127
|
-
agent,
|
|
128
|
-
confidence: Math.min(10, Math.max(1, confidence)),
|
|
129
|
-
reasoning,
|
|
130
|
-
suggested_prompt,
|
|
131
|
-
tags,
|
|
132
|
-
raw_response: response,
|
|
133
|
-
};
|
|
134
|
-
};
|
|
135
|
-
|
|
136
|
-
const trimmed = response.trim();
|
|
137
|
-
|
|
138
|
-
// 1) Try raw JSON
|
|
139
|
-
try {
|
|
140
|
-
const direct = JSON.parse(trimmed);
|
|
141
|
-
if (typeof direct?.result === "string") {
|
|
142
|
-
// wrapper-style
|
|
143
|
-
const inner = direct.result.trim();
|
|
144
|
-
const match = inner.match(/\{[\s\S]*\}/);
|
|
145
|
-
if (!match) return null;
|
|
146
|
-
return normalize(JSON.parse(match[0]));
|
|
147
|
-
}
|
|
148
|
-
return normalize(direct);
|
|
149
|
-
} catch {
|
|
150
|
-
// continue
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
// 2) Try to extract JSON object from noisy output
|
|
154
|
-
const match = trimmed.match(/\{[\s\S]*\}/);
|
|
155
|
-
if (!match) return null;
|
|
156
|
-
try {
|
|
157
|
-
return normalize(JSON.parse(match[0]));
|
|
158
|
-
} catch {
|
|
159
|
-
return null;
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
/**
|
|
164
|
-
* Check if a binary is available on PATH.
|
|
165
|
-
*/
|
|
166
|
-
function isBinaryAvailable(bin: string): boolean {
|
|
167
|
-
const result = spawnSync("which", [bin], { stdio: "pipe" });
|
|
168
|
-
return result.status === 0;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
/**
|
|
172
|
-
* Classify an issue using an LLM (gemini CLI preferred, fallback to copilot).
|
|
173
|
-
*/
|
|
174
|
-
export async function classifyWithLLM(issue: LinearIssue): Promise<LLMClassification> {
|
|
175
|
-
const prompt = buildPrompt(issue);
|
|
176
|
-
|
|
177
|
-
const canUseGemini = isBinaryAvailable("gemini");
|
|
178
|
-
const canUseCopilot = isBinaryAvailable("copilot");
|
|
179
|
-
|
|
180
|
-
try {
|
|
181
|
-
if (!canUseGemini && !canUseCopilot) {
|
|
182
|
-
telemetry.trackEscalation("llm", "heuristic", "no llm cli available");
|
|
183
|
-
return fallbackClassification(issue);
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
// Track escalation when gemini unavailable
|
|
187
|
-
if (!canUseGemini && canUseCopilot) {
|
|
188
|
-
telemetry.trackEscalation("gemini", "copilot", "gemini unavailable for triage");
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
const result = canUseGemini
|
|
192
|
-
? spawnSync("gemini", ["-p", prompt, "-m", "gemini-3-flash"], {
|
|
193
|
-
encoding: "utf-8",
|
|
194
|
-
timeout: 60000,
|
|
195
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
196
|
-
})
|
|
197
|
-
: spawnSync(
|
|
198
|
-
"copilot",
|
|
199
|
-
[
|
|
200
|
-
"-p",
|
|
201
|
-
prompt,
|
|
202
|
-
"--model",
|
|
203
|
-
"gemini-3-pro-preview",
|
|
204
|
-
"--yolo",
|
|
205
|
-
"--silent",
|
|
206
|
-
"--stream",
|
|
207
|
-
"off",
|
|
208
|
-
],
|
|
209
|
-
{
|
|
210
|
-
encoding: "utf-8",
|
|
211
|
-
timeout: 60000,
|
|
212
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
213
|
-
},
|
|
214
|
-
);
|
|
215
|
-
|
|
216
|
-
const stdout = result.stdout?.toString?.() ?? String(result.stdout ?? "");
|
|
217
|
-
const stderr = result.stderr?.toString?.() ?? String(result.stderr ?? "");
|
|
218
|
-
|
|
219
|
-
if (result.status !== 0) {
|
|
220
|
-
const fromAgent = canUseGemini ? "gemini" : "copilot";
|
|
221
|
-
telemetry.trackEscalation(fromAgent, "heuristic", `exit ${result.status ?? "unknown"}`);
|
|
222
|
-
return {
|
|
223
|
-
...fallbackClassification(issue),
|
|
224
|
-
raw_response: [stdout, stderr].filter(Boolean).join("\n"),
|
|
225
|
-
reasoning: `LLM classification failed (exit ${result.status ?? "unknown"}), using fallback classification`,
|
|
226
|
-
};
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
const parsed = parseResponse(stdout);
|
|
230
|
-
if (parsed) {
|
|
231
|
-
return parsed;
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
// If parsing failed, try to extract what we can
|
|
235
|
-
const fromAgent = canUseGemini ? "gemini" : "copilot";
|
|
236
|
-
telemetry.trackEscalation(fromAgent, "heuristic", "parse failure");
|
|
237
|
-
return {
|
|
238
|
-
...fallbackClassification(issue),
|
|
239
|
-
raw_response: stdout,
|
|
240
|
-
reasoning: "LLM response could not be parsed, using fallback classification",
|
|
241
|
-
};
|
|
242
|
-
} catch (err) {
|
|
243
|
-
// On error, fall back to heuristic
|
|
244
|
-
telemetry.trackEscalation("llm", "heuristic", (err as Error).message);
|
|
245
|
-
return {
|
|
246
|
-
...fallbackClassification(issue),
|
|
247
|
-
reasoning: `LLM classification failed: ${(err as Error).message}`,
|
|
248
|
-
};
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
/**
|
|
253
|
-
* Fallback heuristic classification when LLM unavailable.
|
|
254
|
-
*/
|
|
255
|
-
function fallbackClassification(issue: LinearIssue): LLMClassification {
|
|
256
|
-
const text = `${issue.title} ${issue.description || ""}`.toLowerCase();
|
|
257
|
-
|
|
258
|
-
// Simple keyword-based fallback
|
|
259
|
-
let type: IssueType = "improvement";
|
|
260
|
-
if (/\b(bug|fix|broke|error|crash|fail)\b/i.test(text)) type = "bug";
|
|
261
|
-
else if (/\b(add|new|implement|create|feature)\b/i.test(text)) type = "feature";
|
|
262
|
-
else if (/\b(refactor|restructure|cleanup)\b/i.test(text)) type = "refactor";
|
|
263
|
-
else if (/\b(chore|deps|test|docs)\b/i.test(text)) type = "chore";
|
|
264
|
-
|
|
265
|
-
// Estimate complexity from title length
|
|
266
|
-
const words = issue.title.split(/\s+/).length;
|
|
267
|
-
let complexity: Complexity = "simple";
|
|
268
|
-
if (words <= 4) complexity = "trivial";
|
|
269
|
-
else if (words <= 7) complexity = "simple";
|
|
270
|
-
else if (words <= 12) complexity = "medium";
|
|
271
|
-
else complexity = "complex";
|
|
272
|
-
|
|
273
|
-
// Map to agent
|
|
274
|
-
let agent: AgentCapability = "claude";
|
|
275
|
-
if (complexity === "trivial" || complexity === "simple") agent = "copilot";
|
|
276
|
-
else if (complexity === "complex") agent = "codex";
|
|
277
|
-
|
|
278
|
-
return {
|
|
279
|
-
type,
|
|
280
|
-
complexity,
|
|
281
|
-
agent,
|
|
282
|
-
confidence: 4, // Low confidence for fallback
|
|
283
|
-
reasoning: "Fallback heuristic classification (LLM unavailable)",
|
|
284
|
-
suggested_prompt: `Work on ${issue.identifier}: ${issue.title}`,
|
|
285
|
-
tags: issue.labels.nodes.map((l) => l.name.toLowerCase()),
|
|
286
|
-
};
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
/**
|
|
290
|
-
* Batch classify multiple issues (sequentially to avoid rate limits).
|
|
291
|
-
*/
|
|
292
|
-
export async function classifyBatch(
|
|
293
|
-
issues: LinearIssue[],
|
|
294
|
-
onProgress?: (current: number, total: number) => void,
|
|
295
|
-
): Promise<Map<string, LLMClassification>> {
|
|
296
|
-
const results = new Map<string, LLMClassification>();
|
|
297
|
-
|
|
298
|
-
for (let i = 0; i < issues.length; i++) {
|
|
299
|
-
const issue = issues[i];
|
|
300
|
-
onProgress?.(i + 1, issues.length);
|
|
301
|
-
|
|
302
|
-
const classification = await classifyWithLLM(issue);
|
|
303
|
-
results.set(issue.identifier, classification);
|
|
304
|
-
|
|
305
|
-
// Small delay between calls to avoid rate limiting
|
|
306
|
-
if (i < issues.length - 1) {
|
|
307
|
-
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
return results;
|
|
312
|
-
}
|