@chinhae/atw-cli 0.5.0 → 0.7.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/README.md +128 -451
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +24 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/channel/adapters/claude.d.ts +44 -2
- package/dist/commands/channel/adapters/claude.d.ts.map +1 -1
- package/dist/commands/channel/adapters/claude.js +124 -23
- package/dist/commands/channel/adapters/claude.js.map +1 -1
- package/dist/commands/channel/adapters/codex.d.ts +36 -6
- package/dist/commands/channel/adapters/codex.d.ts.map +1 -1
- package/dist/commands/channel/adapters/codex.js +150 -10
- package/dist/commands/channel/adapters/codex.js.map +1 -1
- package/dist/commands/channel/adapters/index.d.ts +33 -4
- package/dist/commands/channel/adapters/index.d.ts.map +1 -1
- package/dist/commands/channel/adapters/index.js +159 -6
- package/dist/commands/channel/adapters/index.js.map +1 -1
- package/dist/commands/channel/adapters/omp.d.ts +106 -0
- package/dist/commands/channel/adapters/omp.d.ts.map +1 -0
- package/dist/commands/channel/adapters/omp.js +405 -0
- package/dist/commands/channel/adapters/omp.js.map +1 -0
- package/dist/commands/channel/adapters/pi.d.ts +123 -0
- package/dist/commands/channel/adapters/pi.d.ts.map +1 -0
- package/dist/commands/channel/adapters/pi.js +387 -0
- package/dist/commands/channel/adapters/pi.js.map +1 -0
- package/dist/commands/channel/adapters/types.d.ts +16 -0
- package/dist/commands/channel/adapters/types.d.ts.map +1 -1
- package/dist/commands/channel/agent-loader.d.ts +1 -0
- package/dist/commands/channel/agent-loader.d.ts.map +1 -1
- package/dist/commands/channel/agent-loader.js +45 -5
- package/dist/commands/channel/agent-loader.js.map +1 -1
- package/dist/commands/channel/dev-parse-trace.d.ts +1 -1
- package/dist/commands/channel/dev-parse-trace.d.ts.map +1 -1
- package/dist/commands/channel/dev-parse-trace.js +25 -2
- package/dist/commands/channel/dev-parse-trace.js.map +1 -1
- package/dist/commands/channel/index.d.ts.map +1 -1
- package/dist/commands/channel/index.js +44 -12
- package/dist/commands/channel/index.js.map +1 -1
- package/dist/commands/channel/run.d.ts +39 -2
- package/dist/commands/channel/run.d.ts.map +1 -1
- package/dist/commands/channel/run.js +227 -68
- package/dist/commands/channel/run.js.map +1 -1
- package/dist/commands/channel/spawn.d.ts +7 -2
- package/dist/commands/channel/spawn.d.ts.map +1 -1
- package/dist/commands/channel/spawn.js +35 -1
- package/dist/commands/channel/spawn.js.map +1 -1
- package/dist/commands/channel/store/events.d.ts +2 -2
- package/dist/commands/channel/store/events.d.ts.map +1 -1
- package/dist/commands/channel/store/events.js +1 -1
- package/dist/commands/channel/store/events.js.map +1 -1
- package/dist/commands/channel/supervisor/shutdown.d.ts +2 -0
- package/dist/commands/channel/supervisor/shutdown.d.ts.map +1 -1
- package/dist/commands/channel/supervisor/shutdown.js +6 -1
- package/dist/commands/channel/supervisor/shutdown.js.map +1 -1
- package/dist/commands/channel/supervisor.d.ts +2 -2
- package/dist/commands/channel/supervisor.d.ts.map +1 -1
- package/dist/commands/channel/supervisor.js +26 -3
- package/dist/commands/channel/supervisor.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +6 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/mem.d.ts +2 -1
- package/dist/commands/mem.d.ts.map +1 -1
- package/dist/commands/mem.js +162 -13
- package/dist/commands/mem.js.map +1 -1
- package/dist/commands/mode.d.ts.map +1 -1
- package/dist/commands/mode.js +5 -3
- package/dist/commands/mode.js.map +1 -1
- package/dist/commands/uninstall.d.ts +5 -3
- package/dist/commands/uninstall.d.ts.map +1 -1
- package/dist/commands/uninstall.js +40 -16
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.d.ts +34 -0
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +209 -11
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/verify.d.ts +18 -0
- package/dist/commands/verify.d.ts.map +1 -0
- package/dist/commands/verify.js +75 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/configurators/index.d.ts.map +1 -1
- package/dist/configurators/index.js +3 -2
- package/dist/configurators/index.js.map +1 -1
- package/dist/configurators/omp.d.ts +22 -0
- package/dist/configurators/omp.d.ts.map +1 -1
- package/dist/configurators/omp.js +101 -2
- package/dist/configurators/omp.js.map +1 -1
- package/dist/configurators/shared.d.ts.map +1 -1
- package/dist/configurators/shared.js +39 -7
- package/dist/configurators/shared.js.map +1 -1
- package/dist/configurators/workflow.d.ts.map +1 -1
- package/dist/configurators/workflow.js +5 -1
- package/dist/configurators/workflow.js.map +1 -1
- package/dist/constants/paths.d.ts +4 -0
- package/dist/constants/paths.d.ts.map +1 -1
- package/dist/constants/paths.js +4 -0
- package/dist/constants/paths.js.map +1 -1
- package/dist/migrations/manifests/0.6.0.json +442 -0
- package/dist/migrations/manifests/0.7.0.json +1378 -0
- package/dist/templates/atw/definition-of-done.md +65 -0
- package/dist/templates/atw/gitignore.txt +7 -0
- package/dist/templates/atw/index.d.ts +11 -0
- package/dist/templates/atw/index.d.ts.map +1 -1
- package/dist/templates/atw/index.js +22 -0
- package/dist/templates/atw/index.js.map +1 -1
- package/dist/templates/atw/scripts/common/active_task.py +2 -2
- package/dist/templates/atw/scripts/common/workflow_phase.py +33 -0
- package/dist/templates/atw/scripts/cross_model_review.py +3312 -0
- package/dist/templates/atw/scripts/decision_log.py +2002 -0
- package/dist/templates/atw/scripts/floor_guard.py +642 -0
- package/dist/templates/atw/scripts/task.py +25 -6
- package/dist/templates/atw/scripts/tickets.py +480 -10
- package/dist/templates/atw/workflow-general.md +6 -1
- package/dist/templates/atw/workflow.md +346 -26
- package/dist/templates/claude/settings.json +12 -0
- package/dist/templates/codex/hooks/session-start.py +2 -2
- package/dist/templates/common/bundled-skills/atw-askme/SKILL.md +1 -1
- package/dist/templates/common/bundled-skills/atw-askme-with-docs/SKILL.md +1 -1
- package/dist/templates/common/bundled-skills/atw-channel/SKILL.md +5 -2
- package/dist/templates/common/bundled-skills/atw-channel/references/command-reference.md +44 -5
- package/dist/templates/common/bundled-skills/atw-channel/references/progress-debugging.md +9 -0
- package/dist/templates/common/bundled-skills/atw-channel/references/workers.md +48 -4
- package/dist/templates/common/bundled-skills/atw-code-review/SKILL.md +78 -3
- package/dist/templates/common/bundled-skills/atw-codebase-design/SKILL.md +2 -2
- package/dist/templates/common/bundled-skills/atw-codebase-design/{DESIGN-IT-TWICE.md → design-it-twice.md} +3 -3
- package/dist/templates/common/bundled-skills/atw-cross-model-review/SKILL.md +361 -0
- package/dist/templates/common/bundled-skills/atw-cross-model-review/agents/openai.yaml +5 -0
- package/dist/templates/common/bundled-skills/atw-cross-model-review/references/four-tiers.md +42 -0
- package/dist/templates/common/bundled-skills/atw-cross-model-review/references/log-review-questions.md +38 -0
- package/dist/templates/common/bundled-skills/atw-cross-model-review/references/questions.md +54 -0
- package/dist/templates/common/bundled-skills/atw-cross-model-review/references/recheck-questions.md +42 -0
- package/dist/templates/common/bundled-skills/atw-cross-model-review/references/report-format.md +22 -0
- package/dist/templates/common/bundled-skills/atw-diagnosing-bugs/SKILL.md +13 -2
- package/dist/templates/common/bundled-skills/atw-domain-modeling/SKILL.md +2 -2
- package/dist/templates/common/bundled-skills/atw-handoff/SKILL.md +1 -1
- package/dist/templates/common/bundled-skills/atw-implement/SKILL.md +37 -1
- package/dist/templates/common/bundled-skills/atw-implement-all/SKILL.md +219 -24
- package/dist/templates/common/bundled-skills/atw-implement-spec/SKILL.md +237 -18
- package/dist/templates/common/bundled-skills/atw-improve-codebase-architecture/SKILL.md +2 -2
- package/dist/templates/common/bundled-skills/atw-init-repo/SKILL.md +1 -1
- package/dist/templates/common/bundled-skills/atw-init-repo/references/issue-tracker-atw-local.md +7 -1
- package/dist/templates/common/bundled-skills/atw-init-repo/references/issue-tracker-atw.md +7 -1
- package/dist/templates/common/bundled-skills/atw-map/SKILL.md +1 -1
- package/dist/templates/common/bundled-skills/atw-meta/SKILL.md +1 -1
- package/dist/templates/common/bundled-skills/atw-meta/references/customize-local/add-project-local-conventions.md +4 -3
- package/dist/templates/common/bundled-skills/atw-meta/references/customize-local/change-skills-or-commands.md +21 -16
- package/dist/templates/common/bundled-skills/atw-meta/references/customize-local/change-task-lifecycle.md +1 -1
- package/dist/templates/common/bundled-skills/atw-meta/references/customize-local/overview.md +1 -0
- package/dist/templates/common/bundled-skills/atw-meta/references/local-architecture/task-system.md +2 -1
- package/dist/templates/common/bundled-skills/atw-meta/references/platform-files/hooks-and-settings.md +1 -0
- package/dist/templates/common/bundled-skills/atw-noob-mode/SKILL.md +1 -1
- package/dist/templates/common/bundled-skills/atw-performance/SKILL.md +134 -0
- package/dist/templates/common/bundled-skills/atw-performance/agents/openai.yaml +3 -0
- package/dist/templates/common/bundled-skills/atw-performance/references/optimization-patterns.md +250 -0
- package/dist/templates/common/bundled-skills/atw-performance/references/performance-checklist.md +238 -0
- package/dist/templates/common/bundled-skills/atw-performance/references/performance-optimization.md +264 -0
- package/dist/templates/common/bundled-skills/atw-prototype/SKILL.md +3 -3
- package/dist/templates/common/bundled-skills/atw-prototype/{LOGIC.md → logic.md} +1 -1
- package/dist/templates/common/bundled-skills/atw-prototype/references/design-direction.md +91 -58
- package/dist/templates/common/bundled-skills/atw-prototype/references/direction-persuasion.md +25 -0
- package/dist/templates/common/bundled-skills/atw-prototype/references/style-explorer.md +1 -1
- package/dist/templates/common/bundled-skills/atw-prototype/ui.md +194 -0
- package/dist/templates/common/bundled-skills/atw-reflect/SKILL.md +77 -0
- package/dist/templates/common/bundled-skills/atw-reflect/agents/openai.yaml +5 -0
- package/dist/templates/common/bundled-skills/atw-reflect/references/divergent-reviewer.md +38 -0
- package/dist/templates/common/bundled-skills/atw-reflect/references/judgment-reviewer.md +37 -0
- package/dist/templates/common/bundled-skills/atw-reflect/references/synthesizer.md +63 -0
- package/dist/templates/common/bundled-skills/atw-reflect/references/tooling-reviewer.md +48 -0
- package/dist/templates/common/bundled-skills/atw-security/SKILL.md +248 -0
- package/dist/templates/common/bundled-skills/atw-security/agents/openai.yaml +3 -0
- package/dist/templates/common/bundled-skills/atw-security/references/hardening-patterns.md +324 -0
- package/dist/templates/common/bundled-skills/atw-security/references/security-checklist.md +248 -0
- package/dist/templates/common/bundled-skills/atw-session-insight/SKILL.md +1 -1
- package/dist/templates/common/bundled-skills/atw-session-insight/references/cli-quick-reference.md +11 -2
- package/dist/templates/common/bundled-skills/atw-spec/SKILL.md +1 -1
- package/dist/templates/common/bundled-skills/atw-tdd/SKILL.md +25 -0
- package/dist/templates/common/bundled-skills/atw-tickets/SKILL.md +1 -1
- package/dist/templates/common/bundled-skills/atw-triage/SKILL.md +5 -5
- package/dist/templates/common/bundled-skills/atw-ui/SKILL.md +99 -31
- package/dist/templates/common/bundled-skills/atw-ui/references/accessibility-checklist.md +160 -0
- package/dist/templates/common/bundled-skills/atw-ui/references/layout-and-viewport.md +7 -5
- package/dist/templates/common/bundled-skills/atw-ui/references/media.md +117 -20
- package/dist/templates/common/bundled-skills/atw-ui/references/motion.md +47 -23
- package/dist/templates/common/bundled-skills/atw-ui/references/play.md +18 -0
- package/dist/templates/common/bundled-skills/atw-ui/references/reviewer-manual.md +73 -0
- package/dist/templates/common/bundled-skills/atw-ui/references/scroll-narrative.md +98 -0
- package/dist/templates/common/bundled-skills/atw-ui/references/tools.md +46 -0
- package/dist/templates/common/bundled-skills/atw-ui/references/visual-language.md +40 -24
- package/dist/templates/common/bundled-skills/atw-ui/references/visual-review.md +26 -82
- package/dist/templates/common/bundled-skills/atw-ui/scripts/shoot.mjs +1721 -0
- package/dist/templates/common/bundled-skills/atw-verify-skill/SKILL.md +58 -0
- package/dist/templates/common/bundled-skills/atw-verify-skill/agents/openai.yaml +5 -0
- package/dist/templates/common/bundled-skills/atw-verify-skill/references/feature-map-example/README.md +47 -0
- package/dist/templates/common/bundled-skills/atw-verify-skill/references/feature-map-example/create-note.md +39 -0
- package/dist/templates/common/bundled-skills/atw-verify-skill/references/feature-map-example/search.md +45 -0
- package/dist/templates/common/bundled-skills/atw-verify-skill/references/generate.md +107 -0
- package/dist/templates/common/bundled-skills/atw-verify-skill/references/health-check.md +100 -0
- package/dist/templates/common/bundled-skills/atw-verify-skill/references/verify-skill-template.md +99 -0
- package/dist/templates/common/bundled-skills/atw-what-happened/SKILL.md +49 -0
- package/dist/templates/common/bundled-skills/atw-what-happened/agents/openai.yaml +5 -0
- package/dist/templates/common/commands/finish-work.md +10 -1
- package/dist/templates/common/commands/start.md +3 -1
- package/dist/templates/common/skills/update-spec.md +40 -4
- package/dist/templates/copilot/hooks/session-start.py +2 -2
- package/dist/templates/dsh/DSH.md +2 -2
- package/dist/templates/markdown/spec/backend/quality-guidelines.md.txt +10 -0
- package/dist/templates/markdown/spec/frontend/quality-guidelines.md.txt +10 -0
- package/dist/templates/omp/config.yml +15 -0
- package/dist/templates/omp/extensions/atw/index.ts.txt +135 -18
- package/dist/templates/omp/index.d.ts +1 -0
- package/dist/templates/omp/index.d.ts.map +1 -1
- package/dist/templates/omp/index.js +3 -0
- package/dist/templates/omp/index.js.map +1 -1
- package/dist/templates/opencode/lib/session-utils.js +4 -2
- package/dist/templates/opencode/plugins/inject-workflow-state.js +5 -1
- package/dist/templates/pi/extensions/atw/index.ts.txt +80 -7
- package/dist/templates/shared-hooks/index.d.ts +8 -1
- package/dist/templates/shared-hooks/index.d.ts.map +1 -1
- package/dist/templates/shared-hooks/index.js +8 -0
- package/dist/templates/shared-hooks/index.js.map +1 -1
- package/dist/templates/shared-hooks/inject-workflow-state.py +131 -14
- package/dist/templates/shared-hooks/session-start.py +4 -2
- package/dist/templates/shared-hooks/show-notice.py +135 -0
- package/dist/templates/snow/SNOW.md +1 -1
- package/dist/utils/initialized.d.ts +9 -0
- package/dist/utils/initialized.d.ts.map +1 -0
- package/dist/utils/initialized.js +24 -0
- package/dist/utils/initialized.js.map +1 -0
- package/dist/utils/managed-removal.d.ts +2 -0
- package/dist/utils/managed-removal.d.ts.map +1 -1
- package/dist/utils/managed-removal.js +23 -3
- package/dist/utils/managed-removal.js.map +1 -1
- package/dist/utils/optional-skills.d.ts +2 -0
- package/dist/utils/optional-skills.d.ts.map +1 -1
- package/dist/utils/optional-skills.js +1 -1
- package/dist/utils/optional-skills.js.map +1 -1
- package/dist/utils/template-hash.d.ts.map +1 -1
- package/dist/utils/template-hash.js +3 -0
- package/dist/utils/template-hash.js.map +1 -1
- package/dist/utils/uninstall-scrubbers.d.ts +10 -0
- package/dist/utils/uninstall-scrubbers.d.ts.map +1 -1
- package/dist/utils/uninstall-scrubbers.js +50 -0
- package/dist/utils/uninstall-scrubbers.js.map +1 -1
- package/dist/utils/verify-entries.d.ts +51 -0
- package/dist/utils/verify-entries.d.ts.map +1 -0
- package/dist/utils/verify-entries.js +399 -0
- package/dist/utils/verify-entries.js.map +1 -0
- package/package.json +2 -2
- package/dist/templates/common/bundled-skills/atw-prototype/UI.md +0 -174
- package/dist/templates/common/bundled-skills/atw-prototype/references/visual-language.md +0 -88
- package/dist/templates/common/bundled-skills/atw-prototype/references/visual-review.md +0 -63
- package/dist/templates/common/bundled-skills/atw-ui/references/imagery.md +0 -69
- /package/dist/templates/common/bundled-skills/atw-codebase-design/{DEEPENING.md → deepening.md} +0 -0
- /package/dist/templates/common/bundled-skills/atw-domain-modeling/{ADR-FORMAT.md → adr-format.md} +0 -0
- /package/dist/templates/common/bundled-skills/atw-domain-modeling/{GLOSSARY-FORMAT.md → glossary-format.md} +0 -0
- /package/dist/templates/common/bundled-skills/atw-improve-codebase-architecture/{HTML-REPORT.md → html-report.md} +0 -0
- /package/dist/templates/common/bundled-skills/atw-triage/{AGENT-BRIEF.md → agent-brief.md} +0 -0
- /package/dist/templates/common/bundled-skills/atw-triage/{OUT-OF-SCOPE.md → out-of-scope.md} +0 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import type { ParseResult, WorkerModes } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* omp `--mode rpc --no-ui` adapter (one JSON object per line both ways, not
|
|
4
|
+
* JSON-RPC). The event frames are pi's (omp is a pi fork), so the frame
|
|
5
|
+
* helpers are shared with `pi.ts`; turn ends, interrupts and startup differ.
|
|
6
|
+
*
|
|
7
|
+
* Wire shape (research/pi-omp-channel-workers.md 1.2, research/tools-side-pi-omp.md
|
|
8
|
+
* 2.2 / 3.2 / 4.2; command names checked against the omp 18.10.3 binary):
|
|
9
|
+
*
|
|
10
|
+
* Startup: omp writes `ready` before it handles commands.
|
|
11
|
+
* Outbound: set_event_filter (messageUpdates "delta") → get_available_thinking_levels
|
|
12
|
+
* (only with --effort) → get_state → get_session_stats (cost baseline)
|
|
13
|
+
* → prompt per user message; abort_and_prompt for an interrupt.
|
|
14
|
+
* Inbound:
|
|
15
|
+
* ready → handshake may start
|
|
16
|
+
* response get_state → persistSessionId + progress(kind=model)
|
|
17
|
+
* response prompt/abort_and_prompt success:false (current) → error
|
|
18
|
+
* response prompt data.agentInvoked:false (current) → handled locally, no prompt_result follows: turn over
|
|
19
|
+
* prompt_result, id = current prompt → turn over: ask get_session_stats, then done / error
|
|
20
|
+
* prompt_result, id = interrupted → progress(turn_cost, unreported when 0) only
|
|
21
|
+
* response get_session_stats → progress(token_usage) + progress(turn_cost) + held done/error
|
|
22
|
+
* message_update text_delta → progress(kind=output, stream_id omp-<messageId>)
|
|
23
|
+
* message_end assistant → say(all text blocks joined); adds usage.cost.total to the turn
|
|
24
|
+
* tool_execution_start → progress(tool, input_summary)
|
|
25
|
+
* extension_ui_request (dialog) → reply cancelled
|
|
26
|
+
*
|
|
27
|
+
* Every accepted prompt ends with exactly one `prompt_result` carrying its
|
|
28
|
+
* id. `abort_and_prompt` aborts and starts the replacement in one command;
|
|
29
|
+
* the interrupted prompt's own `prompt_result{status:"aborted"}` arrives
|
|
30
|
+
* before the new turn starts, and must not end the turn the supervisor has
|
|
31
|
+
* already begun. Until it arrives, frames belong to the interrupted turn.
|
|
32
|
+
*/
|
|
33
|
+
export interface OmpCtx {
|
|
34
|
+
nextId: number;
|
|
35
|
+
/** omp's `ready` frame has arrived. */
|
|
36
|
+
started: boolean;
|
|
37
|
+
filterSeen: boolean;
|
|
38
|
+
levels?: string[];
|
|
39
|
+
stateSeen: boolean;
|
|
40
|
+
/** Set by the handshake once everything above has answered. */
|
|
41
|
+
ready: boolean;
|
|
42
|
+
/** Last `get_session_stats.cost` reading; undefined until known. */
|
|
43
|
+
statsCost?: number;
|
|
44
|
+
baseSeen: boolean;
|
|
45
|
+
/** Id of the prompt whose `prompt_result` ends the running turn. */
|
|
46
|
+
current?: string;
|
|
47
|
+
/** Id of an interrupted prompt whose `prompt_result` is still to come. */
|
|
48
|
+
interrupted?: string;
|
|
49
|
+
streamSeq: number;
|
|
50
|
+
turnCost: number;
|
|
51
|
+
lastErrorMessage?: string;
|
|
52
|
+
/** Finished turn whose terminal event waits for get_session_stats. */
|
|
53
|
+
held?: {
|
|
54
|
+
statsId: string;
|
|
55
|
+
messageCost: number;
|
|
56
|
+
aborted: boolean;
|
|
57
|
+
failed: boolean;
|
|
58
|
+
errorMessage?: string;
|
|
59
|
+
stale: boolean;
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
export declare function createOmpCtx(): OmpCtx;
|
|
63
|
+
/**
|
|
64
|
+
* Keep every event type (prompt_result and responses are never filtered) but
|
|
65
|
+
* drop the cumulative `partial` snapshot from `message_update`: in the
|
|
66
|
+
* default mode four sentences made 0.5 MB of stdout (omp-1).
|
|
67
|
+
*/
|
|
68
|
+
export declare function encodeOmpEventFilter(): string;
|
|
69
|
+
export declare function encodeOmpLevelsRequest(): string;
|
|
70
|
+
export declare function encodeOmpStateRequest(): string;
|
|
71
|
+
export declare function encodeOmpBaseStatsRequest(): string;
|
|
72
|
+
export declare function encodeOmpUserMessage(ctx: OmpCtx, text: string): string;
|
|
73
|
+
/**
|
|
74
|
+
* Running turn → one `abort_and_prompt`. Idle (or finished but still waiting
|
|
75
|
+
* for stats) → a plain prompt; a held terminal belongs to the old turn and
|
|
76
|
+
* must not end the new one.
|
|
77
|
+
*/
|
|
78
|
+
export declare function encodeOmpInterruptMessage(ctx: OmpCtx, text: string): string;
|
|
79
|
+
export declare function parseOmpLine(line: string, ctx: OmpCtx): ParseResult;
|
|
80
|
+
/**
|
|
81
|
+
* Settings for omp's `--config` overlay, built per run from the switches
|
|
82
|
+
* and the model; undefined when nothing needs overriding.
|
|
83
|
+
*/
|
|
84
|
+
export declare function buildOmpConfigOverlay(view: WorkerModes & {
|
|
85
|
+
model?: string;
|
|
86
|
+
}): Record<string, unknown> | undefined;
|
|
87
|
+
/** The overlay file's text: JSON is valid YAML, which is how omp reads `--config`. */
|
|
88
|
+
export declare function renderOmpConfigOverlay(overlay: Record<string, unknown>): string;
|
|
89
|
+
export declare function buildOmpArgs(opts: {
|
|
90
|
+
resumeSessionId?: string;
|
|
91
|
+
model?: string;
|
|
92
|
+
systemPrompt?: string;
|
|
93
|
+
systemPromptFile?: string;
|
|
94
|
+
configOverlayFile?: string;
|
|
95
|
+
modes?: WorkerModes;
|
|
96
|
+
}): string[];
|
|
97
|
+
/**
|
|
98
|
+
* `omp --help` 18.10.3 `--thinking`, minus `auto`: it asks the `judge` model
|
|
99
|
+
* to grade every request first (research tools-side 2.2).
|
|
100
|
+
*/
|
|
101
|
+
export declare const OMP_EFFORT_LEVELS: readonly ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
|
|
102
|
+
export declare function validateOmpModes(modes: WorkerModes & {
|
|
103
|
+
resume?: string;
|
|
104
|
+
model?: string;
|
|
105
|
+
}): void;
|
|
106
|
+
//# sourceMappingURL=omp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"omp.d.ts","sourceRoot":"","sources":["../../../../src/commands/channel/adapters/omp.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAgB,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,+DAA+D;IAC/D,KAAK,EAAE,OAAO,CAAC;IACf,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,oEAAoE;IACpE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,sEAAsE;IACtE,IAAI,CAAC,EAAE;QACL,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,EAAE,OAAO,CAAC;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,KAAK,EAAE,OAAO,CAAC;KAChB,CAAC;CACH;AAED,wBAAgB,YAAY,IAAI,MAAM,CAWrC;AAWD;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAK7C;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,wBAAgB,yBAAyB,IAAI,MAAM,CAElD;AAkBD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAK3E;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,WAAW,CA8CnE;AAuND;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,WAAW,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACrC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAsBrC;AAED,sFAAsF;AACtF,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,MAAM,CAER;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE;IACjC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB,GAAG,MAAM,EAAE,CA0CX;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,sEAQpB,CAAC;AAEX,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,WAAW,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACvD,IAAI,CAwBN"}
|
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
import { assistantText, cancelDialog, costEvent, isObject, modelEvents, takeTurnCost, tokenUsageEvents, toolProgress, } from "./pi.js";
|
|
2
|
+
export function createOmpCtx() {
|
|
3
|
+
return {
|
|
4
|
+
nextId: 1,
|
|
5
|
+
started: false,
|
|
6
|
+
filterSeen: false,
|
|
7
|
+
stateSeen: false,
|
|
8
|
+
ready: false,
|
|
9
|
+
baseSeen: false,
|
|
10
|
+
streamSeq: 0,
|
|
11
|
+
turnCost: 0,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
const FILTER_ID = "atw-filter";
|
|
15
|
+
const LEVELS_ID = "atw-levels";
|
|
16
|
+
const STATE_ID = "atw-state";
|
|
17
|
+
const BASE_STATS_ID = "atw-stats-base";
|
|
18
|
+
function command(id, type, extra = {}) {
|
|
19
|
+
return JSON.stringify({ id, type, ...extra }) + "\n";
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Keep every event type (prompt_result and responses are never filtered) but
|
|
23
|
+
* drop the cumulative `partial` snapshot from `message_update`: in the
|
|
24
|
+
* default mode four sentences made 0.5 MB of stdout (omp-1).
|
|
25
|
+
*/
|
|
26
|
+
export function encodeOmpEventFilter() {
|
|
27
|
+
return command(FILTER_ID, "set_event_filter", {
|
|
28
|
+
events: null,
|
|
29
|
+
messageUpdates: "delta",
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
export function encodeOmpLevelsRequest() {
|
|
33
|
+
return command(LEVELS_ID, "get_available_thinking_levels");
|
|
34
|
+
}
|
|
35
|
+
export function encodeOmpStateRequest() {
|
|
36
|
+
return command(STATE_ID, "get_state");
|
|
37
|
+
}
|
|
38
|
+
export function encodeOmpBaseStatsRequest() {
|
|
39
|
+
return command(BASE_STATS_ID, "get_session_stats");
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* omp runs a prompt that starts with `/` as a built-in or custom command
|
|
43
|
+
* (omp-4: `/tools` printed the tool list, no model call). Every check is a
|
|
44
|
+
* plain `startsWith("/")` on the raw text, so a leading space keeps it a
|
|
45
|
+
* message for the model.
|
|
46
|
+
*/
|
|
47
|
+
function escapeSlash(text) {
|
|
48
|
+
return text.startsWith("/") ? ` ${text}` : text;
|
|
49
|
+
}
|
|
50
|
+
function promptCommand(ctx, type, text) {
|
|
51
|
+
const id = `atw-prompt-${ctx.nextId++}`;
|
|
52
|
+
ctx.current = id;
|
|
53
|
+
return command(id, type, { message: escapeSlash(text) });
|
|
54
|
+
}
|
|
55
|
+
export function encodeOmpUserMessage(ctx, text) {
|
|
56
|
+
return promptCommand(ctx, "prompt", text);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Running turn → one `abort_and_prompt`. Idle (or finished but still waiting
|
|
60
|
+
* for stats) → a plain prompt; a held terminal belongs to the old turn and
|
|
61
|
+
* must not end the new one.
|
|
62
|
+
*/
|
|
63
|
+
export function encodeOmpInterruptMessage(ctx, text) {
|
|
64
|
+
if (ctx.held)
|
|
65
|
+
ctx.held.stale = true;
|
|
66
|
+
if (!ctx.current)
|
|
67
|
+
return promptCommand(ctx, "prompt", text);
|
|
68
|
+
ctx.interrupted = ctx.current;
|
|
69
|
+
return promptCommand(ctx, "abort_and_prompt", text);
|
|
70
|
+
}
|
|
71
|
+
export function parseOmpLine(line, ctx) {
|
|
72
|
+
const trimmed = line.trim();
|
|
73
|
+
if (!trimmed)
|
|
74
|
+
return { events: [] };
|
|
75
|
+
let msg;
|
|
76
|
+
try {
|
|
77
|
+
msg = JSON.parse(trimmed);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return {
|
|
81
|
+
events: [
|
|
82
|
+
{
|
|
83
|
+
kind: "error",
|
|
84
|
+
payload: {
|
|
85
|
+
message: "Failed to parse omp stdout line",
|
|
86
|
+
raw_excerpt: trimmed.slice(0, 200),
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
],
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
if (!isObject(msg))
|
|
93
|
+
return { events: [] };
|
|
94
|
+
switch (msg.type) {
|
|
95
|
+
case "ready":
|
|
96
|
+
ctx.started = true;
|
|
97
|
+
return { events: [] };
|
|
98
|
+
case "response":
|
|
99
|
+
return handleResponse(msg, ctx);
|
|
100
|
+
case "prompt_result":
|
|
101
|
+
return handlePromptResult(msg, ctx);
|
|
102
|
+
case "message_start":
|
|
103
|
+
if (isObject(msg.message) && msg.message.role === "assistant") {
|
|
104
|
+
ctx.streamSeq += 1;
|
|
105
|
+
}
|
|
106
|
+
return { events: [] };
|
|
107
|
+
case "message_update":
|
|
108
|
+
return handleMessageUpdate(msg, ctx);
|
|
109
|
+
case "message_end":
|
|
110
|
+
return handleMessageEnd(msg, ctx);
|
|
111
|
+
case "tool_execution_start":
|
|
112
|
+
if (ctx.interrupted)
|
|
113
|
+
return { events: [] };
|
|
114
|
+
return toolProgress(msg);
|
|
115
|
+
case "extension_ui_request":
|
|
116
|
+
return cancelDialog(msg);
|
|
117
|
+
default:
|
|
118
|
+
return { events: [] };
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
function handleResponse(msg, ctx) {
|
|
122
|
+
const data = isObject(msg.data) ? msg.data : {};
|
|
123
|
+
if (msg.id === FILTER_ID) {
|
|
124
|
+
ctx.filterSeen = true;
|
|
125
|
+
return { events: [] };
|
|
126
|
+
}
|
|
127
|
+
if (msg.id === LEVELS_ID) {
|
|
128
|
+
ctx.levels = Array.isArray(data.levels)
|
|
129
|
+
? data.levels.filter((l) => typeof l === "string")
|
|
130
|
+
: [];
|
|
131
|
+
return { events: [] };
|
|
132
|
+
}
|
|
133
|
+
if (msg.id === STATE_ID) {
|
|
134
|
+
ctx.stateSeen = true;
|
|
135
|
+
const events = modelEvents(data);
|
|
136
|
+
const sessionId = data.sessionId;
|
|
137
|
+
return typeof sessionId === "string" && sessionId
|
|
138
|
+
? { events, side: { persistSessionId: sessionId } }
|
|
139
|
+
: { events };
|
|
140
|
+
}
|
|
141
|
+
if (msg.id === BASE_STATS_ID) {
|
|
142
|
+
ctx.baseSeen = true;
|
|
143
|
+
if (typeof data.cost === "number")
|
|
144
|
+
ctx.statsCost = data.cost;
|
|
145
|
+
return { events: [] };
|
|
146
|
+
}
|
|
147
|
+
if (ctx.held && msg.id === ctx.held.statsId) {
|
|
148
|
+
return finishHeld(data, ctx);
|
|
149
|
+
}
|
|
150
|
+
if (msg.id !== undefined && msg.id === ctx.current) {
|
|
151
|
+
if (msg.success === false) {
|
|
152
|
+
ctx.current = undefined;
|
|
153
|
+
ctx.interrupted = undefined;
|
|
154
|
+
const error = typeof msg.error === "string" ? msg.error : "";
|
|
155
|
+
return {
|
|
156
|
+
events: [
|
|
157
|
+
{
|
|
158
|
+
kind: "error",
|
|
159
|
+
payload: { message: error || "omp rejected the prompt" },
|
|
160
|
+
},
|
|
161
|
+
],
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
// 在本地处理掉的输入(例如空消息)不会再有 prompt_result,这一轮就此结束。
|
|
165
|
+
if (data.agentInvoked === false)
|
|
166
|
+
return endTurn(ctx, "completed");
|
|
167
|
+
}
|
|
168
|
+
return { events: [] };
|
|
169
|
+
}
|
|
170
|
+
function handlePromptResult(msg, ctx) {
|
|
171
|
+
if (ctx.interrupted && msg.id === ctx.interrupted) {
|
|
172
|
+
// 被我们打断的那一轮:supervisor 已开始新一轮,只交出它的花费。
|
|
173
|
+
ctx.interrupted = undefined;
|
|
174
|
+
const cost = takeTurnCost(ctx, ctx.turnCost);
|
|
175
|
+
ctx.turnCost = 0;
|
|
176
|
+
ctx.lastErrorMessage = undefined;
|
|
177
|
+
return { events: [costEvent(cost, true)] };
|
|
178
|
+
}
|
|
179
|
+
if (!ctx.current || msg.id !== ctx.current)
|
|
180
|
+
return { events: [] };
|
|
181
|
+
const error = isObject(msg.error) ? msg.error.message : msg.error;
|
|
182
|
+
return endTurn(ctx, String(msg.status), typeof error === "string" && error ? error : undefined);
|
|
183
|
+
}
|
|
184
|
+
function endTurn(ctx, status, error) {
|
|
185
|
+
const messageCost = ctx.turnCost;
|
|
186
|
+
const errorMessage = error ?? ctx.lastErrorMessage;
|
|
187
|
+
ctx.turnCost = 0;
|
|
188
|
+
ctx.lastErrorMessage = undefined;
|
|
189
|
+
ctx.current = undefined;
|
|
190
|
+
const statsId = `atw-stats-${ctx.nextId++}`;
|
|
191
|
+
ctx.held = {
|
|
192
|
+
statsId,
|
|
193
|
+
messageCost,
|
|
194
|
+
aborted: status === "aborted",
|
|
195
|
+
failed: status !== "completed" && status !== "aborted",
|
|
196
|
+
errorMessage,
|
|
197
|
+
stale: false,
|
|
198
|
+
};
|
|
199
|
+
return {
|
|
200
|
+
events: [],
|
|
201
|
+
side: { reply: [command(statsId, "get_session_stats")] },
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
function finishHeld(data, ctx) {
|
|
205
|
+
const held = ctx.held;
|
|
206
|
+
if (!held)
|
|
207
|
+
return { events: [] };
|
|
208
|
+
ctx.held = undefined;
|
|
209
|
+
const events = tokenUsageEvents(data);
|
|
210
|
+
const turnCost = takeTurnCost(ctx, held.messageCost, typeof data.cost === "number" ? data.cost : undefined);
|
|
211
|
+
events.push(costEvent(turnCost, held.aborted));
|
|
212
|
+
// 打断撞上取花费的空当:这一轮已被 supervisor 记为打断,不再发结束事件。
|
|
213
|
+
if (held.stale)
|
|
214
|
+
return { events };
|
|
215
|
+
const terminal = held.aborted || held.failed
|
|
216
|
+
? {
|
|
217
|
+
kind: "error",
|
|
218
|
+
payload: {
|
|
219
|
+
message: held.errorMessage ??
|
|
220
|
+
(held.aborted ? "omp aborted the turn" : "omp turn failed"),
|
|
221
|
+
},
|
|
222
|
+
}
|
|
223
|
+
: { kind: "done", payload: { total_cost_usd: turnCost } };
|
|
224
|
+
events.push(terminal);
|
|
225
|
+
return { events };
|
|
226
|
+
}
|
|
227
|
+
function handleMessageUpdate(msg, ctx) {
|
|
228
|
+
if (ctx.interrupted)
|
|
229
|
+
return { events: [] };
|
|
230
|
+
const ev = msg.assistantMessageEvent;
|
|
231
|
+
if (!isObject(ev) || ev.type !== "text_delta")
|
|
232
|
+
return { events: [] };
|
|
233
|
+
if (typeof ev.delta !== "string" || !ev.delta)
|
|
234
|
+
return { events: [] };
|
|
235
|
+
const stream = typeof msg.messageId === "string" && msg.messageId
|
|
236
|
+
? msg.messageId
|
|
237
|
+
: `seq-${ctx.streamSeq}`;
|
|
238
|
+
const detail = {
|
|
239
|
+
kind: "output",
|
|
240
|
+
text_delta: ev.delta,
|
|
241
|
+
stream_id: `omp-${stream}`,
|
|
242
|
+
};
|
|
243
|
+
return { events: [{ kind: "progress", payload: { detail } }] };
|
|
244
|
+
}
|
|
245
|
+
function handleMessageEnd(msg, ctx) {
|
|
246
|
+
const message = isObject(msg.message) ? msg.message : undefined;
|
|
247
|
+
if (message?.role !== "assistant")
|
|
248
|
+
return { events: [] };
|
|
249
|
+
const usage = isObject(message.usage) ? message.usage : undefined;
|
|
250
|
+
const cost = usage && isObject(usage.cost) ? usage.cost.total : undefined;
|
|
251
|
+
if (typeof cost === "number")
|
|
252
|
+
ctx.turnCost += cost;
|
|
253
|
+
if (typeof message.errorMessage === "string") {
|
|
254
|
+
ctx.lastErrorMessage = message.errorMessage;
|
|
255
|
+
}
|
|
256
|
+
// 被打断的半截消息不当回答发出;半截文字已在增量里。
|
|
257
|
+
if (ctx.interrupted || message.stopReason === "aborted") {
|
|
258
|
+
return { events: [] };
|
|
259
|
+
}
|
|
260
|
+
const text = assistantText(message);
|
|
261
|
+
return text
|
|
262
|
+
? { events: [{ kind: "message", payload: { text } }] }
|
|
263
|
+
: { events: [] };
|
|
264
|
+
}
|
|
265
|
+
/** Every chat role (research 01 3.2), plus `judge`, which TTSR and `auto` thinking call. */
|
|
266
|
+
const OMP_PINNED_ROLES = [
|
|
267
|
+
"default",
|
|
268
|
+
"smol",
|
|
269
|
+
"slow",
|
|
270
|
+
"plan",
|
|
271
|
+
"vision",
|
|
272
|
+
"commit",
|
|
273
|
+
"tiny",
|
|
274
|
+
"memory",
|
|
275
|
+
"task",
|
|
276
|
+
"advisor",
|
|
277
|
+
"judge",
|
|
278
|
+
];
|
|
279
|
+
/**
|
|
280
|
+
* Discovery sources off in a clean environment: user and project context
|
|
281
|
+
* files (`AGENTS.md`, `CLAUDE.md`), MCP servers, other tools' plugins.
|
|
282
|
+
* Arrays in an overlay replace the lower layer, so the list is complete
|
|
283
|
+
* (research 01 3.2, measured: only read/grep/glob left, no context files).
|
|
284
|
+
*/
|
|
285
|
+
const OMP_CLEAN_DISABLED_PROVIDERS = [
|
|
286
|
+
"native",
|
|
287
|
+
"claude",
|
|
288
|
+
"claude-plugins",
|
|
289
|
+
"codex",
|
|
290
|
+
"cursor",
|
|
291
|
+
"gemini",
|
|
292
|
+
"opencode",
|
|
293
|
+
"vscode",
|
|
294
|
+
"windsurf",
|
|
295
|
+
"mcp-json",
|
|
296
|
+
"agents",
|
|
297
|
+
"agents-md",
|
|
298
|
+
"claude-md",
|
|
299
|
+
"github",
|
|
300
|
+
"cline",
|
|
301
|
+
"omp-plugins",
|
|
302
|
+
"agent-plugins",
|
|
303
|
+
"custom-context",
|
|
304
|
+
"ssh-json",
|
|
305
|
+
"builtin-defaults",
|
|
306
|
+
];
|
|
307
|
+
/** A reviewer: read-only and clean together. Only then are omp's helper roles pinned. */
|
|
308
|
+
function isReviewer(modes) {
|
|
309
|
+
return Boolean(modes.readOnly && modes.clean);
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Settings for omp's `--config` overlay, built per run from the switches
|
|
313
|
+
* and the model; undefined when nothing needs overriding.
|
|
314
|
+
*/
|
|
315
|
+
export function buildOmpConfigOverlay(view) {
|
|
316
|
+
const overlay = {};
|
|
317
|
+
if (view.clean) {
|
|
318
|
+
overlay.disabledProviders = [...OMP_CLEAN_DISABLED_PROVIDERS];
|
|
319
|
+
}
|
|
320
|
+
// 只给 read 不给 write 时,omp 会为 MCP 与扩展工具挂一条 xd:// 写通道。
|
|
321
|
+
if (view.readOnly)
|
|
322
|
+
overlay.tools = { xdev: false };
|
|
323
|
+
if (isReviewer(view) && view.model) {
|
|
324
|
+
// 不论用户配置里的角色是否可用,一律钉成复查员的模型,也不许换模型重试。
|
|
325
|
+
overlay.modelRoles = Object.fromEntries(OMP_PINNED_ROLES.map((role) => [role, view.model]));
|
|
326
|
+
overlay.retry = { modelFallback: false };
|
|
327
|
+
overlay.ttsr = { enabled: false, judge: "off" };
|
|
328
|
+
overlay.compaction = { enabled: false };
|
|
329
|
+
}
|
|
330
|
+
if (view.standardSpeed) {
|
|
331
|
+
// 快速档就是这几项设成 priority(Claude 的 fast mode 也走 tier.anthropic)。
|
|
332
|
+
overlay.tier = { openai: "none", anthropic: "none", google: "none" };
|
|
333
|
+
overlay.providers = { fireworksTier: "standard" };
|
|
334
|
+
}
|
|
335
|
+
return Object.keys(overlay).length > 0 ? overlay : undefined;
|
|
336
|
+
}
|
|
337
|
+
/** The overlay file's text: JSON is valid YAML, which is how omp reads `--config`. */
|
|
338
|
+
export function renderOmpConfigOverlay(overlay) {
|
|
339
|
+
return JSON.stringify(overlay, null, 2) + "\n";
|
|
340
|
+
}
|
|
341
|
+
export function buildOmpArgs(opts) {
|
|
342
|
+
const modes = opts.modes ?? {};
|
|
343
|
+
// --no-ui:要批准的工具直接失败,不会挂起等一个没人回答的弹窗。
|
|
344
|
+
const args = ["--mode", "rpc", "--no-ui"];
|
|
345
|
+
if (modes.readOnly) {
|
|
346
|
+
args.push("--tools", "read,grep,glob", "--approval-mode", "always-ask");
|
|
347
|
+
}
|
|
348
|
+
else {
|
|
349
|
+
// 默认可写,与 Claude 对接的全部放行相当,不受用户设的审批模式影响。
|
|
350
|
+
args.push("--approval-mode", "yolo");
|
|
351
|
+
}
|
|
352
|
+
if (modes.clean) {
|
|
353
|
+
args.push("--no-extensions", "--no-skills", "--no-rules", "--no-lsp", "--no-title");
|
|
354
|
+
}
|
|
355
|
+
if (modes.noSession)
|
|
356
|
+
args.push("--no-session");
|
|
357
|
+
if (modes.effort)
|
|
358
|
+
args.push("--thinking", modes.effort);
|
|
359
|
+
if (opts.resumeSessionId)
|
|
360
|
+
args.push("--resume", opts.resumeSessionId);
|
|
361
|
+
if (opts.model) {
|
|
362
|
+
args.push("--model", opts.model);
|
|
363
|
+
if (isReviewer(modes)) {
|
|
364
|
+
args.push("--smol", opts.model, "--slow", opts.model, "--plan", opts.model);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
if (opts.configOverlayFile)
|
|
368
|
+
args.push("--config", opts.configOverlayFile);
|
|
369
|
+
if (opts.systemPromptFile) {
|
|
370
|
+
args.push("--append-system-prompt", opts.systemPromptFile);
|
|
371
|
+
}
|
|
372
|
+
else if (opts.systemPrompt?.trim()) {
|
|
373
|
+
args.push("--append-system-prompt", opts.systemPrompt);
|
|
374
|
+
}
|
|
375
|
+
return args;
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* `omp --help` 18.10.3 `--thinking`, minus `auto`: it asks the `judge` model
|
|
379
|
+
* to grade every request first (research tools-side 2.2).
|
|
380
|
+
*/
|
|
381
|
+
export const OMP_EFFORT_LEVELS = [
|
|
382
|
+
"off",
|
|
383
|
+
"minimal",
|
|
384
|
+
"low",
|
|
385
|
+
"medium",
|
|
386
|
+
"high",
|
|
387
|
+
"xhigh",
|
|
388
|
+
"max",
|
|
389
|
+
];
|
|
390
|
+
export function validateOmpModes(modes) {
|
|
391
|
+
if (modes.resume && modes.noSession) {
|
|
392
|
+
throw new Error("omp: --resume cannot be combined with --no-session (an unsaved session cannot be resumed)");
|
|
393
|
+
}
|
|
394
|
+
if (modes.effort === "auto") {
|
|
395
|
+
throw new Error("omp: --effort 'auto' is not allowed: omp would call its judge model to pick a level for every request");
|
|
396
|
+
}
|
|
397
|
+
if (modes.effort !== undefined &&
|
|
398
|
+
!OMP_EFFORT_LEVELS.includes(modes.effort)) {
|
|
399
|
+
throw new Error(`Invalid --effort '${modes.effort}' for omp. Must be one of: ${OMP_EFFORT_LEVELS.join(", ")}`);
|
|
400
|
+
}
|
|
401
|
+
if (isReviewer(modes) && !modes.model) {
|
|
402
|
+
throw new Error("omp: --read-only with --clean needs --model (every helper role is pinned to the reviewer's model)");
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
//# sourceMappingURL=omp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"omp.js","sourceRoot":"","sources":["../../../../src/commands/channel/adapters/omp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import type { AdapterEvent, ParseResult, WorkerModes } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* pi `--mode rpc` adapter (one JSON object per line both ways, not JSON-RPC).
|
|
4
|
+
*
|
|
5
|
+
* Wire shape (real data — research/pi-omp-channel-workers.md 1.1,
|
|
6
|
+
* research/tools-side-pi-omp.md 3.1 / 4.1):
|
|
7
|
+
*
|
|
8
|
+
* Outbound: get_available_thinking_levels (only with --effort) → get_state
|
|
9
|
+
* → get_session_stats (cost baseline) → prompt per user message;
|
|
10
|
+
* abort → prompt for an interrupt.
|
|
11
|
+
* Inbound:
|
|
12
|
+
* response get_state → persistSessionId + progress(kind=model)
|
|
13
|
+
* response prompt success:false → error
|
|
14
|
+
* response abort (ours) → reply the held replacement prompt
|
|
15
|
+
* response get_session_stats → progress(token_usage) + progress(turn_cost) + held done/error
|
|
16
|
+
* message_start assistant → new output stream
|
|
17
|
+
* message_update text_delta → progress(kind=output, stream_id, text_delta)
|
|
18
|
+
* message_end assistant → say(all text blocks joined, as pi's get_last_assistant_text); adds usage.cost.total to the turn
|
|
19
|
+
* tool_execution_start → progress(tool, input_summary)
|
|
20
|
+
* agent_settled → turn over: ask get_session_stats, then done / error
|
|
21
|
+
* extension_ui_request (dialog) → reply cancelled
|
|
22
|
+
*
|
|
23
|
+
* A turn ends at `agent_settled`, not `agent_end` (retries and queued work
|
|
24
|
+
* can follow `agent_end`). pi rejects a prompt sent while a turn is running,
|
|
25
|
+
* so an interrupt is two-phase: send `abort`, swallow the old turn's
|
|
26
|
+
* `agent_settled{aborted:true}` (the supervisor has already started the new
|
|
27
|
+
* turn), and send the replacement prompt once the abort response is back.
|
|
28
|
+
*
|
|
29
|
+
* Cost: `get_session_stats.cost` is the session's running total of every
|
|
30
|
+
* `usage.cost.total` — assistant messages plus tool-reported usage and
|
|
31
|
+
* compaction / branch summaries (research/tools-side-pi-omp.md 3.1), so a
|
|
32
|
+
* turn's cost is its growth since the previous reading; the handshake takes
|
|
33
|
+
* the first reading (a resumed session starts above 0). The turn's
|
|
34
|
+
* `message_end` costs are the fallback when stats carry no number, and stand
|
|
35
|
+
* in for an interrupted turn, which gets no stats request of its own.
|
|
36
|
+
*/
|
|
37
|
+
export interface PiCtx {
|
|
38
|
+
nextId: number;
|
|
39
|
+
/** Set by the handshake once get_state has answered. */
|
|
40
|
+
ready: boolean;
|
|
41
|
+
/** get_available_thinking_levels answer for the handshake. */
|
|
42
|
+
levels?: string[];
|
|
43
|
+
stateSeen: boolean;
|
|
44
|
+
/** Last `get_session_stats.cost` reading; undefined until known. */
|
|
45
|
+
statsCost?: number;
|
|
46
|
+
baseSeen: boolean;
|
|
47
|
+
/** A prompt was sent and its turn has not settled yet. */
|
|
48
|
+
active: boolean;
|
|
49
|
+
/** Abort sent; the replacement prompt waits for the abort response. */
|
|
50
|
+
abort?: {
|
|
51
|
+
id: string;
|
|
52
|
+
prompt: string;
|
|
53
|
+
};
|
|
54
|
+
streamSeq: number;
|
|
55
|
+
turnCost: number;
|
|
56
|
+
lastStopReason?: string;
|
|
57
|
+
lastErrorMessage?: string;
|
|
58
|
+
/** Settled turn whose terminal event waits for get_session_stats. */
|
|
59
|
+
held?: {
|
|
60
|
+
statsId: string;
|
|
61
|
+
messageCost: number;
|
|
62
|
+
aborted: boolean;
|
|
63
|
+
failed: boolean;
|
|
64
|
+
errorMessage?: string;
|
|
65
|
+
stale: boolean;
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
export declare function createPiCtx(): PiCtx;
|
|
69
|
+
export declare function encodePiLevelsRequest(): string;
|
|
70
|
+
export declare function encodePiStateRequest(): string;
|
|
71
|
+
export declare function encodePiBaseStatsRequest(): string;
|
|
72
|
+
export declare function encodePiUserMessage(ctx: PiCtx, text: string): string;
|
|
73
|
+
/**
|
|
74
|
+
* Running turn → `abort` now, replacement prompt after its response. Idle
|
|
75
|
+
* (or settled but still waiting for stats) → the prompt goes straight out;
|
|
76
|
+
* a held terminal belongs to the old turn and must not end the new one.
|
|
77
|
+
*/
|
|
78
|
+
export declare function encodePiInterruptMessage(ctx: PiCtx, text: string): string;
|
|
79
|
+
export declare function isObject(x: unknown): x is Record<string, unknown>;
|
|
80
|
+
export declare function parsePiLine(line: string, ctx: PiCtx): ParseResult;
|
|
81
|
+
/** Tool calls become progress (pi and omp share the `tool_execution_start` frame). */
|
|
82
|
+
export declare function toolProgress(msg: Record<string, unknown>): ParseResult;
|
|
83
|
+
/** A dialog `extension_ui_request` would block until answered: answer it cancelled. */
|
|
84
|
+
export declare function cancelDialog(msg: Record<string, unknown>): ParseResult;
|
|
85
|
+
/** `get_state.model` as `provider/id` (pi and omp). */
|
|
86
|
+
export declare function modelEvents(data: Record<string, unknown>): AdapterEvent[];
|
|
87
|
+
/** `get_session_stats.tokens` (pi and omp). */
|
|
88
|
+
export declare function tokenUsageEvents(data: Record<string, unknown>): AdapterEvent[];
|
|
89
|
+
/** All text blocks of one assistant message joined, as pi's get_last_assistant_text. */
|
|
90
|
+
export declare function assistantText(message: Record<string, unknown>): string;
|
|
91
|
+
/**
|
|
92
|
+
* The turn's cost: growth of the stats running total when both readings are
|
|
93
|
+
* known, otherwise the turn's `message_end` costs (which also advance the
|
|
94
|
+
* remembered total, so the next reading is not counted twice).
|
|
95
|
+
*/
|
|
96
|
+
export declare function takeTurnCost(ctx: {
|
|
97
|
+
statsCost?: number;
|
|
98
|
+
}, messageCost: number, statsCost?: number): number;
|
|
99
|
+
/** pi reports 0 for an interrupted turn (measured, S2) although it did cost. */
|
|
100
|
+
export declare function costEvent(cost: number, interrupted: boolean): AdapterEvent;
|
|
101
|
+
/** Prompt files and text both go through `--append-system-prompt` (pi reads a path's contents). */
|
|
102
|
+
export declare function buildPiArgs(opts: {
|
|
103
|
+
resumeSessionId?: string;
|
|
104
|
+
model?: string;
|
|
105
|
+
systemPrompt?: string;
|
|
106
|
+
systemPromptFile?: string;
|
|
107
|
+
modes?: WorkerModes;
|
|
108
|
+
}): string[];
|
|
109
|
+
/** `pi --help` 1.2.0 `--thinking`. Which of these a model has is checked in the handshake. */
|
|
110
|
+
export declare const PI_EFFORT_LEVELS: readonly ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
|
|
111
|
+
/**
|
|
112
|
+
* pi only warns on an unknown `--thinking` and falls back to the default.
|
|
113
|
+
* `--session-id` (resume) and `--no-session` cannot be combined.
|
|
114
|
+
*/
|
|
115
|
+
export declare function validatePiModes(modes: WorkerModes & {
|
|
116
|
+
resume?: string;
|
|
117
|
+
}): void;
|
|
118
|
+
/**
|
|
119
|
+
* pi (and omp) silently clamp a level the model lacks to the nearest one it
|
|
120
|
+
* has, so the handshake refuses it before any message reaches the model.
|
|
121
|
+
*/
|
|
122
|
+
export declare function checkPiEffortForModel(effort: string, levels: string[], model: string | undefined, tool?: "pi" | "omp"): void;
|
|
123
|
+
//# sourceMappingURL=pi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pi.d.ts","sourceRoot":"","sources":["../../../../src/commands/channel/adapters/pi.ts"],"names":[],"mappings":"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"}
|