pstack-dsh 0.2.3

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 (172) hide show
  1. package/HARNESS.md +109 -0
  2. package/LICENSE +25 -0
  3. package/README.md +168 -0
  4. package/TEST-PLAN.md +70 -0
  5. package/agents/comment-sicko.md +32 -0
  6. package/agents/poteto-agent.md +9 -0
  7. package/cordis.patch.yml +4 -0
  8. package/cordis.yml +4 -0
  9. package/docs/guide/01-setup.md +41 -0
  10. package/docs/guide/02-poteto-mode.md +98 -0
  11. package/docs/guide/03-understand.md +53 -0
  12. package/docs/guide/04-design.md +81 -0
  13. package/docs/guide/05-build-and-clean.md +75 -0
  14. package/docs/guide/06-verify-and-ship.md +87 -0
  15. package/docs/guide/07-overnight.md +81 -0
  16. package/docs/guide/08-principles.md +71 -0
  17. package/docs/guide/09-make-it-yours.md +67 -0
  18. package/docs/guide/10-recipes-and-pitfalls.md +96 -0
  19. package/docs/guide/README.md +30 -0
  20. package/dshx.yml +9 -0
  21. package/lib/client.js +981 -0
  22. package/lib/client.js.map +1 -0
  23. package/lib/index.d.ts +34 -0
  24. package/lib/index.js +1120 -0
  25. package/package.json +140 -0
  26. package/skills/architect/SKILL.md +83 -0
  27. package/skills/architect/references/design-red-flags.md +33 -0
  28. package/skills/architect/references/rationale-template.md +35 -0
  29. package/skills/architect/references/runner-prompt.md +20 -0
  30. package/skills/arena/SKILL.md +73 -0
  31. package/skills/automate-me/SKILL.md +103 -0
  32. package/skills/blast-radius/SKILL.md +50 -0
  33. package/skills/bro/SKILL.md +7 -0
  34. package/skills/create-verification-skill/SKILL.md +44 -0
  35. package/skills/create-verification-skill/references/feature-map-example/README.md +47 -0
  36. package/skills/create-verification-skill/references/feature-map-example/create-note.md +39 -0
  37. package/skills/create-verification-skill/references/feature-map-example/search.md +45 -0
  38. package/skills/figure-it-out/SKILL.md +53 -0
  39. package/skills/how/SKILL.md +45 -0
  40. package/skills/how/references/explainer-prompt.md +55 -0
  41. package/skills/how/references/explorer-prompt.md +52 -0
  42. package/skills/interrogate/SKILL.md +99 -0
  43. package/skills/interrogate/references/code-quality-review.md +47 -0
  44. package/skills/interrogate/references/lead-judgment.md +58 -0
  45. package/skills/interrogate/references/reviewer-prompt.md +72 -0
  46. package/skills/interrogate/references/rubric.md +77 -0
  47. package/skills/maintain-verification-skill/SKILL.md +39 -0
  48. package/skills/no-comments/SKILL.md +24 -0
  49. package/skills/poteto-mode/SKILL.md +149 -0
  50. package/skills/poteto-mode/playbooks/authoring-a-skill.md +12 -0
  51. package/skills/poteto-mode/playbooks/autonomous-run.md +13 -0
  52. package/skills/poteto-mode/playbooks/autopilot-full.md +13 -0
  53. package/skills/poteto-mode/playbooks/autopilot-stack.md +16 -0
  54. package/skills/poteto-mode/playbooks/babysit.md +27 -0
  55. package/skills/poteto-mode/playbooks/bug-fix.md +17 -0
  56. package/skills/poteto-mode/playbooks/eval.md +25 -0
  57. package/skills/poteto-mode/playbooks/feature.md +21 -0
  58. package/skills/poteto-mode/playbooks/hillclimb.md +21 -0
  59. package/skills/poteto-mode/playbooks/investigation.md +14 -0
  60. package/skills/poteto-mode/playbooks/multi-phase-plan.md +156 -0
  61. package/skills/poteto-mode/playbooks/opening-a-pr.md +33 -0
  62. package/skills/poteto-mode/playbooks/orchestrate.md +113 -0
  63. package/skills/poteto-mode/playbooks/pause-safely.md +10 -0
  64. package/skills/poteto-mode/playbooks/perf-issue.md +24 -0
  65. package/skills/poteto-mode/playbooks/prototype.md +14 -0
  66. package/skills/poteto-mode/playbooks/refactoring.md +16 -0
  67. package/skills/poteto-mode/playbooks/runtime-forensics.md +11 -0
  68. package/skills/poteto-mode/playbooks/session-pickup.md +11 -0
  69. package/skills/poteto-mode/playbooks/shipping.md +17 -0
  70. package/skills/poteto-mode/playbooks/trace-forensics.md +14 -0
  71. package/skills/poteto-mode/playbooks/visual-parity.md +11 -0
  72. package/skills/poteto-mode/playbooks/worktree-cleanup.md +14 -0
  73. package/skills/poteto-mode/references/bugbot-triage.md +142 -0
  74. package/skills/poteto-mode/scripts/bootstrap.ts +62 -0
  75. package/skills/poteto-mode/scripts/bun.lock +67 -0
  76. package/skills/poteto-mode/scripts/check-plan.mjs +186 -0
  77. package/skills/poteto-mode/scripts/orch/orch.test.ts +634 -0
  78. package/skills/poteto-mode/scripts/orch/orch.ts +578 -0
  79. package/skills/poteto-mode/scripts/orch/store.ts +1607 -0
  80. package/skills/poteto-mode/scripts/package.json +16 -0
  81. package/skills/poteto-mode/scripts/watch-pr/cli.test.ts +224 -0
  82. package/skills/poteto-mode/scripts/watch-pr/cli.ts +223 -0
  83. package/skills/poteto-mode/scripts/watch-pr/fakes.test-helper.ts +118 -0
  84. package/skills/poteto-mode/scripts/watch-pr/github.test.ts +306 -0
  85. package/skills/poteto-mode/scripts/watch-pr/github.ts +699 -0
  86. package/skills/poteto-mode/scripts/watch-pr/policy.test.ts +420 -0
  87. package/skills/poteto-mode/scripts/watch-pr/policy.ts +832 -0
  88. package/skills/poteto-mode/scripts/watch-pr/render.ts +169 -0
  89. package/skills/poteto-mode/scripts/watch-pr/tsconfig.json +13 -0
  90. package/skills/poteto-mode/scripts/watch-pr/types.compile.ts +93 -0
  91. package/skills/poteto-mode/scripts/watch-pr/types.ts +401 -0
  92. package/skills/poteto-mode/scripts/watch-pr/watch-pr +6 -0
  93. package/skills/poteto-mode/scripts/worktree-audit.sh +86 -0
  94. package/skills/principle-attack-the-premise/SKILL.md +22 -0
  95. package/skills/principle-boundary-discipline/SKILL.md +33 -0
  96. package/skills/principle-build-the-lever/SKILL.md +22 -0
  97. package/skills/principle-encode-lessons-in-structure/SKILL.md +30 -0
  98. package/skills/principle-exhaust-the-design-space/SKILL.md +20 -0
  99. package/skills/principle-experience-first/SKILL.md +18 -0
  100. package/skills/principle-fix-root-causes/SKILL.md +22 -0
  101. package/skills/principle-foundational-thinking/SKILL.md +20 -0
  102. package/skills/principle-guard-the-context-window/SKILL.md +16 -0
  103. package/skills/principle-laziness-protocol/SKILL.md +17 -0
  104. package/skills/principle-make-operations-idempotent/SKILL.md +23 -0
  105. package/skills/principle-migrate-callers-then-delete-legacy-apis/SKILL.md +21 -0
  106. package/skills/principle-minimize-reader-load/SKILL.md +22 -0
  107. package/skills/principle-model-the-domain/SKILL.md +25 -0
  108. package/skills/principle-never-block-on-the-human/SKILL.md +21 -0
  109. package/skills/principle-outcome-oriented-execution/SKILL.md +21 -0
  110. package/skills/principle-prove-it-works/SKILL.md +32 -0
  111. package/skills/principle-redesign-from-first-principles/SKILL.md +15 -0
  112. package/skills/principle-separate-before-serializing-shared-state/SKILL.md +15 -0
  113. package/skills/principle-sequence-verifiable-units/SKILL.md +21 -0
  114. package/skills/principle-subtract-before-you-add/SKILL.md +20 -0
  115. package/skills/principle-test-behavior-not-implementation/SKILL.md +24 -0
  116. package/skills/principle-type-system-discipline/SKILL.md +30 -0
  117. package/skills/recall/SKILL.md +35 -0
  118. package/skills/reflect/SKILL.md +65 -0
  119. package/skills/reflect/references/divergent-reviewer.md +43 -0
  120. package/skills/reflect/references/judgment-reviewer.md +42 -0
  121. package/skills/reflect/references/synthesizer.md +56 -0
  122. package/skills/reflect/references/tooling-reviewer.md +55 -0
  123. package/skills/setup-pstack/SKILL.md +32 -0
  124. package/skills/setup-pstack/references/catalog.md +28 -0
  125. package/skills/setup-pstack/references/spawn.md +61 -0
  126. package/skills/show-me-your-work/SKILL.md +82 -0
  127. package/skills/show-me-your-work/references/decision-log-template.tsv +1 -0
  128. package/skills/show-me-your-work/scripts/log.sh +40 -0
  129. package/skills/swarm/SKILL.md +44 -0
  130. package/skills/tdd/SKILL.md +44 -0
  131. package/skills/teach/SKILL.md +21 -0
  132. package/skills/technical-writing/SKILL.md +127 -0
  133. package/skills/typescript-best-practices/SKILL.md +30 -0
  134. package/skills/typescript-best-practices/references/patterns.md +313 -0
  135. package/skills/unslop/SKILL.md +67 -0
  136. package/skills/why/SKILL.md +146 -0
  137. package/skills/why/references/epistemics.md +144 -0
  138. package/skills/why/references/investigator-prompt.md +103 -0
  139. package/skills/why/references/source-playbook.md +17 -0
  140. package/skills/why/references/sources/code-archaeology.md +88 -0
  141. package/skills/why/references/sources/databricks.md +70 -0
  142. package/skills/why/references/sources/datadog.md +99 -0
  143. package/skills/why/references/sources/incident-postmortem.md +15 -0
  144. package/skills/why/references/sources/linear.md +48 -0
  145. package/skills/why/references/sources/notion.md +55 -0
  146. package/skills/why/references/sources/sentry.md +100 -0
  147. package/skills/why/references/sources/slack.md +54 -0
  148. package/skills/why/references/synthesizer-prompt.md +135 -0
  149. package/src/catalog-types.ts +54 -0
  150. package/src/catalog.ts +308 -0
  151. package/src/client/PstackSettings.tsx +519 -0
  152. package/src/client/api.ts +56 -0
  153. package/src/client/index.tsx +38 -0
  154. package/src/client/locales.ts +65 -0
  155. package/src/client/poteto-defaults.ts +37 -0
  156. package/src/frontmatter.ts +73 -0
  157. package/src/home.ts +13 -0
  158. package/src/http-trust.ts +38 -0
  159. package/src/ids.ts +39 -0
  160. package/src/index.ts +85 -0
  161. package/src/overlay-model.ts +139 -0
  162. package/src/overlay.ts +40 -0
  163. package/src/persona.ts +38 -0
  164. package/src/plugin-config.ts +29 -0
  165. package/src/request-overlay.ts +40 -0
  166. package/src/roles.ts +55 -0
  167. package/src/settings-api.ts +48 -0
  168. package/src/settings-draft.ts +144 -0
  169. package/src/settings-routes.ts +77 -0
  170. package/src/skills-provider.ts +96 -0
  171. package/src/spawn.ts +52 -0
  172. package/src/tools.ts +226 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","names":["useState","useRef","useCallback","useMemo","Button"],"sources":["../src/roles.ts","../src/overlay-model.ts","../src/settings-draft.ts","../src/ids.ts","../src/client/api.ts","../src/client/poteto-defaults.ts","../src/client/PstackSettings.tsx","../src/client/locales.ts","../src/client/index.tsx"],"sourcesContent":["/**\n * pstack role keys used by playbooks and Settings → pstack.\n * These are pstack names, not Cursor slugs and not grok-build `subagent_type` values.\n */\n\nexport const SCALAR_ROLES = [\n 'feature',\n 'refactoring',\n 'bug-fix',\n 'perf-issue',\n 'hillclimb',\n 'judgment-and-prose',\n 'hardest-tasks',\n 'how-explorer',\n 'how-explainer',\n 'why-investigators',\n 'why-synthesizer',\n 'reflect-tooling',\n 'reflect-judgment',\n 'swarm-workers',\n 'independent-verifier',\n 'poteto-agent',\n 'comment-sicko',\n] as const\n\nexport const PANEL_ROLES = [\n 'how-critics',\n 'arena-runners',\n 'arena-cross-judge-pool',\n 'architect-runners',\n 'interrogate-reviewers',\n] as const\n\nexport const ALL_ROLES = [...SCALAR_ROLES, ...PANEL_ROLES] as const\n\nexport type ScalarRole = (typeof SCALAR_ROLES)[number]\nexport type PanelRole = (typeof PANEL_ROLES)[number]\nexport type PstackRole = (typeof ALL_ROLES)[number]\n\nexport function isPstackRole(value: string): value is PstackRole {\n return (ALL_ROLES as readonly string[]).includes(value)\n}\n\nexport function isPanelRole(value: string): value is PanelRole {\n return (PANEL_ROLES as readonly string[]).includes(value)\n}\n\n/** Alias accepted from Cursor-era skills. */\nexport function normalizeRole(raw: string): string {\n const trimmed = raw.trim()\n if (trimmed === 'Comment Sicko' || trimmed === 'comment sicko') return 'comment-sicko'\n if (trimmed === 'poteto-agent' || trimmed === 'Poteto Agent') return 'poteto-agent'\n if (trimmed === 'generalPurpose' || trimmed === 'general-purpose') return 'poteto-agent'\n return trimmed\n}\n","import { ALL_ROLES, isPanelRole, isPstackRole, type PstackRole } from './roles.ts'\nimport type { LiveRoute } from './catalog-types.ts'\n\nexport const OVERLAY_VERSION = 1 as const\n\nexport interface OverlayRoute {\n readonly provider: string\n readonly model: string\n /** Adapter-owned effort id for this exact route. Omit when the route has no effort field. */\n readonly reasoningEffort?: string\n}\n\nexport interface OverlayRole {\n /** Child inherits the parent conversation route and effort. */\n readonly inherit: boolean\n /** One spawn per entry. Empty when inherit is true. */\n readonly routes: OverlayRoute[]\n}\n\nexport interface Overlay {\n readonly version: typeof OVERLAY_VERSION\n readonly roles: Record<string, OverlayRole>\n}\n\nexport function emptyOverlay(): Overlay {\n const roles: Record<string, OverlayRole> = {}\n for (const role of ALL_ROLES) {\n roles[role] = { inherit: true, routes: [] }\n }\n return { version: OVERLAY_VERSION, roles }\n}\n\nexport function routeKey(provider: string, model: string): string {\n return `${provider}::${model}`\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction parseRoute(raw: unknown, path: string): OverlayRoute {\n if (!isRecord(raw)) throw new Error(`${path} must be an object`)\n const provider = raw.provider\n const model = raw.model\n if (typeof provider !== 'string' || provider.length === 0) {\n throw new Error(`${path}.provider must be a non-empty string`)\n }\n if (typeof model !== 'string' || model.length === 0) {\n throw new Error(`${path}.model must be a non-empty string`)\n }\n const effort = raw.reasoningEffort\n if (effort !== undefined && (typeof effort !== 'string' || effort.length === 0)) {\n throw new Error(`${path}.reasoningEffort must be a non-empty string when set`)\n }\n const extra = Object.keys(raw).filter(key => key !== 'provider' && key !== 'model' && key !== 'reasoningEffort')\n if (extra.length > 0) throw new Error(`${path} has unknown fields: ${extra.join(', ')}`)\n return effort === undefined\n ? { provider, model }\n : { provider, model, reasoningEffort: effort }\n}\n\nfunction parseRole(raw: unknown, role: string): OverlayRole {\n if (!isRecord(raw)) throw new Error(`roles.${role} must be an object`)\n const extra = Object.keys(raw).filter(key => key !== 'inherit' && key !== 'routes')\n if (extra.length > 0) throw new Error(`roles.${role} has unknown fields: ${extra.join(', ')}`)\n const inherit = raw.inherit === true\n || raw.inherit === 'true'\n || raw.inherit === 'inherit-parent'\n || raw.inherit === 'auto'\n const routesRaw = raw.routes\n const routes = Array.isArray(routesRaw)\n ? routesRaw.map((entry, index) => parseRoute(entry, `roles.${role}.routes[${index}]`))\n : []\n if (inherit) return { inherit: true, routes: [] }\n if (routes.length === 0) return { inherit: true, routes: [] }\n if (!isPanelRole(role) && routes.length !== 1) {\n throw new Error(`roles.${role} is a scalar role and may have at most one route`)\n }\n return { inherit: false, routes }\n}\n\nexport function parseOverlay(text: string): Overlay {\n let value: unknown\n try {\n value = JSON.parse(text) as unknown\n } catch {\n throw new Error('pstack-dsh overlay is not valid JSON')\n }\n if (!isRecord(value)) throw new Error('pstack-dsh overlay must be an object')\n if (value.version !== OVERLAY_VERSION) {\n throw new Error(`pstack-dsh overlay version ${String(value.version)} is unsupported`)\n }\n const extra = Object.keys(value).filter(key => key !== 'version' && key !== 'roles')\n if (extra.length > 0) throw new Error(`pstack-dsh overlay has unknown fields: ${extra.join(', ')}`)\n const rolesRaw = value.roles\n if (!isRecord(rolesRaw)) throw new Error('pstack-dsh overlay.roles must be an object')\n const roles: Record<string, OverlayRole> = {}\n for (const role of ALL_ROLES) {\n const entry = rolesRaw[role]\n roles[role] = entry === undefined ? { inherit: true, routes: [] } : parseRole(entry, role)\n }\n for (const key of Object.keys(rolesRaw)) {\n if (!isPstackRole(key)) throw new Error(`unknown pstack role \"${key}\"`)\n }\n return { version: OVERLAY_VERSION, roles }\n}\n\nexport function validateOverlayAgainstCatalog(overlay: Overlay, routes: readonly LiveRoute[]): string[] {\n const errors: string[] = []\n const live = new Map(routes.filter(route => route.selectable).map(route => [routeKey(route.provider, route.model), route]))\n for (const role of ALL_ROLES) {\n if (role === 'how-critics') continue\n const assignment = overlay.roles[role] ?? { inherit: true, routes: [] }\n if (assignment.inherit) continue\n for (const [index, entry] of assignment.routes.entries()) {\n const found = live.get(routeKey(entry.provider, entry.model))\n if (found === undefined) {\n errors.push(`${role}[${index}]: ${entry.provider}/${entry.model} is not a logged-in live route`)\n continue\n }\n if (entry.reasoningEffort === undefined) continue\n if (found.efforts.length === 0) {\n errors.push(`${role}[${index}]: ${entry.provider}/${entry.model} has no effort field; omit reasoningEffort`)\n continue\n }\n if (!found.efforts.some(effort => effort.id === entry.reasoningEffort)) {\n errors.push(\n `${role}[${index}]: effort \"${entry.reasoningEffort}\" is not accepted by ${entry.provider}/${entry.model} (live: ${found.efforts.map(effort => effort.id).join(', ')})`,\n )\n }\n }\n }\n return errors\n}\n\nexport function resolveRole(overlay: Overlay, role: string): OverlayRole {\n const key = role as PstackRole\n return overlay.roles[key] ?? { inherit: true, routes: [] }\n}\n","import { ALL_ROLES, isPanelRole, type PstackRole } from './roles.ts'\nimport type { LiveRoute } from './catalog-types.ts'\nimport {\n emptyOverlay,\n routeKey,\n type Overlay,\n type OverlayRoute,\n} from './overlay-model.ts'\n\nexport type InheritChoice = 'inherit-parent' | 'auto'\n\nexport interface RoleDraft {\n readonly role: PstackRole\n readonly panel: boolean\n inherit: boolean\n inheritChoice: InheritChoice\n routes: OverlayRoute[]\n}\n\nexport function selectableRoutes(routes: readonly LiveRoute[]): LiveRoute[] {\n return routes.filter(route => route.selectable)\n}\n\nexport function overlayToDraft(overlay: Overlay): RoleDraft[] {\n return ALL_ROLES.map(role => {\n const assignment = overlay.roles[role] ?? { inherit: true, routes: [] }\n const inherit = assignment.inherit || assignment.routes.length === 0\n return {\n role,\n panel: isPanelRole(role),\n inherit,\n inheritChoice: 'inherit-parent' as InheritChoice,\n routes: inherit ? [] : assignment.routes.map(route => ({ ...route })),\n }\n })\n}\n\nexport function draftToOverlay(drafts: readonly RoleDraft[]): Overlay {\n const overlay = emptyOverlay()\n for (const draft of drafts) {\n if (draft.inherit || draft.routes.length === 0) {\n overlay.roles[draft.role] = { inherit: true, routes: [] }\n continue\n }\n overlay.roles[draft.role] = {\n inherit: false,\n routes: draft.panel ? draft.routes.map(route => ({ ...route })) : [draft.routes[0]!],\n }\n }\n return overlay\n}\n\nexport function liveFor(routes: readonly LiveRoute[], provider: string, model: string): LiveRoute | undefined {\n return routes.find(route => route.selectable && route.provider === provider && route.model === model)\n}\n\nexport function stripIllegalEffort(route: OverlayRoute, live: readonly LiveRoute[]): OverlayRoute {\n const found = liveFor(live, route.provider, route.model)\n if (found === undefined) return { provider: route.provider, model: route.model }\n if (route.reasoningEffort === undefined) return { provider: route.provider, model: route.model }\n if (found.efforts.length === 0) return { provider: route.provider, model: route.model }\n if (!found.efforts.some(effort => effort.id === route.reasoningEffort)) {\n return { provider: route.provider, model: route.model }\n }\n return { provider: route.provider, model: route.model, reasoningEffort: route.reasoningEffort }\n}\n\n/** Stale overlay entries become inherit in the returned overlay; original file is not written. */\nexport function dropUnselectableRoles(overlay: Overlay, live: readonly LiveRoute[]): {\n overlay: Overlay\n droppedRoles: string[]\n} {\n const next = emptyOverlay()\n const droppedRoles: string[] = []\n const selectable = new Set(live.filter(route => route.selectable).map(route => routeKey(route.provider, route.model)))\n for (const role of ALL_ROLES) {\n const assignment = overlay.roles[role] ?? { inherit: true, routes: [] }\n if (role === 'how-critics') {\n next.roles[role] = { inherit: assignment.inherit, routes: assignment.routes.map(route => ({ ...route })) }\n continue\n }\n if (assignment.inherit || assignment.routes.length === 0) {\n next.roles[role] = { inherit: true, routes: [] }\n continue\n }\n const kept = assignment.routes\n .filter(route => selectable.has(routeKey(route.provider, route.model)))\n .map(route => stripIllegalEffort(route, live))\n if (kept.length === 0) {\n droppedRoles.push(role)\n next.roles[role] = { inherit: true, routes: [] }\n continue\n }\n if (kept.length !== assignment.routes.length) droppedRoles.push(role)\n next.roles[role] = {\n inherit: false,\n routes: isPanelRole(role) ? kept : [kept[0]!],\n }\n }\n return { overlay: next, droppedRoles }\n}\n\nexport function applyInheritAll(drafts: RoleDraft[], choice: InheritChoice = 'inherit-parent'): RoleDraft[] {\n return drafts.map(draft => draft.role === 'how-critics' ? draft : ({\n ...draft,\n inherit: true,\n inheritChoice: choice,\n routes: [],\n }))\n}\n\nexport function applyRouteToAll(drafts: RoleDraft[], route: OverlayRoute, live: readonly LiveRoute[]): RoleDraft[] {\n const cleaned = stripIllegalEffort(route, live)\n if (liveFor(live, cleaned.provider, cleaned.model) === undefined) return drafts\n return drafts.map(draft => draft.role === 'how-critics' ? draft : ({\n ...draft,\n inherit: false,\n inheritChoice: 'inherit-parent',\n routes: draft.panel ? [{ ...cleaned }] : [{ ...cleaned }],\n }))\n}\n\nexport function routeSelectValue(draft: RoleDraft, index = 0): string {\n if (draft.inherit || draft.routes.length === 0) return draft.inheritChoice\n const route = draft.routes[index]\n if (route === undefined) return draft.inheritChoice\n return routeKey(route.provider, route.model)\n}\n\nexport function parseRouteSelectValue(\n value: string,\n live: readonly LiveRoute[],\n): { inherit: true; inheritChoice: InheritChoice } | { inherit: false; route: OverlayRoute } {\n if (value === 'inherit-parent' || value === 'auto') {\n return { inherit: true, inheritChoice: value }\n }\n const separator = value.indexOf('::')\n if (separator <= 0) return { inherit: true, inheritChoice: 'inherit-parent' }\n const provider = value.slice(0, separator)\n const model = value.slice(separator + 2)\n const found = liveFor(live, provider, model)\n if (found === undefined) return { inherit: true, inheritChoice: 'inherit-parent' }\n return { inherit: false, route: { provider: found.provider, model: found.model } }\n}\n","/** Startup line `dshx verify-boot` looks for. */\nexport const BOOT_MARKER = '[my-plugins/pstack-dsh] loaded'\n\n/** Cordis plugin / Loader row id. */\nexport const PLUGIN_ID = 'pstack-dsh'\n\n/** Bundled skill provider name on `ctx.skills`. */\nexport const SKILL_PROVIDER_NAME = 'pstack-dsh'\n\n/** Overlay file under `$DSH_HOME`. */\nexport const OVERLAY_FILENAME = 'pstack-dsh.json'\n\n/** DSH-owned OAuth store from dsh-oauth-login. Never ~/.pi / ~/.codex / ~/.claude / grok CLI. */\nexport const OAUTH_AUTH_FILENAME = '.dsh-oauth-auth.json'\nexport const OAUTH_AUTH_LEGACY_FILENAME = '.pi-login-auth.json'\n\n/** Antigravity OAuth store from dsh-antigravity-oauth. */\nexport const ANTIGRAVITY_AUTH_FILENAME = '.dsh-antigravity-oauth.json'\nexport const ANTIGRAVITY_PROVIDER = 'agy-google-antigravity'\n\n/** Official DeepSeek adapter. `packages/llm/llm-deepseek/src/index.ts` `PROVIDER`, `DEFAULT_API_KEY_ENV`. */\nexport const DEEPSEEK_API_KEY_ENV = 'DEEPSEEK_API_KEY'\nexport const DEEPSEEK_PROVIDER = 'deepseek-official'\n\n/** Model-facing tool names this plugin registers. */\nexport const TOOL_CATALOG = 'pstack_catalog'\nexport const TOOL_SPAWN = 'pstack_spawn'\nexport const TOOL_OVERLAY_READ = 'pstack_overlay_read'\nexport const TOOL_OVERLAY_WRITE = 'pstack_overlay_write'\n\n/** Default in-process spawn provider. `packages/bundle/base/cordis.patch.yml` `providerName: spawn`. */\nexport const SPAWN_PROVIDER = 'spawn'\n\n/** Settings nav id. Official slot `settings.section` (`packages/client/ui-settings/src/client/contract/slots.ts`). */\nexport const SETTINGS_SECTION_ID = 'pstack'\n\n/** Same-origin Web routes. Pattern: dsh-oauth-login `src/auth-routes.ts`. */\nexport const SETTINGS_SNAPSHOT_PATH = '/plugins/pstack-dsh/settings'\nexport const SETTINGS_SAVE_PATH = '/plugins/pstack-dsh/settings'\n","import type { CatalogResult } from '../catalog-types.ts'\nimport type { Overlay } from '../overlay-model.ts'\nimport { SETTINGS_SAVE_PATH, SETTINGS_SNAPSHOT_PATH } from '../ids.ts'\n\nexport interface SettingsSnapshot {\n catalog: CatalogResult\n overlay: Overlay\n path: string\n missing: boolean\n droppedRoles: string[]\n}\n\ntype CatalogEvent = 'llm/adapters-updated' | 'settings/document-updated' | 'credentials/reference-updated'\n\nexport interface CatalogEventContext {\n remote: { $on(event: CatalogEvent, listener: () => void): () => void }\n on(event: 'connection/reset', listener: () => void): () => void\n}\n\n/** Use the same Host notifications as DSH's model directory, scoped to the open settings page. */\nexport function listenForCatalogChanges(ctx: CatalogEventContext, listener: () => void): () => void {\n const disposers = [\n ctx.remote.$on('llm/adapters-updated', listener),\n ctx.remote.$on('settings/document-updated', listener),\n ctx.remote.$on('credentials/reference-updated', listener),\n ctx.on('connection/reset', listener),\n ]\n return () => { for (const dispose of disposers) dispose() }\n}\n\nasync function jsonRequest<T>(path: string, method: string, body?: unknown, signal?: AbortSignal): Promise<T> {\n const response = await fetch(path, {\n method,\n headers: { accept: 'application/json', ...body === undefined ? {} : { 'content-type': 'application/json' } },\n credentials: 'same-origin',\n cache: 'no-store',\n signal,\n ...body === undefined ? {} : { body: JSON.stringify(body) },\n })\n const value: unknown = await response.json().catch(() => undefined)\n if (!response.ok) {\n const message = typeof value === 'object' && value !== null && 'error' in value && typeof (value as { error: unknown }).error === 'string'\n ? (value as { error: string }).error\n : `HTTP ${response.status}`\n throw new Error(message)\n }\n return value as T\n}\n\nexport function loadSettingsSnapshot(signal?: AbortSignal): Promise<SettingsSnapshot> {\n return jsonRequest<SettingsSnapshot>(SETTINGS_SNAPSHOT_PATH, 'GET', undefined, signal)\n}\n\nexport function saveSettingsOverlay(overlay: Overlay): Promise<{ path: string; overlay: Overlay }> {\n return jsonRequest<{ path: string; overlay: Overlay }>(SETTINGS_SAVE_PATH, 'PUT', { overlay })\n}\n","import type { PstackRole } from '../roles.ts'\n\n// Upstream 0.15 recommendations are display copy, never runtime route defaults.\nconst GROK = 'grok-4.6-fast-xhigh'\nconst SOL = 'gpt-5.6-sol-max'\nconst FABLE = 'claude-fable-5-1-thinking-max'\nconst PANEL = `${FABLE}, ${SOL}, ${GROK}, claude-opus-5-thinking-xhigh`\n\nexport const POTETO_DEFAULT_SLUGS = {\n feature: GROK,\n refactoring: GROK,\n 'bug-fix': FABLE,\n 'perf-issue': FABLE,\n hillclimb: FABLE,\n 'judgment-and-prose': FABLE,\n 'hardest-tasks': FABLE,\n 'how-explorer': GROK,\n 'how-explainer': FABLE,\n 'why-investigators': GROK,\n 'why-synthesizer': FABLE,\n 'reflect-tooling': SOL,\n 'reflect-judgment': FABLE,\n 'swarm-workers': GROK,\n 'independent-verifier': '',\n 'poteto-agent': '',\n 'comment-sicko': '',\n 'how-critics': '',\n 'arena-runners': PANEL,\n 'arena-cross-judge-pool': PANEL,\n 'architect-runners': PANEL,\n 'interrogate-reviewers': PANEL,\n} as const satisfies Record<PstackRole, string>\n\nexport function potetoNoteCopy(role: PstackRole, prefix: string): string {\n const slugs = POTETO_DEFAULT_SLUGS[role]\n return slugs.length === 0 ? '' : `${prefix}${slugs}`\n}\n","/** Plugin-owned pstack page inside the official Settings shell. */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { Button } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { LiveRoute } from '../catalog-types.ts'\nimport type { Overlay, OverlayRoute } from '../overlay-model.ts'\nimport { routeKey } from '../overlay-model.ts'\nimport {\n applyInheritAll,\n applyRouteToAll,\n draftToOverlay,\n liveFor,\n overlayToDraft,\n parseRouteSelectValue,\n routeSelectValue,\n selectableRoutes,\n stripIllegalEffort,\n type RoleDraft,\n} from '../settings-draft.ts'\nimport { PANEL_ROLES, type PstackRole } from '../roles.ts'\nimport { loadSettingsSnapshot, saveSettingsOverlay } from './api.ts'\nimport type { PstackSettingsKey } from './locales.ts'\nimport { potetoNoteCopy } from './poteto-defaults.ts'\n\nconst STYLE_ID = 'pstack-dsh-settings-theme'\n\nexport interface PstackSettingsInjected {\n t: (key: PstackSettingsKey, params?: Record<string, unknown>) => string\n subscribeCatalogChanges: (listener: () => void) => () => void\n}\n\nexport type PstackSettingsProps = Partial<PstackSettingsInjected>\n\nconst GROUPS: { id: 'groupPlaybooks' | 'groupSkills' | 'groupVerify' | 'groupPanels'; roles: readonly PstackRole[] }[] = [\n { id: 'groupPlaybooks', roles: ['feature', 'refactoring', 'bug-fix', 'perf-issue', 'hillclimb', 'judgment-and-prose', 'hardest-tasks'] },\n { id: 'groupSkills', roles: ['how-explorer', 'how-explainer', 'why-investigators', 'why-synthesizer', 'reflect-tooling', 'reflect-judgment', 'swarm-workers'] },\n { id: 'groupVerify', roles: ['independent-verifier', 'poteto-agent', 'comment-sicko'] },\n { id: 'groupPanels', roles: PANEL_ROLES.filter(role => role !== 'how-critics') },\n]\n\nconst SETTINGS_CSS = `\n.pstack-page { display:flex; flex-direction:column; gap:12px; max-width:720px; color:var(--dsw-alias-label-primary); }\n.pstack-title { margin:0; font-size:16px; line-height:24px; font-weight:500; color:var(--dsw-alias-label-primary); }\n.pstack-intro { margin:0; font-size:14px; line-height:22px; color:var(--dsw-alias-label-tertiary); }\n.pstack-note { margin:0; font-size:12px; line-height:18px; color:var(--dsw-alias-label-tertiary); }\n.pstack-warn { margin:0; font-size:12px; line-height:18px; color:var(--dsw-alias-state-warn-label); }\n.pstack-error { margin:0; font-size:13px; line-height:20px; color:var(--dsw-alias-state-error-primary); }\n.pstack-ok { margin:0; font-size:12px; line-height:18px; color:var(--dsw-alias-state-success-primary); }\n.pstack-toolbar { display:flex; flex-wrap:wrap; gap:8px; align-items:center; }\n.pstack-group { margin:12px 0 0; display:flex; flex-direction:column; gap:8px; }\n.pstack-group-title { margin:0; font-size:12px; line-height:18px; font-weight:500; color:var(--dsw-alias-label-secondary); }\n.pstack-card {\n border:1px solid var(--dsw-alias-border-l2); border-radius:12px;\n padding:12px 14px; display:flex; flex-direction:column; gap:10px;\n background:var(--dsw-alias-bg-module-platform);\n}\n.pstack-card-head { display:flex; align-items:baseline; justify-content:space-between; gap:10px; flex-wrap:wrap; }\n.pstack-role { margin:0; font-size:13px; line-height:20px; font-weight:500; color:var(--dsw-alias-label-primary); font-family:ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }\n.pstack-fields { display:flex; flex-wrap:wrap; gap:10px; align-items:flex-end; }\n.pstack-field { display:flex; flex-direction:column; gap:4px; min-width:180px; flex:1; }\n.pstack-label { font-size:12px; line-height:18px; color:var(--dsw-alias-label-secondary); }\n.pstack-select {\n height:34px; padding:0 12px; border:1px solid var(--dsw-alias-border-l2); border-radius:8px;\n background:var(--dsw-alias-bg-layer-3); color:var(--dsw-alias-label-primary);\n font:inherit; font-size:13px; line-height:20px;\n}\n.pstack-select:focus-visible { outline:none; border-color:var(--dsw-alias-brand-primary); }\n.pstack-select:disabled { color:var(--dsw-alias-label-tertiary); cursor:default; }\n.pstack-row { display:flex; flex-wrap:wrap; gap:10px; align-items:flex-end; }\n.pstack-path { margin:0; font-size:12px; line-height:18px; color:var(--dsw-alias-label-tertiary); word-break:break-all; }\n`\n\nfunction ensureThemeStyles(): void {\n if (typeof document === 'undefined') return\n if (document.getElementById(STYLE_ID) !== null) return\n const style = document.createElement('style')\n style.id = STYLE_ID\n style.textContent = SETTINGS_CSS\n document.head.appendChild(style)\n}\n\nfunction overlaysEqual(left: Overlay, right: Overlay): boolean {\n return JSON.stringify(left) === JSON.stringify(right)\n}\n\nfunction RoleHead({ role, t }: { role: PstackRole; t: PstackSettingsInjected['t'] }) {\n return (\n <div className=\"pstack-card-head\">\n <p className=\"pstack-role\">{role}</p>\n <p className=\"pstack-note\">{potetoNoteCopy(role, t('potetoPrefix'))}</p>\n </div>\n )\n}\n\nfunction firstSelectable(routes: readonly LiveRoute[]): OverlayRoute | undefined {\n const route = selectableRoutes(routes)[0]\n if (route === undefined) return undefined\n return { provider: route.provider, model: route.model }\n}\n\nfunction EffortSelect({\n id,\n route,\n live,\n t,\n onChange,\n}: {\n id: string\n route: OverlayRoute\n live: readonly LiveRoute[]\n t: PstackSettingsInjected['t']\n onChange: (next: OverlayRoute) => void\n}) {\n const found = liveFor(live, route.provider, route.model)\n if (found === undefined || found.efforts.length === 0) return null\n return (\n <div className=\"pstack-field\">\n <label className=\"pstack-label\" htmlFor={id}>{t('effort')}</label>\n <select\n id={id}\n className=\"pstack-select\"\n value={route.reasoningEffort ?? ''}\n onChange={event => {\n const idValue = event.target.value\n onChange(idValue.length === 0\n ? { provider: route.provider, model: route.model }\n : { provider: route.provider, model: route.model, reasoningEffort: idValue })\n }}\n >\n <option value=\"\">{t('effortOmit')}</option>\n {route.reasoningEffort !== undefined && !found.efforts.some(effort => effort.id === route.reasoningEffort)\n ? <option value={route.reasoningEffort} disabled>{route.reasoningEffort} · {t('unavailable')}</option>\n : null}\n {found.efforts.map(effort => (\n <option key={effort.id} value={effort.id}>{effort.name || effort.id}</option>\n ))}\n </select>\n </div>\n )\n}\n\nfunction RouteSelect({\n id,\n value,\n live,\n t,\n disabled,\n onChange,\n}: {\n id: string\n value: string\n live: readonly LiveRoute[]\n t: PstackSettingsInjected['t']\n disabled: boolean\n onChange: (value: string) => void\n}) {\n const selectable = selectableRoutes(live)\n return (\n <select id={id} className=\"pstack-select\" value={value} disabled={disabled} onChange={event => { onChange(event.target.value) }}>\n <option value=\"inherit-parent\">{t('inheritParent')}</option>\n <option value=\"auto\">{t('auto')}</option>\n {value !== 'inherit-parent' && value !== 'auto' && !selectable.some(route => routeKey(route.provider, route.model) === value)\n ? <option value={value} disabled>{value.replace('::', '/')} · {t('unavailable')}</option>\n : null}\n {selectable.map(route => {\n const key = routeKey(route.provider, route.model)\n return (\n <option key={key} value={key}>\n {route.provider}/{route.model}\n </option>\n )\n })}\n </select>\n )\n}\n\nexport function PstackSettings({ t, subscribeCatalogChanges }: PstackSettingsProps) {\n if (t === undefined) throw new Error('pstack settings requires its translation function')\n const [drafts, setDrafts] = useState<RoleDraft[] | undefined>(undefined)\n const [saved, setSaved] = useState<Overlay | undefined>(undefined)\n const [live, setLive] = useState<readonly LiveRoute[]>([])\n const [path, setPath] = useState<string>('')\n const [recommendOauth, setRecommendOauth] = useState(false)\n const [selectableCount, setSelectableCount] = useState(0)\n const [dropped, setDropped] = useState<string[]>([])\n const [error, setError] = useState<string | undefined>(undefined)\n const [catalogError, setCatalogError] = useState<string | undefined>(undefined)\n const [notice, setNotice] = useState<string | undefined>(undefined)\n const [busy, setBusy] = useState(false)\n const initialized = useRef(false)\n const catalogRequest = useRef<AbortController | undefined>(undefined)\n\n useEffect(() => { ensureThemeStyles() }, [])\n\n const refresh = useCallback(async () => {\n catalogRequest.current?.abort()\n const request = new AbortController()\n catalogRequest.current = request\n try {\n const snapshot = await loadSettingsSnapshot(request.signal)\n if (request.signal.aborted) return\n setLive(snapshot.catalog.routes)\n setSelectableCount(snapshot.catalog.selectableCount)\n setRecommendOauth(snapshot.catalog.recommendOauthLogin)\n setPath(snapshot.path)\n // Login/model notifications must never replace the user's in-progress\n // role choices (or the baseline used to decide whether Save is enabled).\n if (!initialized.current) {\n setSaved(snapshot.overlay)\n setDrafts(overlayToDraft(snapshot.overlay))\n setDropped(snapshot.droppedRoles)\n initialized.current = true\n }\n setCatalogError(undefined)\n } catch (caught: unknown) {\n if (!request.signal.aborted) {\n setCatalogError(caught instanceof Error ? caught.message : t('requestFailed'))\n }\n }\n }, [t])\n\n useEffect(() => {\n const reload = () => { void refresh() }\n const visible = () => { if (document.visibilityState === 'visible') reload() }\n const stop = subscribeCatalogChanges?.(reload)\n window.addEventListener('focus', reload)\n document.addEventListener('visibilitychange', visible)\n reload()\n return () => {\n stop?.()\n window.removeEventListener('focus', reload)\n document.removeEventListener('visibilitychange', visible)\n catalogRequest.current?.abort()\n }\n }, [refresh, subscribeCatalogChanges])\n\n const currentOverlay = useMemo(() => drafts === undefined ? undefined : draftToOverlay(drafts), [drafts])\n const dirty = saved !== undefined && currentOverlay !== undefined && !overlaysEqual(saved, currentOverlay)\n const empty = selectableCount === 0\n const applyTargets = selectableRoutes(live)\n\n const patchRole = (role: PstackRole, update: (draft: RoleDraft) => RoleDraft): void => {\n setDrafts(current => current?.map(draft => draft.role === role ? update(draft) : draft))\n setNotice(undefined)\n }\n\n const setScalarChoice = (role: PstackRole, value: string): void => {\n const parsed = parseRouteSelectValue(value, live)\n patchRole(role, draft => {\n if (parsed.inherit) {\n return { ...draft, inherit: true, inheritChoice: parsed.inheritChoice, routes: [] }\n }\n return { ...draft, inherit: false, inheritChoice: 'inherit-parent', routes: [stripIllegalEffort(parsed.route, live)] }\n })\n }\n\n const setPanelChoice = (role: PstackRole, index: number, value: string): void => {\n const parsed = parseRouteSelectValue(value, live)\n patchRole(role, draft => {\n if (parsed.inherit) {\n return { ...draft, inherit: true, inheritChoice: parsed.inheritChoice, routes: [] }\n }\n const routes = draft.inherit ? [] : [...draft.routes]\n routes[index] = stripIllegalEffort(parsed.route, live)\n return { ...draft, inherit: false, inheritChoice: 'inherit-parent', routes }\n })\n }\n\n const save = async (): Promise<void> => {\n if (currentOverlay === undefined) return\n setBusy(true)\n setNotice(undefined)\n setError(undefined)\n try {\n const result = await saveSettingsOverlay(currentOverlay)\n setSaved(result.overlay)\n setDrafts(overlayToDraft(result.overlay))\n setDropped([])\n setError(undefined)\n setNotice(t('saved'))\n } catch (caught: unknown) {\n setNotice(undefined)\n setError(caught instanceof Error ? caught.message : t('requestFailed'))\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <section\n className=\"pstack-page\"\n aria-labelledby=\"pstack-settings-title\"\n onFocusCapture={event => { if (event.target instanceof HTMLSelectElement) void refresh() }}\n onPointerDownCapture={event => { if (event.target instanceof HTMLSelectElement) void refresh() }}\n >\n <h2 id=\"pstack-settings-title\" className=\"pstack-title\">{t('title')}</h2>\n <p className=\"pstack-intro\">{t('intro')}</p>\n <p className=\"pstack-note\">{t('catalogUpdates')}</p>\n {error !== undefined ? <p className=\"pstack-error\">{error}</p> : null}\n {catalogError !== undefined ? <p className=\"pstack-error\">{catalogError}</p> : null}\n {notice !== undefined ? <p className=\"pstack-ok\" role=\"status\">{notice}</p> : null}\n {dropped.length > 0 ? <p className=\"pstack-warn\">{t('dropped')}</p> : null}\n {drafts === undefined\n ? <p className=\"pstack-note\">{t('loading')}</p>\n : (\n <>\n {empty ? <p className=\"pstack-warn\">{t('emptyCatalog')}</p> : null}\n {recommendOauth ? <p className=\"pstack-note\">{t('oauthRecommend')}</p> : null}\n <div className=\"pstack-toolbar\">\n <Button variant=\"primary\" size=\"sm\" disabled={busy || !dirty} onClick={() => { void save() }}>\n {busy ? t('saving') : t('save')}\n </Button>\n <Button variant=\"outline\" size=\"sm\" disabled={busy} onClick={() => { void refresh() }}>\n {t('reload')}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={busy}\n onClick={() => {\n setDrafts(current => current === undefined ? current : applyInheritAll(current))\n setNotice(undefined)\n }}\n >\n {t('resetAll')}\n </Button>\n {applyTargets.length > 0\n ? (\n <label className=\"pstack-field\" style={{ minWidth: 220 }}>\n <span className=\"pstack-label\">{t('applyAll')}</span>\n <select\n className=\"pstack-select\"\n defaultValue=\"\"\n disabled={busy}\n onChange={event => {\n const value = event.target.value\n event.target.value = ''\n if (value.length === 0) return\n if (value === 'inherit-parent') {\n setDrafts(current => current === undefined ? current : applyInheritAll(current))\n return\n }\n const parsed = parseRouteSelectValue(value, live)\n if (parsed.inherit) {\n setDrafts(current => current === undefined ? current : applyInheritAll(current, parsed.inheritChoice))\n return\n }\n setDrafts(current => current === undefined ? current : applyRouteToAll(current, parsed.route, live))\n }}\n >\n <option value=\"\">{t('applyAll')}</option>\n <option value=\"inherit-parent\">{t('applyAllInherit')}</option>\n {applyTargets.map(route => {\n const key = routeKey(route.provider, route.model)\n return <option key={key} value={key}>{route.provider}/{route.model}</option>\n })}\n </select>\n </label>\n )\n : null}\n </div>\n {GROUPS.map(group => (\n <div key={group.id} className=\"pstack-group\">\n <h3 className=\"pstack-group-title\">{t(group.id)}</h3>\n {group.roles.map(role => {\n const draft = drafts.find(entry => entry.role === role)\n if (draft === undefined) return null\n if (!draft.panel) {\n const route = draft.routes[0]\n return (\n <article key={role} className=\"pstack-card\">\n <RoleHead role={role} t={t} />\n <div className=\"pstack-fields\">\n <div className=\"pstack-field\">\n <label className=\"pstack-label\" htmlFor={`pstack-role-${role}`}>{role}</label>\n <RouteSelect\n id={`pstack-role-${role}`}\n value={routeSelectValue(draft)}\n live={live}\n t={t}\n disabled={busy}\n onChange={value => { setScalarChoice(role, value) }}\n />\n </div>\n {route !== undefined && !draft.inherit\n ? (\n <EffortSelect\n id={`pstack-effort-${role}`}\n route={route}\n live={live}\n t={t}\n onChange={next => {\n patchRole(role, current => ({ ...current, routes: [next] }))\n }}\n />\n )\n : null}\n </div>\n </article>\n )\n }\n const rows = draft.inherit ? [] : draft.routes\n return (\n <article key={role} className=\"pstack-card\">\n <RoleHead role={role} t={t} />\n {draft.inherit\n ? (\n <div className=\"pstack-field\">\n <label className=\"pstack-label\" htmlFor={`pstack-role-${role}`}>{t('inheritParent')}</label>\n <RouteSelect\n id={`pstack-role-${role}`}\n value={draft.inheritChoice}\n live={[]}\n t={t}\n disabled={busy}\n onChange={value => {\n if (value === 'inherit-parent' || value === 'auto') {\n patchRole(role, current => ({\n ...current,\n inherit: true,\n inheritChoice: value,\n routes: [],\n }))\n }\n }}\n />\n </div>\n )\n : (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={busy}\n onClick={() => {\n patchRole(role, current => ({\n ...current,\n inherit: true,\n inheritChoice: 'inherit-parent',\n routes: [],\n }))\n }}\n >\n {t('inheritParent')}\n </Button>\n )}\n {!draft.inherit\n ? rows.map((route, index) => (\n <div key={`${role}-${index}`} className=\"pstack-row\">\n <div className=\"pstack-field\">\n <label className=\"pstack-label\" htmlFor={`pstack-panel-${role}-${index}`}>{`${role}[${index}]`}</label>\n <RouteSelect\n id={`pstack-panel-${role}-${index}`}\n value={routeSelectValue({ ...draft, inherit: false, routes: [route] })}\n live={live}\n t={t}\n disabled={busy || empty}\n onChange={value => { setPanelChoice(role, index, value) }}\n />\n </div>\n <EffortSelect\n id={`pstack-panel-effort-${role}-${index}`}\n route={route}\n live={live}\n t={t}\n onChange={next => {\n patchRole(role, current => {\n const nextRoutes = [...current.routes]\n nextRoutes[index] = next\n return { ...current, inherit: false, routes: nextRoutes }\n })\n }}\n />\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={busy}\n onClick={() => {\n patchRole(role, current => {\n const nextRoutes = current.routes.filter((_, item) => item !== index)\n return nextRoutes.length === 0\n ? { ...current, inherit: true, routes: [] }\n : { ...current, inherit: false, routes: nextRoutes }\n })\n }}\n >\n {t('removeRoute')}\n </Button>\n </div>\n ))\n : null}\n <div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={busy || empty}\n onClick={() => {\n const added = firstSelectable(live)\n if (added === undefined) return\n patchRole(role, current => ({\n ...current,\n inherit: false,\n routes: [...(current.inherit ? [] : current.routes), added],\n }))\n }}\n >\n {t('addRoute')}\n </Button>\n </div>\n </article>\n )\n })}\n </div>\n ))}\n {path.length > 0 ? <p className=\"pstack-path\">{t('overlayPath')}: {path}</p> : null}\n </>\n )}\n </section>\n )\n}\n","export const en = {\n nav: 'pstack roles',\n title: 'pstack roles',\n intro: 'Map each pstack role onto a route that is already logged in on this DSH. Children inherit this conversation until you save a mapping. Writes $DSH_HOME/pstack-dsh.json, the same file spawn reads.',\n loading: 'Loading logged-in routes…',\n save: 'Save',\n saving: 'Saving…',\n saved: 'Saved. New pstack_spawn calls pick this up.',\n reload: 'Refresh models',\n catalogUpdates: 'Model choices update automatically after login or model changes. Unsaved role settings are preserved.',\n unavailable: 'currently unavailable',\n resetAll: 'Inherit for every role',\n inheritParent: 'inherit-parent',\n auto: 'auto',\n potetoPrefix: 'Poteto 0.15 recommendation: ',\n emptyCatalog: 'No logged-in route. Every role inherits this conversation. Add a provider API key in Settings → Models.',\n oauthRecommend: 'Subscription logins (ChatGPT, Claude, Grok, Copilot, OpenRouter, Kimi, Google Antigravity) show up here after you install and sign in with dsh-oauth-login or dsh-antigravity-oauth. Not required for API keys.',\n effort: 'Effort',\n effortOmit: 'omit (adapter default)',\n addRoute: 'Add route',\n removeRoute: 'Remove',\n applyAll: 'Apply to every role',\n applyAllInherit: 'Inherit parent for every role',\n overlayPath: 'Overlay',\n dropped: 'Some saved mappings pointed at routes that are no longer logged in. Those roles now inherit until you save again.',\n requestFailed: 'The settings request failed.',\n groupPlaybooks: 'Playbook delegates',\n groupSkills: 'Skill roles',\n groupVerify: 'Verify and helpers',\n groupPanels: 'Panel roles',\n} as const\n\nexport type PstackSettingsKey = keyof typeof en\n\nexport const zh: { [Key in PstackSettingsKey]: string } = {\n nav: 'pstack 角色',\n title: 'pstack 角色',\n intro: '把每个 pstack 角色映射到本机已经登录的路由。未保存前,子 agent 继承当前对话。写入 $DSH_HOME/pstack-dsh.json,与 spawn 读的是同一份文件。',\n loading: '正在加载已登录路由…',\n save: '保存',\n saving: '保存中…',\n saved: '已保存。之后的 pstack_spawn 会读到这份 overlay。',\n reload: '刷新模型列表',\n catalogUpdates: '登录或模型变更后自动更新列表,不会覆盖未保存的角色设置。',\n unavailable: '暂不可用',\n resetAll: '全部继承父对话',\n inheritParent: 'inherit-parent',\n auto: 'auto',\n potetoPrefix: 'Poteto 0.15 推荐:',\n emptyCatalog: '没有已登录路由。每个角色都继承当前对话。请先在 设置 → 模型 里配置 API key。',\n oauthRecommend: '订阅登录(ChatGPT / Claude / Grok / Copilot / OpenRouter / Kimi / Google Antigravity)要出现在这里,需要另装并登录 dsh-oauth-login 或 dsh-antigravity-oauth。只用 API key 可以不装。',\n effort: 'Effort',\n effortOmit: '省略(适配器默认)',\n addRoute: '添加路由',\n removeRoute: '移除',\n applyAll: '应用到全部角色',\n applyAllInherit: '全部角色继承父对话',\n overlayPath: 'Overlay',\n dropped: '有些已保存的映射指向了不再登录的路由。这些角色已改回继承,保存后才会写盘。',\n requestFailed: '设置请求失败。',\n groupPlaybooks: '玩法委派',\n groupSkills: '技能角色',\n groupVerify: '核验与助手',\n groupPanels: '面板角色',\n}\n","/** Browser half: pstack roles inside official DSH Settings. */\n\nimport type { Context } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-api-remotes/client'\nimport type {} from '@deepseek-ai/dsh-client-connection/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-renderer/client'\nimport { PstackSettings } from './PstackSettings.tsx'\nimport type { PstackSettingsInjected } from './PstackSettings.tsx'\nimport { en, zh } from './locales.ts'\nimport type { PstackSettingsKey } from './locales.ts'\nimport { SETTINGS_SECTION_ID } from '../ids.ts'\nimport { listenForCatalogChanges } from './api.ts'\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface LocaleNamespaceMap {\n 'settings.pstack': PstackSettingsKey\n }\n}\n\nexport const name = 'pstack-dsh-client'\nexport const inject = ['slots', 'locale', 'remote']\n\nexport function apply(ctx: Context): void {\n const namespace = 'settings.pstack'\n ctx.effect(() => ctx.locale.register(namespace, { zh, en }), 'pstack-dsh: settings copy')\n const t: PstackSettingsInjected['t'] = ctx.locale.bind(namespace)\n const subscribeCatalogChanges: PstackSettingsInjected['subscribeCatalogChanges'] = listener =>\n listenForCatalogChanges(ctx, listener)\n ctx.slots.inject('settings.section', () => ctx.slots.register({\n name: 'settings.section',\n id: SETTINGS_SECTION_ID,\n order: 16,\n label: () => t('nav'),\n inject: (): PstackSettingsInjected => ({ t, subscribeCatalogChanges }),\n }, PstackSettings))\n}\n"],"mappings":"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"}
package/lib/index.d.ts ADDED
@@ -0,0 +1,34 @@
1
+ import { Context } from "@deepseek-ai/cordis";
2
+ //#region src/plugin-config.d.ts
3
+ /**
4
+ * Standard Schema v1 Config. Loader validates before apply.
5
+ * Avoids a hard schemastery import so the package still typechecks without DSH.
6
+ */
7
+ interface Config {
8
+ /** In-process subagent provider name. Default `spawn`. */
9
+ spawnProvider?: string;
10
+ }
11
+ declare const Config: {
12
+ '~standard': {
13
+ version: 1;
14
+ vendor: string;
15
+ validate(value: unknown): {
16
+ value: {
17
+ spawnProvider: string;
18
+ };
19
+ issues?: undefined;
20
+ } | {
21
+ issues: {
22
+ message: string;
23
+ }[];
24
+ value?: undefined;
25
+ };
26
+ };
27
+ };
28
+ //#endregion
29
+ //#region src/index.d.ts
30
+ declare const name = "pstack-dsh";
31
+ declare const inject: string[];
32
+ declare function apply(ctx: Context, config?: Config): void;
33
+ //#endregion
34
+ export { Config, type Config as ConfigType, apply, inject, name };