@litfamily/litopencode 1.0.29 → 1.0.31

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.
Files changed (154) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README-Ko-KR.md +7 -7
  3. package/README.md +7 -7
  4. package/dist/activation-primary-prompts.js +15 -6
  5. package/dist/activation-prompt-utils.d.ts +2 -2
  6. package/dist/activation-prompt-utils.js +9 -3
  7. package/dist/activation-reentry.d.ts +29 -0
  8. package/dist/activation-reentry.js +71 -0
  9. package/dist/activation-routing.d.ts +1 -1
  10. package/dist/activation-routing.js +40 -7
  11. package/dist/activation-workflow-prompts.d.ts +2 -0
  12. package/dist/activation-workflow-prompts.js +32 -7
  13. package/dist/activation.d.ts +6 -1
  14. package/dist/activation.js +34 -7
  15. package/dist/cli/args.js +14 -0
  16. package/dist/cli/auto-update.js +2 -4
  17. package/dist/cli/command-plan.d.ts +40 -0
  18. package/dist/cli/command-plan.js +62 -0
  19. package/dist/cli/doctor.d.ts +4 -1
  20. package/dist/cli/doctor.js +65 -4
  21. package/dist/cli/host-detect.d.ts +58 -0
  22. package/dist/cli/host-detect.js +199 -0
  23. package/dist/cli/install-report.js +3 -1
  24. package/dist/cli/install.d.ts +9 -1
  25. package/dist/cli/install.js +134 -31
  26. package/dist/cli/managed-skill-assets.d.ts +1 -1
  27. package/dist/cli/managed-skill-assets.js +5 -3
  28. package/dist/cli/office-dependencies.d.ts +2 -0
  29. package/dist/cli/office-dependencies.js +7 -3
  30. package/dist/cli/scientific-visualization-dependencies.js +1 -1
  31. package/dist/cli/tui-config.d.ts +27 -2
  32. package/dist/cli/tui-config.js +77 -2
  33. package/dist/cli/types.d.ts +17 -0
  34. package/dist/cli.js +9 -6
  35. package/dist/commands.d.ts +10 -1
  36. package/dist/commands.js +17 -3
  37. package/dist/features.d.ts +27 -1
  38. package/dist/features.js +40 -8
  39. package/dist/host/server.d.ts +7 -0
  40. package/dist/host/server.js +12 -0
  41. package/dist/host/tui.d.ts +7 -0
  42. package/dist/host/tui.js +12 -0
  43. package/dist/server.js +9 -0
  44. package/dist/skill-renames.d.ts +1 -1
  45. package/dist/skills.d.ts +9 -2
  46. package/dist/skills.js +22 -8
  47. package/dist/tui/mission-source-v2.d.ts +51 -0
  48. package/dist/tui/mission-source-v2.js +52 -0
  49. package/dist/v2/agents.d.ts +105 -0
  50. package/dist/v2/agents.js +185 -0
  51. package/dist/v2/commands.d.ts +44 -0
  52. package/dist/v2/commands.js +65 -0
  53. package/dist/v2/context.d.ts +67 -0
  54. package/dist/v2/context.js +17 -0
  55. package/dist/v2/events.d.ts +55 -0
  56. package/dist/v2/events.js +193 -0
  57. package/dist/v2/hooks.d.ts +39 -0
  58. package/dist/v2/hooks.js +61 -0
  59. package/dist/v2/server.d.ts +2 -0
  60. package/dist/v2/server.js +68 -0
  61. package/dist/v2/session-hooks.d.ts +64 -0
  62. package/dist/v2/session-hooks.js +230 -0
  63. package/dist/v2/tools.d.ts +26 -0
  64. package/dist/v2/tools.js +49 -0
  65. package/dist/v2/tui.d.ts +63 -0
  66. package/dist/v2/tui.js +259 -0
  67. package/docs/assets/cover-motion-still.webp +0 -0
  68. package/docs/assets/cover-motion.webp +0 -0
  69. package/docs/assets/cover.webp +0 -0
  70. package/docs/assets/readme/badge-version.svg +1 -1
  71. package/docs/assets/readme/litfamily-machines.png +0 -0
  72. package/docs/migration.md +4 -3
  73. package/docs/reference-Ko-KR.md +109 -7
  74. package/docs/reference.md +122 -9
  75. package/package.json +10 -5
  76. package/skills/deep-interview/SKILL.md +1 -1
  77. package/skills/lit-brainstorm/SKILL.md +299 -0
  78. package/skills/lit-brainstorm/references/handoff-briefs.md +72 -0
  79. package/skills/lit-brainstorm/references/lenses.md +106 -0
  80. package/skills/lit-brainstorm/references/scoring-and-convergence.md +93 -0
  81. package/skills/lit-brainstorm/references/session-notes-and-lanes.md +122 -0
  82. package/skills/lit-docx/SKILL.md +1 -1
  83. package/skills/lit-docx/run.py +42 -4
  84. package/skills/lit-docx/scripts/convert_md_to_pdf.py +38 -0
  85. package/skills/lit-docx/templates/latex/acs/template.tex +2 -0
  86. package/skills/lit-docx/templates/latex/elsevier/template.tex +2 -0
  87. package/skills/lit-docx/templates/latex/ieee/template.tex +2 -0
  88. package/skills/lit-docx/templates/latex/korean-generic/template.tex +2 -0
  89. package/skills/lit-docx/templates/latex/nature/template.tex +2 -0
  90. package/skills/lit-humanizer/scripts/detect.mjs +1 -1
  91. package/skills/lit-pptx/SKILL.md +1 -1
  92. package/skills/lit-pptx/command.mjs +94 -0
  93. package/skills/lit-pptx/run.mjs +16 -6
  94. package/skills/lit-pptx/scripts/compile-deck.js +2 -2
  95. package/skills/lit-typographic-motion/SKILL.md +5 -2
  96. package/skills/lit-typographic-motion/THIRD_PARTY_NOTICES +3 -0
  97. package/skills/lit-typographic-motion/engine/browser.mjs +3 -9
  98. package/skills/lit-typographic-motion/engine/command.mjs +94 -0
  99. package/skills/lit-typographic-motion/engine/constants.mjs +29 -1
  100. package/skills/lit-typographic-motion/engine/cover/assets.mjs +91 -0
  101. package/skills/lit-typographic-motion/engine/cover/capture.mjs +173 -0
  102. package/skills/lit-typographic-motion/engine/cover/decode.mjs +173 -0
  103. package/skills/lit-typographic-motion/engine/cover/frame-worker.mjs +19 -0
  104. package/skills/lit-typographic-motion/engine/cover/gate.mjs +261 -0
  105. package/skills/lit-typographic-motion/engine/cover/image.mjs +138 -0
  106. package/skills/lit-typographic-motion/engine/cover/render.mjs +323 -0
  107. package/skills/lit-typographic-motion/engine/cover/sheet.mjs +65 -0
  108. package/skills/lit-typographic-motion/engine/cover/treatment.mjs +110 -0
  109. package/skills/lit-typographic-motion/engine/encode.mjs +1 -1
  110. package/skills/lit-typographic-motion/engine/look.mjs +113 -10
  111. package/skills/lit-typographic-motion/engine/sound.mjs +1 -1
  112. package/skills/lit-typographic-motion/engine/stage/capture.mjs +26 -18
  113. package/skills/lit-typographic-motion/engine/stage/cover-init.js +38 -0
  114. package/skills/lit-typographic-motion/engine/stage/loop-kit.js +102 -0
  115. package/skills/lit-typographic-motion/engine/stage/render.mjs +4 -4
  116. package/skills/lit-typographic-motion/engine/treatment.mjs +1 -0
  117. package/skills/lit-typographic-motion/fonts/JetBrainsMono-OFL.txt +93 -0
  118. package/skills/lit-typographic-motion/fonts/JetBrainsMono-wght-latin.woff2 +0 -0
  119. package/skills/lit-typographic-motion/fonts/pins.json +3 -1
  120. package/skills/lit-typographic-motion/gate.mjs +34 -1
  121. package/skills/lit-typographic-motion/probe.mjs +8 -3
  122. package/skills/lit-typographic-motion/recipes/negatives/card-scenes/expected.json +16 -0
  123. package/skills/lit-typographic-motion/recipes/negatives/card-scenes/index.html +35 -0
  124. package/skills/lit-typographic-motion/recipes/negatives/reset-sweep/expected.json +16 -0
  125. package/skills/lit-typographic-motion/recipes/negatives/reset-sweep/index.html +29 -0
  126. package/skills/lit-typographic-motion/recipes/negatives/still-glow/expected.json +17 -0
  127. package/skills/lit-typographic-motion/recipes/negatives/still-glow/index.html +29 -0
  128. package/skills/lit-typographic-motion/recipes/negatives/title-slam/expected.json +17 -0
  129. package/skills/lit-typographic-motion/recipes/negatives/title-slam/index.html +35 -0
  130. package/skills/lit-typographic-motion/recipes/orbit-loop/expected.json +62 -0
  131. package/skills/lit-typographic-motion/recipes/orbit-loop/index.html +100 -0
  132. package/skills/lit-typographic-motion/recipes/painted-light/expected.json +95 -0
  133. package/skills/lit-typographic-motion/recipes/painted-light/index.html +232 -0
  134. package/skills/lit-typographic-motion/recipes/weight-tide/expected.json +62 -0
  135. package/skills/lit-typographic-motion/recipes/weight-tide/index.html +81 -0
  136. package/skills/lit-typographic-motion/references/cover.md +423 -0
  137. package/skills/lit-typographic-motion/references/craft-loop.md +2 -0
  138. package/skills/lit-typographic-motion/references/runtime.md +17 -2
  139. package/skills/lit-typographic-motion/references/stage.md +3 -0
  140. package/skills/lit-typographic-motion/references/treatment.md +4 -0
  141. package/skills/lit-typographic-motion/render.mjs +30 -6
  142. package/skills/lit-typographic-motion/requirements-audio.txt +3 -3
  143. package/skills/lit-typographic-motion/runtime.mjs +12 -13
  144. package/skills/{durable-litgoal → litgoal}/SKILL.md +31 -12
  145. package/skills/managed-skill-manifest.json +176 -32
  146. package/skills/readme-studio/templates/hyperframes/package-lock.json +3 -3
  147. package/skills/readme-studio/templates/remotion/package-lock.json +3 -3
  148. package/skills/review-work/SKILL.md +27 -18
  149. package/skills/skill-rename-aliases.json +2 -1
  150. package/tools/check-pack-payload.mjs +4 -1
  151. package/tools/payload-substance-allowlist.json +1 -1
  152. package/tools/payload-substance-parity.json +6 -4
  153. package/tools/qa-cover-recipes.mjs +167 -0
  154. package/tools/version-manifests.json +6 -0
@@ -1,7 +1,7 @@
1
1
  import type { Hooks } from "@opencode-ai/plugin";
2
2
  import type { BoundedAuthorityOptions } from "./bounded-authority.ts";
3
3
  import { type AutoHandoffRouteMode } from "./auto-handoff.ts";
4
- export type LitOpenCodeCommandId = "lit" | "lit-loop" | "litwork" | "lit-work" | "start-work" | "review-work" | "lit-plan" | "litgoal" | "lit-goal" | "litresearch" | "lit-research" | "lit-init" | "lit-crucible" | "lit-burnoff-file" | "lit-fetch" | "refactor" | "lit-burnoff" | "lit-code" | "debugging" | "lit-commit" | "lsp" | "lsp-setup" | "rules" | "deep-interview" | "structural-search" | "browser-drive" | "lit-recap" | "lit-comprehend" | "lit-handoff" | "lit-scientific-visualization" | "lit-humanizer" | "autoresearch" | "autoresearch-debug" | "autoresearch-fix" | "autoresearch-learn" | "autoresearch-plan" | "autoresearch-predict" | "autoresearch-reason" | "autoresearch-scenario" | "autoresearch-security" | "autoresearch-ship" | "autoconference" | "autoconference-analyze" | "autoconference-debate" | "autoconference-plan" | "autoconference-resume" | "autoconference-ship" | "autoconference-survey" | "wikify-init" | "wikify-ingest" | "wikify-query" | "wikify-save" | "wikify-lint";
4
+ export type LitOpenCodeCommandId = "lit" | "lit-loop" | "litwork" | "lit-work" | "start-work" | "review-work" | "lit-plan" | "litgoal" | "lit-goal" | "litresearch" | "lit-research" | "lit-init" | "lit-crucible" | "lit-brainstorm" | "lit-burnoff-file" | "lit-fetch" | "refactor" | "lit-burnoff" | "lit-code" | "debugging" | "lit-commit" | "lsp" | "lsp-setup" | "rules" | "deep-interview" | "structural-search" | "browser-drive" | "lit-recap" | "lit-comprehend" | "lit-handoff" | "lit-scientific-visualization" | "lit-humanizer" | "autoresearch" | "autoresearch-debug" | "autoresearch-fix" | "autoresearch-learn" | "autoresearch-plan" | "autoresearch-predict" | "autoresearch-reason" | "autoresearch-scenario" | "autoresearch-security" | "autoresearch-ship" | "autoconference" | "autoconference-analyze" | "autoconference-debate" | "autoconference-plan" | "autoconference-resume" | "autoconference-ship" | "autoconference-survey" | "wikify-init" | "wikify-ingest" | "wikify-query" | "wikify-save" | "wikify-lint";
5
5
  export type LitOpenCodeCommand = {
6
6
  readonly id: LitOpenCodeCommandId;
7
7
  readonly slash: string;
@@ -166,6 +166,15 @@ export declare const litOpenCodeCommands: readonly ({
166
166
  activationText: string;
167
167
  agent: string;
168
168
  readOnly?: undefined;
169
+ } | {
170
+ id: "lit-brainstorm";
171
+ slash: string;
172
+ title: string;
173
+ description: string;
174
+ banner: string;
175
+ activationText: string;
176
+ agent?: undefined;
177
+ readOnly?: undefined;
169
178
  } | {
170
179
  id: "refactor";
171
180
  slash: string;
package/dist/commands.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { activationBanner } from "./activation-probe.js";
2
2
  import { renamedSkillId, skillRenameNote } from "./skill-renames.js";
3
- import { comprehendPromptInjection, debuggingPromptInjection, deepInterviewPromptInjection, gitMasterPromptInjection, lspPromptInjection, lspSetupPromptInjection, rulesPromptInjection, browserDrivePromptInjection, structuralSearchPromptInjection, litGoalPromptInjection, litCruciblePromptInjection, initDeepPromptInjection, litLoopPromptInjection, litPlanPromptInjection, litRecapPromptInjection, litHandoffPromptInjection, litResearchPromptInjection, litCodePromptInjection, refactorPromptInjection, removeAiSlopsPromptInjection, reviewWorkPromptInjection, scientificVisualizationPromptInjection, startWorkPromptInjection, litBurnoffFilePromptInjection, litFetchPromptInjection, litHumanizerPromptInjection } from "./activation.js";
3
+ import { comprehendPromptInjection, debuggingPromptInjection, deepInterviewPromptInjection, gitMasterPromptInjection, lspPromptInjection, lspSetupPromptInjection, rulesPromptInjection, browserDrivePromptInjection, structuralSearchPromptInjection, litGoalPromptInjection, litBrainstormPromptInjection, litCruciblePromptInjection, initDeepPromptInjection, litLoopPromptInjection, litPlanPromptInjection, litRecapPromptInjection, litHandoffPromptInjection, litResearchPromptInjection, litCodePromptInjection, refactorPromptInjection, removeAiSlopsPromptInjection, reviewModeForcedNote, reviewWorkPromptInjection, scientificVisualizationPromptInjection, startWorkPromptInjection, litBurnoffFilePromptInjection, litFetchPromptInjection, litHumanizerPromptInjection } from "./activation.js";
4
4
  import { createLitGoalOperations } from "./ledger.js";
5
5
  import { commandAliasOwnership } from "./cli/command-alias-ownership.js";
6
6
  import { applyTrustedStartWorkDirective, parseStartWorkLifecycleDirective } from "./bounded-authority-hooks.js";
@@ -72,7 +72,7 @@ export const litOpenCodeCommands = Object.freeze([
72
72
  id: "review-work",
73
73
  slash: "/review-work",
74
74
  title: "LitOpenCode Review Work",
75
- description: "Review a draft plan for objective achievability or completed work across five evidence lanes.",
75
+ description: "Plan review after lit-plan or work review after lit-loop or start-work, picked from what exists; /review-work plan or /review-work work forces one.",
76
76
  banner: activationBanner("review-work"),
77
77
  activationText: reviewWorkPromptInjection
78
78
  },
@@ -88,7 +88,7 @@ export const litOpenCodeCommands = Object.freeze([
88
88
  id: "litgoal",
89
89
  slash: "/litgoal",
90
90
  title: "LitOpenCode Goal",
91
- description: "Bind a durable LitOpenCode goal before execution.",
91
+ description: "Set and keep the finish line: one goal with checkable criteria on durable state; lit-loop and start-work run toward it.",
92
92
  banner: activationBanner("litgoal"),
93
93
  activationText: litGoalPromptInjection
94
94
  },
@@ -135,6 +135,14 @@ export const litOpenCodeCommands = Object.freeze([
135
135
  activationText: litCruciblePromptInjection,
136
136
  agent: "lit-plan"
137
137
  },
138
+ {
139
+ id: "lit-brainstorm",
140
+ slash: "/lit-brainstorm",
141
+ title: "LitOpenCode Lit Brainstorm",
142
+ description: "Open an unsettled question into many options, narrow them to a short list with trade-offs, and hand the choice to deep-interview or lit-plan without implementing.",
143
+ banner: activationBanner("lit-brainstorm"),
144
+ activationText: litBrainstormPromptInjection
145
+ },
138
146
  {
139
147
  id: "refactor",
140
148
  slash: "/refactor",
@@ -301,6 +309,10 @@ function commandMode(command) {
301
309
  return "lit-init";
302
310
  if (command.id === "lit-crucible")
303
311
  return "lit-crucible";
312
+ if (command.id === "lit-brainstorm")
313
+ return "lit-brainstorm";
314
+ if (command.id === "litgoal" || command.id === "lit-goal")
315
+ return "litgoal";
304
316
  if (command.id === "refactor")
305
317
  return "refactor";
306
318
  if (command.id === "lit-burnoff")
@@ -575,6 +587,8 @@ export function createCommandActivationHook(projectRoot, options = {}) {
575
587
  });
576
588
  }
577
589
  let activationText = command.activationText;
590
+ if (command.id === "review-work")
591
+ activationText += reviewModeForcedNote(input.arguments);
578
592
  if (command.id === "start-work") {
579
593
  const durablePlan = await resolveLatestDurablePlan(projectRoot);
580
594
  if (durablePlan !== undefined) {
@@ -1,5 +1,5 @@
1
1
  export type LitOpenCodeBindingKind = "agent" | "cli" | "command" | "config" | "hook" | "tool";
2
- export type LitOpenCodeFeatureId = "planning-start-work-loop" | "lit-litwork-activation" | "start-work" | "review-work" | "litresearch" | "durable-ledger" | "bounded-authority-lifecycle" | "agent-roster" | "lit-plan" | "reference-benchmark-claims" | "native-goal-verdict" | "doctor-install" | "search-workflow-ideas" | "lit-fetch" | "guardrails" | "lit-init" | "lit-crucible" | "refactor" | "lit-burnoff" | "lit-burnoff-file" | "comment-checker" | "lit-code" | "debugging" | "lit-commit" | "lsp" | "lsp-setup" | "rules" | "deep-interview" | "structural-search" | "browser-drive" | "lit-humanizer" | "lit-recap" | "lit-comprehend" | "lit-handoff" | "lit-scientific-visualization" | "lit-diagram-drawer" | "lit-pptx" | "lit-typographic-motion" | "lit-docx" | "readme-studio" | "frontend-ui-ux" | "visual-qa" | "autoresearch" | "autoconference" | "wikify";
2
+ export type LitOpenCodeFeatureId = "planning-start-work-loop" | "lit-litwork-activation" | "start-work" | "review-work" | "litresearch" | "durable-ledger" | "bounded-authority-lifecycle" | "agent-roster" | "lit-plan" | "reference-benchmark-claims" | "native-goal-verdict" | "doctor-install" | "search-workflow-ideas" | "lit-fetch" | "guardrails" | "lit-init" | "lit-crucible" | "lit-brainstorm" | "refactor" | "lit-burnoff" | "lit-burnoff-file" | "comment-checker" | "lit-code" | "debugging" | "lit-commit" | "lsp" | "lsp-setup" | "rules" | "deep-interview" | "structural-search" | "browser-drive" | "lit-humanizer" | "lit-recap" | "lit-comprehend" | "lit-handoff" | "lit-scientific-visualization" | "lit-diagram-drawer" | "lit-pptx" | "lit-typographic-motion" | "lit-docx" | "readme-studio" | "frontend-ui-ux" | "visual-qa" | "autoresearch" | "autoconference" | "wikify";
3
3
  export type LitOpenCodeFeatureBinding = {
4
4
  readonly kind: LitOpenCodeBindingKind;
5
5
  readonly id: string;
@@ -208,6 +208,11 @@ export declare const litOpenCodeFeatures: readonly ({
208
208
  title: string;
209
209
  summary: string;
210
210
  bindings: ({
211
+ kind: "command";
212
+ id: string;
213
+ surface: string;
214
+ description: string;
215
+ } | {
211
216
  kind: "tool";
212
217
  id: string;
213
218
  surface: string;
@@ -415,6 +420,27 @@ export declare const litOpenCodeFeatures: readonly ({
415
420
  description: string;
416
421
  })[];
417
422
  verification: string[];
423
+ } | {
424
+ id: "lit-brainstorm";
425
+ title: string;
426
+ summary: string;
427
+ bindings: ({
428
+ kind: "config";
429
+ id: string;
430
+ surface: string;
431
+ description: string;
432
+ } | {
433
+ kind: "command";
434
+ id: string;
435
+ surface: string;
436
+ description: string;
437
+ } | {
438
+ kind: "agent";
439
+ id: string;
440
+ surface: string;
441
+ description: string;
442
+ })[];
443
+ verification: string[];
418
444
  } | {
419
445
  id: "refactor";
420
446
  title: string;
package/dist/features.js CHANGED
@@ -129,19 +129,19 @@ export const litOpenCodeFeatures = Object.freeze([
129
129
  {
130
130
  id: "review-work",
131
131
  title: "Review Work",
132
- summary: "Provides read-only draft-plan achievability review and five-lane completed-work review with evidence-backed verdicts.",
132
+ summary: "Provides read-only plan review after lit-plan and five-lane work review after lit-loop or start-work, picked from what exists or forced by the user, with evidence-backed verdicts.",
133
133
  bindings: [
134
134
  {
135
135
  kind: "command",
136
136
  id: "review-work",
137
137
  surface: "OpenCode command /review-work",
138
- description: "Reviews either a draft plan or completed work without implementing the reviewed artifact."
138
+ description: "Runs plan review or work review, picked from what exists or forced with /review-work plan or /review-work work, without implementing the reviewed artifact."
139
139
  },
140
140
  {
141
141
  kind: "tool",
142
142
  id: "review-work",
143
143
  surface: "OpenCode tool review-work",
144
- description: "Records review-work activation and exposes draft-plan or completed-work review guidance."
144
+ description: "Records review-work activation and exposes plan review and work review guidance."
145
145
  }
146
146
  ],
147
147
  verification: ["node --test test/litwork.test.mjs", "node --test test/runtime-skills.test.mjs"]
@@ -181,8 +181,14 @@ export const litOpenCodeFeatures = Object.freeze([
181
181
  {
182
182
  id: "durable-ledger",
183
183
  title: "Durable LitGoal Ledger",
184
- summary: "Persists loop events under .litopencode/litgoal with atomic writes and temp-file recovery.",
184
+ summary: "Persists loop events under .litopencode/litgoal with atomic writes and temp-file recovery; litgoal sets and keeps the finish line there, and lit-loop and start-work run toward it.",
185
185
  bindings: [
186
+ {
187
+ kind: "command",
188
+ id: "litgoal",
189
+ surface: "OpenCode command /litgoal",
190
+ description: "Sets the finish line: one objective with checkable criteria kept on durable state for lit-loop and start-work to run toward."
191
+ },
186
192
  {
187
193
  kind: "tool",
188
194
  id: "litwork.status",
@@ -500,6 +506,32 @@ export const litOpenCodeFeatures = Object.freeze([
500
506
  ],
501
507
  verification: ["node --test test/runtime-skills.test.mjs", "node --test test/docs.test.mjs", "node --test test/static-workflow-command.test.mjs"]
502
508
  },
509
+ {
510
+ id: "lit-brainstorm",
511
+ title: "Lit Brainstorm",
512
+ summary: "Opens an unsettled question into many different options, narrows them to a short list with trade-offs, and hands the chosen one to deep-interview or lit-plan without implementing.",
513
+ bindings: [
514
+ {
515
+ kind: "config",
516
+ id: "skills/lit-brainstorm/SKILL.md",
517
+ surface: "LitOpenCode native-installed managed skill",
518
+ description: "Ships the divergent-to-convergent flow with lenses, scoring, session-note and hand-off references."
519
+ },
520
+ {
521
+ kind: "command",
522
+ id: "lit-brainstorm",
523
+ surface: "OpenCode command /lit-brainstorm",
524
+ description: "Makes Lit Brainstorm directly invocable; chat routes lit brainstorm, lit ideation, lit ideate, lit idea and lit ideas reach the same surface."
525
+ },
526
+ {
527
+ kind: "agent",
528
+ id: "optional idea lanes",
529
+ surface: "OpenCode task delegation",
530
+ description: "Optionally fans out up to four read-only lanes at depth one, each generating options through a different lens."
531
+ }
532
+ ],
533
+ verification: ["node --test test/lit-brainstorm.test.mjs", "node --test test/runtime-skills.test.mjs", "node --test test/docs.test.mjs"]
534
+ },
503
535
  {
504
536
  id: "refactor",
505
537
  title: "Refactor",
@@ -1116,15 +1148,15 @@ export const litOpenCodeFeatures = Object.freeze([
1116
1148
  {
1117
1149
  id: "lit-typographic-motion",
1118
1150
  title: "Film director",
1119
- summary: "Native OpenCode film director: treatment first, a captured stage page or the type engine, generated sound, a numeric gate and recorded look rounds.",
1151
+ summary: "Native OpenCode film director: treatment first, a captured stage page or the type engine, generated sound, a numeric gate and recorded look rounds; cover mode renders a silent, seamless README loop and gates the decoded WebP.",
1120
1152
  bindings: [
1121
1153
  { kind: "config", id: "skills/lit-typographic-motion/SKILL.md", surface: "OpenCode native skill picker", description: "Loads the managed motion skill and its engine and reference closure." },
1122
1154
  { kind: "hook", id: "lit-task motion-video intent", surface: "OpenCode chat.message activation", description: "Routes bounded film requests before slide and interface guidance with a neutral film context." },
1123
- { kind: "hook", id: "tool.execute.after", surface: "OpenCode tool.execute.after hook", description: "Records each read of a film's stills so the done check can confirm the frames were viewed." },
1155
+ { kind: "hook", id: "tool.execute.after", surface: "OpenCode tool.execute.after hook", description: "Records each read of a film's or a cover's stills so the done check can confirm the frames were viewed." },
1124
1156
  { kind: "cli", id: "litopencode motion-runtime install|status", surface: "LitOpenCode runtime", description: "Pre-warms pinned dependencies and fonts outside the render session." },
1125
- { kind: "cli", id: "litopencode doctor", surface: "LitOpenCode doctor", description: "Reports Chrome, ffmpeg, WebGL2 tier, software warning, and pre-warm status." }
1157
+ { kind: "cli", id: "litopencode doctor", surface: "LitOpenCode doctor", description: "Reports Chrome, ffmpeg, WebGL2 tier, software warning, pre-warm status and the cover encoder." }
1126
1158
  ],
1127
- verification: ["node --test test/lit-typographic-motion.test.mjs", "npm run check:managed-skill-manifest", "npm run check:pack-payload"]
1159
+ verification: ["node --test test/lit-typographic-motion.test.mjs", "node --test test/motion-cover.test.mjs", "npm run check:managed-skill-manifest", "npm run check:pack-payload"]
1128
1160
  },
1129
1161
  {
1130
1162
  id: "lit-pptx",
@@ -0,0 +1,7 @@
1
+ type ServerEntry = {
2
+ readonly id: string;
3
+ server(input: unknown): Promise<unknown>;
4
+ setup(context: unknown): Promise<() => Promise<void> | void>;
5
+ };
6
+ declare const serverEntry: ServerEntry;
7
+ export default serverEntry;
@@ -0,0 +1,12 @@
1
+ const serverEntry = {
2
+ id: "litopencode",
3
+ async server(input) {
4
+ const { default: plugin } = await import("../server.js");
5
+ return plugin(input);
6
+ },
7
+ async setup(context) {
8
+ const { setupLitOpenCodeServer } = await import("../v2/server.js");
9
+ return setupLitOpenCodeServer(context);
10
+ }
11
+ };
12
+ export default serverEntry;
@@ -0,0 +1,7 @@
1
+ type TuiEntry = {
2
+ readonly id: string;
3
+ tui(api: unknown, options: unknown, meta: unknown): Promise<void>;
4
+ setup(context: unknown): Promise<() => Promise<void> | void>;
5
+ };
6
+ declare const tuiEntry: TuiEntry;
7
+ export default tuiEntry;
@@ -0,0 +1,12 @@
1
+ const tuiEntry = {
2
+ id: "litopencode",
3
+ async tui(...args) {
4
+ const { default: plugin } = await import("../tui.js");
5
+ await plugin.tui(...args);
6
+ },
7
+ async setup(context) {
8
+ const { setupLitOpenCodeTui } = await import("../v2/tui.js");
9
+ return setupLitOpenCodeTui(context);
10
+ }
11
+ };
12
+ export default tuiEntry;
package/dist/server.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { fileURLToPath } from "node:url";
2
2
  import { createChatMessageActivationHook, showActivationToast } from "./activation.js";
3
+ import { createActivationMemory } from "./activation-reentry.js";
3
4
  import { registerLitOpenCodeAgents } from "./agents.js";
4
5
  import { createAutoHandoff } from "./auto-handoff-hooks.js";
5
6
  import { createBoundedAuthorityEventHook } from "./bounded-authority-hooks.js";
@@ -47,6 +48,8 @@ export function createLitOpenCodePlugin(autoUpdateRunner = runPluginAutoUpdate)
47
48
  const logger = createLogger(loaded.paths);
48
49
  const getSession = createSessionLookup(input?.client);
49
50
  const ignitionState = createIgnitionState();
51
+ // The completion mark resets every root turn; which discipline a session runs must outlive the turn.
52
+ const activationMemory = createActivationMemory();
50
53
  const autoHandoff = createAutoHandoff({
51
54
  projectRoot: root,
52
55
  paths: loaded.paths,
@@ -77,6 +80,7 @@ export function createLitOpenCodePlugin(autoUpdateRunner = runPluginAutoUpdate)
77
80
  event: async (eventInput) => {
78
81
  if (eventInput.event.type === "session.deleted") {
79
82
  ignitionState.clear(eventInput.event.properties.info.id);
83
+ activationMemory.forget(eventInput.event.properties.info.id);
80
84
  trustedCommandActivations.delete(eventInput.event.properties.info.id);
81
85
  }
82
86
  await boundedAuthorityEvent(eventInput);
@@ -92,6 +96,10 @@ export function createLitOpenCodePlugin(autoUpdateRunner = runPluginAutoUpdate)
92
96
  ignitionState.resetDiscipline(sessionID);
93
97
  },
94
98
  onSkillActivation: recordSkillActivation,
99
+ activationMemory,
100
+ onSkillContinue: (sessionID, skillId, appendedLit = false) => {
101
+ ignitionState.activate(sessionID, skillId, !appendedLit);
102
+ },
95
103
  trustedInjectedSkill: (sessionID) => {
96
104
  const skillId = trustedCommandActivations.get(sessionID);
97
105
  trustedCommandActivations.delete(sessionID);
@@ -121,6 +129,7 @@ export function createLitOpenCodePlugin(autoUpdateRunner = runPluginAutoUpdate)
121
129
  await autoHandoff.systemTransform(transformInput, transformOutput);
122
130
  },
123
131
  "experimental.session.compacting": async (compactInput, compactOutput) => {
132
+ activationMemory.forget(compactInput.sessionID);
124
133
  await applyCompactionRuleReset(compactInput, compactOutput);
125
134
  },
126
135
  dispose: async () => {
@@ -1,5 +1,5 @@
1
1
  import type { LitOpenCodeRuntimeSkillId } from "./skills.ts";
2
- export type RenamedSkillId = Extract<LitOpenCodeRuntimeSkillId, "lit-crucible" | "lit-init" | "lit-commit" | "lit-burnoff" | "lit-burnoff-file" | "lit-humanizer" | "lit-fetch" | "lit-code">;
2
+ export type RenamedSkillId = Extract<LitOpenCodeRuntimeSkillId, "lit-crucible" | "lit-init" | "lit-commit" | "lit-burnoff" | "lit-burnoff-file" | "lit-humanizer" | "lit-fetch" | "lit-code" | "litgoal">;
3
3
  export declare const renamedSkillAliases: Readonly<Record<RenamedSkillId, readonly string[]>>;
4
4
  export declare const renamedSkillIds: Readonly<Record<RenamedSkillId, string>>;
5
5
  export declare const retiredManagedSkillEntrypointHashes: Readonly<Record<string, string>>;
package/dist/skills.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { LitOpenCodeFeatureId } from "./features.ts";
2
- export type LitOpenCodeRuntimeSkillId = "workflow-loop" | "durable-litgoal" | "agent-roster" | "lit-plan" | "start-work" | "review-work" | "litresearch" | "reference-benchmark-claims" | "native-goal-verdict" | "doctor-installer" | "search-workflow-ideas" | "lit-fetch" | "release-guardrails" | "lit-init" | "lit-crucible" | "refactor" | "lit-burnoff" | "lit-burnoff-file" | "comment-checker" | "lit-code" | "debugging" | "lit-commit" | "lsp" | "lsp-setup" | "rules" | "deep-interview" | "structural-search" | "browser-drive" | "lit-humanizer" | "lit-recap" | "lit-comprehend" | "lit-handoff" | "lit-scientific-visualization" | "lit-diagram-drawer" | "lit-pptx" | "lit-typographic-motion" | "lit-docx" | "readme-studio" | "frontend-ui-ux" | "visual-qa" | "autoresearch" | "autoconference" | "wikify";
2
+ export type LitOpenCodeRuntimeSkillId = "workflow-loop" | "litgoal" | "agent-roster" | "lit-plan" | "start-work" | "review-work" | "litresearch" | "reference-benchmark-claims" | "native-goal-verdict" | "doctor-installer" | "search-workflow-ideas" | "lit-fetch" | "release-guardrails" | "lit-init" | "lit-crucible" | "lit-brainstorm" | "refactor" | "lit-burnoff" | "lit-burnoff-file" | "comment-checker" | "lit-code" | "debugging" | "lit-commit" | "lsp" | "lsp-setup" | "rules" | "deep-interview" | "structural-search" | "browser-drive" | "lit-humanizer" | "lit-recap" | "lit-comprehend" | "lit-handoff" | "lit-scientific-visualization" | "lit-diagram-drawer" | "lit-pptx" | "lit-typographic-motion" | "lit-docx" | "readme-studio" | "frontend-ui-ux" | "visual-qa" | "autoresearch" | "autoconference" | "wikify";
3
3
  export type LitOpenCodeRuntimeSkill = {
4
4
  readonly id: LitOpenCodeRuntimeSkillId;
5
5
  readonly title: string;
@@ -38,7 +38,7 @@ export declare const litOpenCodeRuntimeSkills: readonly ({
38
38
  discovery: string;
39
39
  safety: string[];
40
40
  } | {
41
- id: "durable-litgoal";
41
+ id: "litgoal";
42
42
  title: string;
43
43
  summary: string;
44
44
  featureIds: ("durable-ledger" | "bounded-authority-lifecycle")[];
@@ -135,6 +135,13 @@ export declare const litOpenCodeRuntimeSkills: readonly ({
135
135
  featureIds: "lit-crucible"[];
136
136
  discovery: string;
137
137
  safety: string[];
138
+ } | {
139
+ id: "lit-brainstorm";
140
+ title: string;
141
+ summary: string;
142
+ featureIds: "lit-brainstorm"[];
143
+ discovery: string;
144
+ safety: string[];
138
145
  } | {
139
146
  id: "refactor";
140
147
  title: string;
package/dist/skills.js CHANGED
@@ -12,11 +12,11 @@ export const litOpenCodeRuntimeSkills = Object.freeze([
12
12
  ]
13
13
  },
14
14
  {
15
- id: "durable-litgoal",
16
- title: "Durable LitGoal",
17
- summary: "Use .litopencode/litgoal ledger operations for resumable goal and loop state.",
15
+ id: "litgoal",
16
+ title: "LitGoal",
17
+ summary: "litgoal sets and keeps the finish line on .litopencode/litgoal state; lit-loop and start-work run toward it.",
18
18
  featureIds: ["durable-ledger", "bounded-authority-lifecycle"],
19
- discovery: "Import createLitGoalOperations/createBoundedAuthorityLifecycle or inspect the litwork and /start-work bindings.",
19
+ discovery: "Run /litgoal, type lit goal in chat, import createLitGoalOperations/createBoundedAuthorityLifecycle, or inspect the litwork and /start-work bindings.",
20
20
  safety: [
21
21
  "Append JSON-serializable events only.",
22
22
  "Recover temporary ledger files before reading status.",
@@ -60,12 +60,13 @@ export const litOpenCodeRuntimeSkills = Object.freeze([
60
60
  {
61
61
  id: "review-work",
62
62
  title: "Review Work",
63
- summary: "Use the LitOpenCode review-work surface for draft-plan achievability review or five-lane completed-work review.",
63
+ summary: "Use the LitOpenCode review-work surface for plan review after lit-plan or five-lane work review after lit-loop or start-work, picked from what exists or forced by the user.",
64
64
  featureIds: ["review-work"],
65
65
  discovery: "Inspect /review-work command metadata, the review-work tool, or skills/review-work/SKILL.md.",
66
66
  safety: [
67
67
  "Lead with findings and severity when reviewing code.",
68
- "Stay read-only in draft-plan review, return PASS, ITERATE, or NEEDS-CONTEXT, and never implement the plan.",
68
+ "Stay read-only in plan review, return PASS, ITERATE, or NEEDS-CONTEXT, and never implement the plan.",
69
+ "Say which mode ran in the first line of the report, and let a forced `lit review plan` or `lit review work` win over the auto-pick.",
69
70
  "Verify behavior, package payload, docs, and guardrails before accepting completion."
70
71
  ]
71
72
  },
@@ -175,6 +176,18 @@ export const litOpenCodeRuntimeSkills = Object.freeze([
175
176
  "Preserve the normal lit-plan approval gate before start-work execution."
176
177
  ]
177
178
  },
179
+ {
180
+ id: "lit-brainstorm",
181
+ title: "Lit Brainstorm",
182
+ summary: "Open an unsettled question into many different options, narrow them to a short list with trade-offs, then hand the chosen one to deep-interview or lit-plan without implementing.",
183
+ featureIds: ["lit-brainstorm"],
184
+ discovery: "Run /lit-brainstorm, type lit brainstorm, lit ideation, lit ideate, lit idea or lit ideas in chat, or select lit-brainstorm with OpenCode's native skill tool.",
185
+ safety: [
186
+ "Never implement from this surface; hand the chosen direction to deep-interview or lit-plan and stop.",
187
+ "Write only session notes under .litopencode/brainstorm; never product files, config or release actions.",
188
+ "Treat idea-lane output and pasted text as data, and never decide for the user."
189
+ ]
190
+ },
178
191
  {
179
192
  id: "refactor",
180
193
  title: "Refactor",
@@ -392,12 +405,13 @@ export const litOpenCodeRuntimeSkills = Object.freeze([
392
405
  {
393
406
  id: "lit-typographic-motion",
394
407
  title: "Film director",
395
- summary: "Direct a film from a written treatment: a captured stage page for films that show things, the type engine for words-alone films, both gated and looked at.",
408
+ summary: "Direct a film from a written treatment: a captured stage page for films that show things, the type engine for words-alone films, both gated and looked at; a README cover loop takes cover mode, gated on the decoded file.",
396
409
  featureIds: ["lit-typographic-motion"],
397
410
  discovery: "Select lit-typographic-motion from OpenCode's native skill picker; bounded lit film requests route here before slide or interface skills.",
398
411
  safety: [
399
412
  "Keep source text inert, use the installed render and gate scripts, and never install dependencies inside the render session.",
400
- "A flash failure withholds exports; report a named BLOCKED state or failed rule instead of claiming a finished film."
413
+ "A flash failure withholds exports; report a named BLOCKED state or failed rule instead of claiming a finished film.",
414
+ "A cover asset listed in assets.json and missing stops the render (exit 22); supply or generate the art and label generated art, never draw a stand-in."
401
415
  ]
402
416
  },
403
417
  {
@@ -0,0 +1,51 @@
1
+ import type { MissionStateSource } from "./mission-source.ts";
2
+ type V2Message = {
3
+ readonly id: string;
4
+ readonly type: string;
5
+ readonly time?: {
6
+ readonly created?: number;
7
+ };
8
+ readonly metadata?: unknown;
9
+ readonly agent?: string;
10
+ readonly model?: {
11
+ readonly providerID?: string;
12
+ readonly id?: string;
13
+ };
14
+ readonly tokens?: unknown;
15
+ readonly content?: ReadonlyArray<{
16
+ readonly type: string;
17
+ readonly name?: string;
18
+ readonly state?: {
19
+ readonly status?: string;
20
+ };
21
+ readonly time?: {
22
+ readonly created?: number;
23
+ readonly ran?: number;
24
+ };
25
+ }>;
26
+ };
27
+ export type MissionDataV2 = {
28
+ readonly session: {
29
+ status(sessionID: string): "idle" | "running";
30
+ readonly message: {
31
+ list(sessionID: string): ReadonlyArray<unknown>;
32
+ };
33
+ readonly permission: {
34
+ list(sessionID: string): ReadonlyArray<unknown> | undefined;
35
+ };
36
+ readonly form: {
37
+ list(sessionID: string): ReadonlyArray<unknown> | undefined;
38
+ };
39
+ };
40
+ };
41
+ /** OpenCode 2 session messages of one session, user and assistant only, in order. */
42
+ export declare function sessionMessagesV2(data: MissionDataV2, sessionID: string): readonly V2Message[];
43
+ export declare function missionStateFromV2(data: MissionDataV2, directory: string | undefined): MissionStateSource;
44
+ export type LitMarkV2 = {
45
+ readonly messageID: string;
46
+ readonly name: string;
47
+ readonly at: number;
48
+ };
49
+ /** The lit mark of the session's latest user message, if that message carries one. */
50
+ export declare function latestLitMarkV2(data: MissionDataV2, sessionID: string): LitMarkV2 | undefined;
51
+ export {};
@@ -0,0 +1,52 @@
1
+ function isMessage(value) {
2
+ return typeof value === "object" && value !== null && typeof value.id === "string" && typeof value.type === "string";
3
+ }
4
+ /** OpenCode 2 session messages of one session, user and assistant only, in order. */
5
+ export function sessionMessagesV2(data, sessionID) {
6
+ return (data.session.message.list(sessionID) ?? []).filter(isMessage).filter((message) => message.type === "user" || message.type === "assistant");
7
+ }
8
+ export function missionStateFromV2(data, directory) {
9
+ const index = new Map();
10
+ return {
11
+ path: directory === undefined ? {} : { directory },
12
+ provider: [],
13
+ session: {
14
+ messages(sessionID) {
15
+ return sessionMessagesV2(data, sessionID).map((message) => {
16
+ index.set(message.id, message);
17
+ return {
18
+ id: message.id,
19
+ role: message.type,
20
+ ...(message.agent === undefined ? {} : { agent: message.agent }),
21
+ time: { created: message.time?.created },
22
+ ...(message.model === undefined ? {} : { providerID: message.model.providerID, modelID: message.model.id }),
23
+ ...(message.tokens === undefined ? {} : { tokens: message.tokens })
24
+ };
25
+ });
26
+ },
27
+ todo: () => [],
28
+ status: (sessionID) => ({ type: data.session.status(sessionID) === "running" ? "busy" : "idle" }),
29
+ permission: (sessionID) => data.session.permission.list(sessionID) ?? [],
30
+ question: (sessionID) => data.session.form.list(sessionID) ?? []
31
+ },
32
+ part(messageID) {
33
+ const message = index.get(messageID);
34
+ if (message === undefined)
35
+ return [];
36
+ if (message.type === "user")
37
+ return message.metadata === undefined ? [] : [{ metadata: message.metadata }];
38
+ return (message.content ?? [])
39
+ .filter((item) => item.type === "tool" && typeof item.name === "string")
40
+ .map((item) => ({ type: "tool", tool: item.name, state: { status: item.state?.status, time: { start: item.time?.ran ?? item.time?.created } } }));
41
+ }
42
+ };
43
+ }
44
+ /** The lit mark of the session's latest user message, if that message carries one. */
45
+ export function latestLitMarkV2(data, sessionID) {
46
+ const latest = sessionMessagesV2(data, sessionID).filter((message) => message.type === "user").at(-1);
47
+ const mark = latest === undefined || typeof latest.metadata !== "object" || latest.metadata === null
48
+ ? undefined
49
+ : latest.metadata.litopencode;
50
+ const name = typeof mark?.mode === "string" ? mark.mode : typeof mark?.command === "string" ? mark.command : undefined;
51
+ return latest === undefined || name === undefined || name === "" ? undefined : { messageID: latest.id, name, at: latest.time?.created ?? 0 };
52
+ }
@@ -0,0 +1,105 @@
1
+ import type { LitOpenCodeConfig } from "../config.ts";
2
+ export type PermissionEffect = "allow" | "deny" | "ask";
3
+ export type PermissionRule = {
4
+ action: string;
5
+ resource: string;
6
+ effect: PermissionEffect;
7
+ };
8
+ export type AgentModelRef = {
9
+ providerID: string;
10
+ id: string;
11
+ variant?: string;
12
+ };
13
+ /** The writable slice of an OpenCode 2 agent that LitOpenCode sets. */
14
+ export type EditableAgent = {
15
+ system?: string;
16
+ description?: string;
17
+ mode: "subagent" | "primary" | "all";
18
+ hidden: boolean;
19
+ color?: string;
20
+ steps?: number;
21
+ model?: AgentModelRef;
22
+ permissions: PermissionRule[];
23
+ };
24
+ export type AgentEditorLike = {
25
+ default(id: string | undefined): void;
26
+ update(id: string, update: (agent: any) => void): void;
27
+ };
28
+ export type ModelEditorLike = {
29
+ get(providerID: string, modelID: string): unknown;
30
+ update(providerID: string, modelID: string, update: (model: any) => void): void;
31
+ };
32
+ /** Request settings OpenCode 2 keeps on an agent but does not send yet; the context hook sends them. */
33
+ export type AgentRequestOptions = Readonly<Record<string, unknown>>;
34
+ export type LitAgentPlan = {
35
+ readonly agents: ReadonlyMap<string, EditableAgent>;
36
+ readonly requestOptions: ReadonlyMap<string, AgentRequestOptions>;
37
+ readonly hostAgents: readonly string[];
38
+ };
39
+ /**
40
+ * Agents that only plan: the host rules deny them edits, the shell, subagents and Code Mode, and the
41
+ * evaluate hook enforces it again. Code Mode (`execute`) runs model-written JavaScript with `fetch` and
42
+ * the catalog tools, which OpenCode 1 never offered; a tool whose last matching rule denies "*" is left
43
+ * out of the request entirely.
44
+ */
45
+ export declare const planningOnlyAgents: ReadonlySet<string>;
46
+ /** OpenCode 2 renamed these tools; a migrated rule must use the new name to keep matching. */
47
+ export declare function normalizeAction(action: string): string;
48
+ /**
49
+ * Turns an OpenCode 1 permission map into ordered rules, the way OpenCode 2 migrates config files:
50
+ * tool switches first (true allows, false denies), then permission keys, a later key replacing an
51
+ * earlier one in place, and a pattern map becoming one rule per pattern in its written order.
52
+ */
53
+ export declare function permissionRules(tools: Readonly<Record<string, boolean>> | undefined, permission: unknown): PermissionRule[];
54
+ /** Builds every agent edit from the LitOpenCode config, without touching the host. */
55
+ export declare function planLitAgents(config: LitOpenCodeConfig): LitAgentPlan;
56
+ /** Applies a plan inside ctx.agent.transform: creates or updates each agent, hides the host agents, sets the default. */
57
+ export declare function applyLitAgents(editor: AgentEditorLike, plan: LitAgentPlan): void;
58
+ /**
59
+ * The OpenAI rows LitOpenCode routes to, added to the host catalog when it lacks one, as the OpenCode 1
60
+ * `config` hook does. A row the host already has is left as the host made it, and the editor cannot
61
+ * create a provider the user has not set up. Each effort becomes a variant shaped like the host's own
62
+ * OpenAI rows, so a route such as `#xhigh` resolves.
63
+ */
64
+ export declare function registerOpenAiProviderModels(editor: ModelEditorLike): void;
65
+ export type SessionModelInfoLike = {
66
+ readonly parentID?: string;
67
+ readonly agent?: string;
68
+ readonly model?: unknown;
69
+ };
70
+ export type SessionModelDomainLike = {
71
+ readonly get: (input: {
72
+ readonly sessionID: string;
73
+ }) => Promise<SessionModelInfoLike>;
74
+ readonly switchModel: (input: {
75
+ readonly sessionID: string;
76
+ readonly model: AgentModelRef;
77
+ }) => Promise<unknown>;
78
+ };
79
+ type CatalogModelLike = {
80
+ readonly providerID: string;
81
+ readonly id: string;
82
+ readonly enabled?: boolean;
83
+ };
84
+ export type ModelListLike = {
85
+ readonly list: () => Promise<readonly CatalogModelLike[] | {
86
+ readonly data: readonly CatalogModelLike[];
87
+ }>;
88
+ };
89
+ /**
90
+ * OpenCode 2 runs a session that has no model of its own on the host default model: the agent's model
91
+ * is only read by a client that creates the session (the TUI does, `opencode2 run` does not). This sets
92
+ * such a root session to its agent's route, lit-loop when it names none, once the route is in the
93
+ * catalog. A session with a model, a delegated child (the host gives it its agent's model) and an agent
94
+ * LitOpenCode does not own keep the host's choice.
95
+ */
96
+ export declare function createSessionModelRoute(plan: LitAgentPlan, session: SessionModelDomainLike, models: ModelListLike): (sessionID: string) => Promise<void>;
97
+ export type PermissionEvaluationLike = {
98
+ readonly agent?: string;
99
+ readonly action: string;
100
+ effect: PermissionEffect;
101
+ message?: string;
102
+ };
103
+ /** The second lock for planning-only agents: whatever the rules say, edits, the shell, subagents and Code Mode are denied. */
104
+ export declare function enforcePlanningOnly(evaluation: PermissionEvaluationLike): void;
105
+ export {};