@sayknow-cli/coding-agent 0.3.5 → 0.3.7

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 (238) hide show
  1. package/README.md +76 -0
  2. package/dist/types/capability/mcp.d.ts +2 -0
  3. package/dist/types/cli/local-provider-smoke.d.ts +59 -0
  4. package/dist/types/cli/notify-cli.d.ts +1 -1
  5. package/dist/types/cli/telegram-cli.d.ts +13 -0
  6. package/dist/types/cli/update-cli.d.ts +24 -1
  7. package/dist/types/commands/local-provider.d.ts +34 -0
  8. package/dist/types/commands/telegram.d.ts +22 -0
  9. package/dist/types/config/keybindings.d.ts +12 -6
  10. package/dist/types/config/model-registry.d.ts +5 -0
  11. package/dist/types/config/models-config-schema.d.ts +5 -0
  12. package/dist/types/config/settings-schema.d.ts +284 -4
  13. package/dist/types/config/settings.d.ts +7 -0
  14. package/dist/types/config/telegram-autostart.d.ts +14 -0
  15. package/dist/types/config/telegram-env-bridge.d.ts +18 -0
  16. package/dist/types/coordinator-mcp/server.d.ts +8 -0
  17. package/dist/types/defaults/skc-defaults.d.ts +7 -0
  18. package/dist/types/discovery/cursor.d.ts +4 -1
  19. package/dist/types/discovery/index.d.ts +0 -1
  20. package/dist/types/discovery/windsurf.d.ts +3 -1
  21. package/dist/types/extensibility/extensions/types.d.ts +11 -0
  22. package/dist/types/i18n/messages/en.d.ts +1 -0
  23. package/dist/types/modes/components/custom-editor.d.ts +6 -1
  24. package/dist/types/modes/components/custom-model-preset-wizard.d.ts +1 -1
  25. package/dist/types/modes/components/hook-selector.d.ts +5 -0
  26. package/dist/types/modes/components/model-selector.d.ts +2 -0
  27. package/dist/types/modes/components/settings-selector.d.ts +5 -1
  28. package/dist/types/modes/components/skill-message.d.ts +1 -0
  29. package/dist/types/modes/components/status-line/types.d.ts +5 -7
  30. package/dist/types/modes/components/status-line.d.ts +15 -3
  31. package/dist/types/modes/components/two-column-body.d.ts +9 -0
  32. package/dist/types/modes/components/welcome.d.ts +9 -1
  33. package/dist/types/modes/controllers/command-controller.d.ts +1 -0
  34. package/dist/types/modes/controllers/input-controller.d.ts +6 -1
  35. package/dist/types/modes/controllers/selector-controller.d.ts +10 -1
  36. package/dist/types/modes/interactive-mode.d.ts +2 -0
  37. package/dist/types/modes/prompt-action-autocomplete.d.ts +3 -0
  38. package/dist/types/modes/rpc/rpc-types.d.ts +1 -0
  39. package/dist/types/modes/shared/agent-wire/deep-interview-gate.d.ts +41 -7
  40. package/dist/types/modes/slash-command-visibility.d.ts +1 -0
  41. package/dist/types/modes/theme/theme.d.ts +1 -1
  42. package/dist/types/modes/tmux-scroll.d.ts +18 -0
  43. package/dist/types/modes/types.d.ts +5 -1
  44. package/dist/types/modes/utils/terminal-bell.d.ts +3 -0
  45. package/dist/types/notifications/daemon-paths.d.ts +9 -0
  46. package/dist/types/notifications/html-format.d.ts +2 -0
  47. package/dist/types/notifications/recent-activity.d.ts +5 -1
  48. package/dist/types/notifications/telegram-daemon-cli.d.ts +21 -4
  49. package/dist/types/notifications/telegram-daemon-control.d.ts +8 -0
  50. package/dist/types/notifications/telegram-daemon.d.ts +4 -10
  51. package/dist/types/notifications/telegram-reference.d.ts +4 -0
  52. package/dist/types/notifications/threaded-render.d.ts +1 -0
  53. package/dist/types/runtime-mcp/config-writer.d.ts +9 -0
  54. package/dist/types/runtime-mcp/config.d.ts +2 -0
  55. package/dist/types/runtime-mcp/loader.d.ts +2 -0
  56. package/dist/types/runtime-mcp/manager.d.ts +2 -0
  57. package/dist/types/runtime-mcp/types.d.ts +6 -0
  58. package/dist/types/sdk.d.ts +1 -1
  59. package/dist/types/skc-runtime/launch-tmux.d.ts +2 -2
  60. package/dist/types/skc-runtime/ralplan-runtime.d.ts +3 -2
  61. package/dist/types/skc-runtime/restricted-role-agent-bash.d.ts +1 -0
  62. package/dist/types/skc-runtime/session-state-sidecar.d.ts +5 -0
  63. package/dist/types/skc-runtime/state-writer.d.ts +1 -0
  64. package/dist/types/skc-runtime/team-runtime.d.ts +1 -1
  65. package/dist/types/skc-runtime/tmux-common.d.ts +12 -0
  66. package/dist/types/skc-runtime/ultragoal-guard.d.ts +7 -1
  67. package/dist/types/skc-runtime/ultragoal-runtime.d.ts +0 -4
  68. package/dist/types/slash-commands/types.d.ts +2 -0
  69. package/dist/types/system-prompt.d.ts +7 -0
  70. package/dist/types/tools/skill.d.ts +1 -1
  71. package/dist/types/utils/cmux-workspace.d.ts +52 -0
  72. package/dist/types/web/search/index.d.ts +4 -2
  73. package/dist/types/web/search/provider.d.ts +14 -0
  74. package/dist/types/web/search/providers/utils.d.ts +42 -13
  75. package/dist/types/web/search/render.d.ts +1 -0
  76. package/dist/types/workflow/workflow-intent-diff.d.ts +19 -0
  77. package/package.json +8 -8
  78. package/scripts/build-binary.ts +3 -0
  79. package/scripts/verify-insane-vendor.ts +0 -5
  80. package/src/capability/mcp.ts +2 -0
  81. package/src/cli/local-provider-smoke.ts +632 -0
  82. package/src/cli/notify-cli.ts +4 -2
  83. package/src/cli/telegram-cli.ts +156 -0
  84. package/src/cli/update-cli.ts +179 -13
  85. package/src/cli/web-search-cli.ts +5 -7
  86. package/src/cli.ts +20 -1
  87. package/src/commands/launch.ts +47 -2
  88. package/src/commands/local-provider.ts +62 -0
  89. package/src/commands/notify.ts +1 -1
  90. package/src/commands/ralplan.ts +1 -0
  91. package/src/commands/telegram.ts +47 -0
  92. package/src/config/keybindings.ts +15 -6
  93. package/src/config/mcp-schema.json +4 -0
  94. package/src/config/model-registry.ts +55 -1
  95. package/src/config/models-config-schema.ts +9 -0
  96. package/src/config/settings-schema.ts +256 -4
  97. package/src/config/settings.ts +11 -0
  98. package/src/config/telegram-autostart.ts +107 -0
  99. package/src/config/telegram-env-bridge.ts +92 -0
  100. package/src/coordinator-mcp/server.ts +276 -34
  101. package/src/defaults/skc/skills/ralplan/SKILL.md +29 -20
  102. package/src/defaults/skc/skills/ultragoal/SKILL.md +37 -112
  103. package/src/defaults/skc-defaults.ts +16 -0
  104. package/src/discovery/builtin.ts +12 -0
  105. package/src/discovery/cursor.ts +5 -84
  106. package/src/discovery/gemini.ts +3 -89
  107. package/src/discovery/index.ts +4 -1
  108. package/src/discovery/mcp-json.ts +11 -0
  109. package/src/discovery/opencode.ts +5 -122
  110. package/src/discovery/windsurf.ts +4 -82
  111. package/src/edit/read-file.ts +9 -1
  112. package/src/extensibility/extensions/runner.ts +2 -1
  113. package/src/extensibility/extensions/types.ts +11 -0
  114. package/src/extensibility/skills.ts +30 -2
  115. package/src/hooks/skill-state.ts +33 -73
  116. package/src/i18n/messages/de.ts +1 -0
  117. package/src/i18n/messages/en.ts +1 -0
  118. package/src/i18n/messages/es.ts +1 -0
  119. package/src/i18n/messages/fr.ts +1 -0
  120. package/src/i18n/messages/ja.settings.ts +28 -0
  121. package/src/i18n/messages/ja.ts +1 -0
  122. package/src/i18n/messages/ko.settings.ts +28 -0
  123. package/src/i18n/messages/ko.ts +1 -0
  124. package/src/i18n/messages/zh.settings.ts +28 -0
  125. package/src/i18n/messages/zh.ts +1 -0
  126. package/src/internal-urls/docs-index.generated.ts +12 -7
  127. package/src/main.ts +5 -2
  128. package/src/migrate/executor.ts +23 -6
  129. package/src/modes/acp/acp-agent.ts +7 -6
  130. package/src/modes/components/agent-dashboard.ts +3 -35
  131. package/src/modes/components/custom-editor.ts +26 -0
  132. package/src/modes/components/custom-model-preset-wizard.ts +30 -189
  133. package/src/modes/components/extensions/extension-dashboard.ts +2 -48
  134. package/src/modes/components/hook-selector.ts +21 -3
  135. package/src/modes/components/model-selector.ts +246 -11
  136. package/src/modes/components/session-observer-overlay.ts +3 -3
  137. package/src/modes/components/session-selector.ts +19 -9
  138. package/src/modes/components/settings-selector.ts +551 -11
  139. package/src/modes/components/skill-message.ts +18 -10
  140. package/src/modes/components/status-line/presets.ts +11 -0
  141. package/src/modes/components/status-line/segments.ts +16 -19
  142. package/src/modes/components/status-line/types.ts +6 -2
  143. package/src/modes/components/status-line.ts +281 -117
  144. package/src/modes/components/tree-selector.ts +28 -8
  145. package/src/modes/components/two-column-body.ts +36 -0
  146. package/src/modes/components/welcome.ts +165 -30
  147. package/src/modes/controllers/command-controller.ts +26 -2
  148. package/src/modes/controllers/event-controller.ts +102 -4
  149. package/src/modes/controllers/extension-ui-controller.ts +21 -2
  150. package/src/modes/controllers/input-controller.ts +214 -47
  151. package/src/modes/controllers/selector-controller.ts +35 -33
  152. package/src/modes/interactive-mode.ts +36 -30
  153. package/src/modes/prompt-action-autocomplete.ts +48 -8
  154. package/src/modes/rpc/rpc-types.ts +1 -0
  155. package/src/modes/shared/agent-wire/deep-interview-gate.ts +72 -15
  156. package/src/modes/shared/agent-wire/workflow-gate-schema.ts +20 -0
  157. package/src/modes/slash-command-visibility.ts +9 -0
  158. package/src/modes/theme/theme.ts +5 -1
  159. package/src/modes/tmux-scroll.ts +92 -0
  160. package/src/modes/types.ts +8 -1
  161. package/src/modes/utils/hotkeys-markdown.ts +5 -2
  162. package/src/modes/utils/terminal-bell.ts +48 -0
  163. package/src/modes/utils/ui-helpers.ts +76 -3
  164. package/src/notifications/daemon-paths.ts +22 -0
  165. package/src/notifications/html-format.ts +75 -1
  166. package/src/notifications/index.ts +32 -2
  167. package/src/notifications/lifecycle-control-runtime.ts +12 -3
  168. package/src/notifications/recent-activity.ts +32 -8
  169. package/src/notifications/telegram-daemon-cli.ts +125 -13
  170. package/src/notifications/telegram-daemon-control.ts +9 -0
  171. package/src/notifications/telegram-daemon.ts +88 -46
  172. package/src/notifications/telegram-reference.ts +36 -14
  173. package/src/notifications/threaded-render.ts +14 -6
  174. package/src/prompts/agents/architect.md +7 -4
  175. package/src/prompts/agents/critic.md +15 -6
  176. package/src/prompts/agents/planner.md +8 -3
  177. package/src/prompts/system/system-prompt.md +20 -2
  178. package/src/prompts/tools/bash.md +1 -1
  179. package/src/runtime-mcp/config-writer.ts +28 -0
  180. package/src/runtime-mcp/config.ts +7 -0
  181. package/src/runtime-mcp/loader.ts +3 -0
  182. package/src/runtime-mcp/manager.ts +3 -0
  183. package/src/runtime-mcp/types.ts +6 -0
  184. package/src/sdk.ts +10 -11
  185. package/src/session/agent-session.ts +103 -13
  186. package/src/session/session-manager.ts +58 -18
  187. package/src/skc-runtime/launch-tmux.ts +34 -8
  188. package/src/skc-runtime/launch-worktree.ts +16 -2
  189. package/src/skc-runtime/ralplan-runtime.ts +22 -6
  190. package/src/skc-runtime/restricted-role-agent-bash.ts +1 -0
  191. package/src/skc-runtime/session-state-sidecar.ts +167 -24
  192. package/src/skc-runtime/state-runtime.ts +8 -5
  193. package/src/skc-runtime/state-writer.ts +5 -5
  194. package/src/skc-runtime/team-runtime.ts +21 -6
  195. package/src/skc-runtime/tmux-common.ts +16 -0
  196. package/src/skc-runtime/tmux-sessions.ts +13 -9
  197. package/src/skc-runtime/ultragoal-guard.ts +150 -24
  198. package/src/skc-runtime/ultragoal-runtime.ts +16 -124
  199. package/src/skc-runtime/workflow-manifest.generated.json +0 -8
  200. package/src/skc-runtime/workflow-manifest.ts +0 -1
  201. package/src/slash-commands/builtin-registry.ts +136 -23
  202. package/src/slash-commands/types.ts +2 -0
  203. package/src/system-prompt.ts +8 -0
  204. package/src/task/executor.ts +5 -0
  205. package/src/tools/ast-grep.ts +10 -7
  206. package/src/tools/bash.ts +39 -14
  207. package/src/tools/index.ts +8 -1
  208. package/src/tools/skill.ts +1 -1
  209. package/src/utils/cmux-workspace.ts +233 -0
  210. package/src/utils/title-generator.ts +2 -0
  211. package/src/web/kagi.ts +1 -1
  212. package/src/web/parallel.ts +2 -2
  213. package/src/web/search/index.ts +137 -52
  214. package/src/web/search/provider.ts +80 -0
  215. package/src/web/search/providers/anthropic.ts +1 -1
  216. package/src/web/search/providers/brave.ts +1 -1
  217. package/src/web/search/providers/codex.ts +1 -1
  218. package/src/web/search/providers/duckduckgo.ts +1 -1
  219. package/src/web/search/providers/exa.ts +1 -1
  220. package/src/web/search/providers/gemini.ts +7 -3
  221. package/src/web/search/providers/jina.ts +1 -1
  222. package/src/web/search/providers/kimi.ts +6 -1
  223. package/src/web/search/providers/openai-compatible.ts +1 -1
  224. package/src/web/search/providers/parallel.ts +1 -1
  225. package/src/web/search/providers/perplexity.ts +2 -2
  226. package/src/web/search/providers/searxng.ts +1 -1
  227. package/src/web/search/providers/synthetic.ts +1 -1
  228. package/src/web/search/providers/tavily.ts +1 -1
  229. package/src/web/search/providers/utils.ts +67 -17
  230. package/src/web/search/providers/xai.ts +1 -1
  231. package/src/web/search/providers/zai.ts +1 -1
  232. package/src/web/search/render.ts +3 -0
  233. package/src/workflow/workflow-intent-diff.ts +199 -0
  234. package/vendor/insane-search/MANIFEST.json +1 -3
  235. package/vendor/insane-search/engine/tests/test_u1.py +0 -28
  236. package/vendor/insane-search/engine/transport.py +2 -3
  237. package/vendor/insane-search/engine/validators.py +0 -14
  238. package/src/defaults/skc/rules/ponytail.md +0 -68
@@ -12,8 +12,7 @@ import {
12
12
  writeGuardedJsonAtomic,
13
13
  writeGuardedWorkflowEnvelopeAtomic,
14
14
  } from "../skc-runtime/state-writer";
15
- import { isUltragoalBypassPrompt, readUltragoalVerificationState } from "../skc-runtime/ultragoal-guard";
16
- import { getUltragoalRunCompletionState, readUltragoalPlan } from "../skc-runtime/ultragoal-runtime";
15
+ import { isUltragoalBypassPrompt, verifyUltragoalDurableCompletionState } from "../skc-runtime/ultragoal-guard";
17
16
  import {
18
17
  readVisibleSkillActiveState as readCanonicalVisibleSkillActiveState,
19
18
  type SkillActiveEntry,
@@ -565,6 +564,10 @@ function modeStateReleasesStop(state: ModeState | null, handoffRequired: boolean
565
564
  return false;
566
565
  }
567
566
 
567
+ function ultragoalDurableCompletionReleasesStop(state: string): boolean {
568
+ return state === "inactive" || state === "active_verified_complete";
569
+ }
570
+
568
571
  /**
569
572
  * Cross-file coherence guard for a mode-state that claims it releases the Stop
570
573
  * block. `modeStateReleasesStop` trusts a single mode-state file; if any writer
@@ -577,18 +580,15 @@ function modeStateReleasesStop(state: ModeState | null, handoffRequired: boolean
577
580
  * cheap and read-only — ultragoal reads the durable plan; skills without an
578
581
  * independent durable source release as before.
579
582
  */
580
- async function detectStaleModeStateRelease(skill: SkcWorkflowSkill, cwd: string): Promise<string | null> {
581
- if (skill === "ultragoal") {
582
- const plan = await readUltragoalPlan(cwd);
583
- if (!plan) return null;
584
- const runState = getUltragoalRunCompletionState(plan);
585
- if (runState.incompleteGoals.length > 0) {
586
- return `the durable Ultragoal plan still has incomplete required goals (${runState.incompleteGoals
587
- .map(goal => goal.id)
588
- .join(", ")}); run \`skc ultragoal complete-goals\` to continue`;
589
- }
590
- }
591
- return null;
583
+ async function detectStaleModeStateRelease(
584
+ skill: SkcWorkflowSkill,
585
+ cwd: string,
586
+ sessionId?: string | null,
587
+ ): Promise<string | null> {
588
+ if (skill !== "ultragoal") return null;
589
+ const diagnostic = await verifyUltragoalDurableCompletionState({ cwd, sessionId });
590
+ if (ultragoalDurableCompletionReleasesStop(diagnostic.state)) return null;
591
+ return `${diagnostic.message} Run \`skc ultragoal complete-goals\` to continue, or checkpoint a finished story with \`skc ultragoal checkpoint --status complete --quality-gate-json <file>\`, before stopping`;
592
592
  }
593
593
 
594
594
  /**
@@ -663,19 +663,6 @@ function stateMatchesContext(state: ModeState, sessionId?: string, threadId?: st
663
663
  return true;
664
664
  }
665
665
 
666
- async function readCurrentGoalObjectiveFromSessionFile(sessionFile: string | undefined): Promise<string | null> {
667
- const trimmed = sessionFile?.trim();
668
- if (!trimmed) return null;
669
- const entries = (await loadEntriesFromFile(trimmed)).filter(
670
- (entry): entry is SessionEntry => entry.type !== "session",
671
- );
672
- const context = buildSessionContext(entries);
673
- const goal = context.modeData?.goal;
674
- if (typeof goal !== "object" || goal === null) return null;
675
- const objective = (goal as { objective?: unknown }).objective;
676
- return typeof objective === "string" && objective.trim().length > 0 ? objective.trim() : null;
677
- }
678
-
679
666
  async function readLatestAssistantTextFromSessionFile(sessionFile: string | undefined): Promise<string | null> {
680
667
  const trimmed = sessionFile?.trim();
681
668
  if (!trimmed) return null;
@@ -730,34 +717,18 @@ export async function buildActiveUltragoalPromptContext(input: UserPromptSubmitS
730
717
  if (!stateMatchesContext(visibleModeState.state, resolvedSessionId, input.threadId)) return null;
731
718
 
732
719
  const phase = String(visibleModeState.state.current_phase ?? "active");
733
- const stateObjective =
734
- typeof visibleModeState.state.objective === "string"
735
- ? visibleModeState.state.objective
736
- : typeof visibleModeState.state.skcObjective === "string"
737
- ? visibleModeState.state.skcObjective
738
- : "";
739
- const sessionObjective = await readCurrentGoalObjectiveFromSessionFile(input.sessionFile);
740
720
  const normalizedPrompt = input.prompt?.replace(/\\?"/g, '"');
741
721
  const isBypassPrompt = Boolean(
742
722
  (normalizedPrompt && isUltragoalBypassPrompt(normalizedPrompt)) ||
743
723
  (input.prompt && /goal[\s\S]{0,80}complete/i.test(input.prompt)),
744
724
  );
745
725
  if (isBypassPrompt) {
746
- const objectives = [sessionObjective, stateObjective].filter(
747
- (value): value is string => typeof value === "string" && value.trim().length > 0,
748
- );
749
- if (objectives.length === 0) {
750
- return "BLOCK_ULTRAGOAL_COMPLETION: Active Ultragoal completion is blocked until a current SKC goal objective can be verified. Use durable blocker work or run strict `skc ultragoal checkpoint --status complete --quality-gate-json <file> --skc-goal-json <file>` before completion.";
751
- }
752
- for (const objective of objectives) {
753
- const diagnostic = await readUltragoalVerificationState({
754
- cwd: input.cwd,
755
- currentGoal: { objective },
756
- });
757
- if (diagnostic.state === "unrelated_goal") continue;
758
- if (!["inactive", "active_verified_complete"].includes(diagnostic.state)) {
759
- return `BLOCK_ULTRAGOAL_COMPLETION: ${diagnostic.message} Use durable blocker work or run strict \`skc ultragoal checkpoint --status complete --quality-gate-json <file> --skc-goal-json <file>\` before completion.`;
760
- }
726
+ const diagnostic = await verifyUltragoalDurableCompletionState({
727
+ cwd: input.cwd,
728
+ sessionId: resolvedSessionId,
729
+ });
730
+ if (!ultragoalDurableCompletionReleasesStop(diagnostic.state)) {
731
+ return `BLOCK_ULTRAGOAL_COMPLETION: ${diagnostic.message} Use durable blocker work or run strict \`skc ultragoal checkpoint --status complete --quality-gate-json <file>\` before completion.`;
761
732
  }
762
733
  }
763
734
  return `Ultragoal is active (phase: ${phase}; state: ${visibleModeState.statePath}). If the user prompt is a steering request, use \`skc ultragoal steer\` to add or steer subgoals. Normal prose should not mutate Ultragoal state.`;
@@ -818,7 +789,7 @@ export async function buildSkillStopOutput(input: StopHookInput): Promise<Record
818
789
  // authoritative durable state. If a stale/incoherent mode-state would
819
790
  // release while the plan/ledger still shows pending work, block instead
820
791
  // of trusting the single file (see #659).
821
- const staleRelease = await detectStaleModeStateRelease(entry.skill, input.cwd);
792
+ const staleRelease = await detectStaleModeStateRelease(entry.skill, input.cwd, resolvedSessionId);
822
793
  if (staleRelease) {
823
794
  const coherenceMessage = `SKC skill "${entry.skill}" mode-state reports it released the Stop block (${modeStatePath(input.cwd, entry.skill, resolvedSessionId)}), but ${staleRelease}. The mode-state is incoherent with authoritative durable state; finish or explicitly clear the pending work before stopping.`;
824
795
  return {
@@ -847,29 +818,18 @@ export async function buildSkillStopOutput(input: StopHookInput): Promise<Record
847
818
  const phase = String(modeState?.current_phase ?? entry.phase ?? skillState.phase ?? "active");
848
819
  const statePath = modeStatePath(input.cwd, entry.skill, resolvedSessionId);
849
820
  if (entry.skill === "ultragoal") {
850
- const objective =
851
- (await readCurrentGoalObjectiveFromSessionFile(input.sessionFile)) ??
852
- (typeof modeState?.objective === "string"
853
- ? modeState.objective
854
- : typeof modeState?.skcObjective === "string"
855
- ? modeState.skcObjective
856
- : "");
857
- if (objective) {
858
- const diagnostic = await readUltragoalVerificationState({
859
- cwd: input.cwd,
860
- currentGoal: { objective },
861
- });
862
- if (diagnostic.state === "active_verified_complete") continue;
863
- if (!["inactive", "unrelated_goal"].includes(diagnostic.state)) {
864
- const ultragoalMessage = `SKC ultragoal verification is blocking stop: ${diagnostic.message} Run strict checkpoint verification or record review blockers before stopping.`;
865
- return {
866
- decision: "block",
867
- reason: ultragoalMessage,
868
- stopReason: `skc_ultragoal_verification_${diagnostic.state}`,
869
- systemMessage: ultragoalMessage,
870
- };
871
- }
872
- }
821
+ const diagnostic = await verifyUltragoalDurableCompletionState({
822
+ cwd: input.cwd,
823
+ sessionId: resolvedSessionId,
824
+ });
825
+ if (ultragoalDurableCompletionReleasesStop(diagnostic.state)) continue;
826
+ const ultragoalMessage = `SKC ultragoal verification is blocking stop: ${diagnostic.message} Run \`skc ultragoal checkpoint --status complete --quality-gate-json <file>\` or record review blockers before stopping.`;
827
+ return {
828
+ decision: "block",
829
+ reason: ultragoalMessage,
830
+ stopReason: `skc_ultragoal_verification_${diagnostic.state}`,
831
+ systemMessage: ultragoalMessage,
832
+ };
873
833
  }
874
834
  const systemMessage = handoffRequired
875
835
  ? buildHandoffForceAskMessage(entry.skill, phase, statePath)
@@ -36,6 +36,7 @@ export const de: Partial<Record<MsgKey, string>> = {
36
36
  "settings.tab.tools": "Werkzeuge",
37
37
  "settings.tab.tasks": "Aufgaben",
38
38
  "settings.tab.providers": "Anbieter",
39
+ "settings.tab.integrations": "Integrationen",
39
40
  "settings.language.label": "Sprache",
40
41
  "settings.language.desc": "Sprache der Oberfläche. Automatisch folgt der Systemsprache.",
41
42
  "help.usage": "VERWENDUNG",
@@ -43,6 +43,7 @@ export const en = {
43
43
  "settings.tab.tools": "Tools",
44
44
  "settings.tab.tasks": "Tasks",
45
45
  "settings.tab.providers": "Providers",
46
+ "settings.tab.integrations": "Integrations",
46
47
 
47
48
  // ── Language setting ──
48
49
  "settings.language.label": "Language",
@@ -36,6 +36,7 @@ export const es: Partial<Record<MsgKey, string>> = {
36
36
  "settings.tab.tools": "Herramientas",
37
37
  "settings.tab.tasks": "Tareas",
38
38
  "settings.tab.providers": "Proveedores",
39
+ "settings.tab.integrations": "Integraciones",
39
40
  "settings.language.label": "Idioma",
40
41
  "settings.language.desc": "Idioma de la interfaz. Automático sigue la configuración regional del sistema.",
41
42
  "help.usage": "USO",
@@ -36,6 +36,7 @@ export const fr: Partial<Record<MsgKey, string>> = {
36
36
  "settings.tab.tools": "Outils",
37
37
  "settings.tab.tasks": "Tâches",
38
38
  "settings.tab.providers": "Fournisseurs",
39
+ "settings.tab.integrations": "Intégrations",
39
40
  "settings.language.label": "Langue",
40
41
  "settings.language.desc": "Langue de l'interface. Auto suit les paramètres régionaux du système.",
41
42
  "help.usage": "UTILISATION",
@@ -806,4 +806,32 @@ export const jaSettings: Record<string, string> = {
806
806
  "cmd:move:d": "セッションを別の作業ディレクトリに移動",
807
807
  "cmd:exit:d": "アプリケーションを終了",
808
808
  "set:edit.fuzzyThreshold:d": "あいまい一致の類似度しきい値",
809
+ "set:telegram.enabled:l": "Telegramリモート",
810
+ "set:telegram.enabled:d": "skcセッションを双方向Telegramボットで制御",
811
+ "set:telegram.botToken:l": "ボットトークン",
812
+ "set:telegram.botToken:d": "@BotFatherから取得したTelegramボットトークン(有効化時に必須)",
813
+ "set:telegram.allowedUserIds:l": "許可されたユーザーID",
814
+ "set:telegram.allowedUserIds:d": "コマンドを送信できるTelegramユーザーID(カンマ区切り)",
815
+ "set:telegram.allowedChatIds:l": "許可されたチャットID",
816
+ "set:telegram.allowedChatIds:d": "コマンドを送信できるTelegramチャットID(カンマ区切り)",
817
+ "set:telegram.backend:l": "バックエンド",
818
+ "set:telegram.backend:d": "コーディネーター(マルチセッション)またはRPC(単一永続セッション)",
819
+ "set:telegram.backend:o:coordinator:l": "コーディネーター",
820
+ "set:telegram.backend:o:coordinator:d": "マルチセッションライフサイクル + 監視",
821
+ "set:telegram.backend:o:rpc:l": "RPC",
822
+ "set:telegram.backend:o:rpc:d": "単一永続セッションソケットにアタッチ/デタッチ",
823
+ "set:telegram.enableStop:l": "/stopを有効化",
824
+ "set:telegram.enableStop:d": "停止リクエストを許可(reportsミューテーションクラスを追加)",
825
+ "set:telegram.enableRich:l": "リッチメッセージ",
826
+ "set:telegram.enableRich:d": "HTMLフォーマット + インラインキーボード",
827
+ "set:telegram.enablePush:l": "プッシュ通知",
828
+ "set:telegram.enablePush:d": "コーディネーターイベント監視によるフォロー/ミュート購読",
829
+ "set:telegram.registerCommands:l": "ボットメニュー登録",
830
+ "set:telegram.registerCommands:d": "起動時にボットコマンドメニューを登録",
831
+ "set:telegram.presets:l": "セッションプリセット",
832
+ "set:telegram.presets:d": "{id, workdir, sessionCommand, taskTemplate?, taskMaxLen?} JSON配列",
833
+ "set:telegram.rpcSocket:l": "RPCソケット",
834
+ "set:telegram.rpcSocket:d": "skc launch --output rpc UNIXソケットパス(RPCバックエンド専用)",
835
+ "set:telegram.stateDir:l": "状態ディレクトリ",
836
+ "set:telegram.stateDir:d": "再接続/再同期用ゲートウェイ状態ディレクトリ(RPCバックエンド必須)",
809
837
  };
@@ -34,6 +34,7 @@ export const ja: Partial<Record<MsgKey, string>> = {
34
34
  "settings.tab.tools": "ツール",
35
35
  "settings.tab.tasks": "タスク",
36
36
  "settings.tab.providers": "プロバイダー",
37
+ "settings.tab.integrations": "統合",
37
38
 
38
39
  "settings.language.label": "言語",
39
40
  "settings.language.desc": "インターフェース言語。自動はシステムのロケールに従います。",
@@ -795,4 +795,32 @@ export const koSettings: Record<string, string> = {
795
795
  "cmd:move:d": "세션을 다른 작업 디렉터리로 이동",
796
796
  "cmd:exit:d": "애플리케이션 종료",
797
797
  "set:edit.fuzzyThreshold:d": "퍼지 매칭의 유사도 임계값",
798
+ "set:telegram.enabled:l": "텔레그램 리모트",
799
+ "set:telegram.enabled:d": "skc 세션을 양방향 텔레그램 봇으로 제어",
800
+ "set:telegram.botToken:l": "봇 토큰",
801
+ "set:telegram.botToken:d": "@BotFather에서 받은 텔레그램 봇 토큰 (활성화 시 필수)",
802
+ "set:telegram.allowedUserIds:l": "허용된 사용자 ID",
803
+ "set:telegram.allowedUserIds:d": "명령을 보낼 수 있는 텔레그램 사용자 ID (쉼표 구분)",
804
+ "set:telegram.allowedChatIds:l": "허용된 채팅 ID",
805
+ "set:telegram.allowedChatIds:d": "명령을 보낼 수 있는 텔레그램 채팅 ID (쉼표 구분)",
806
+ "set:telegram.backend:l": "백엔드",
807
+ "set:telegram.backend:d": "코디네이터 (다중 세션 수명주기) 또는 RPC (단일 영구 세션)",
808
+ "set:telegram.backend:o:coordinator:l": "코디네이터",
809
+ "set:telegram.backend:o:coordinator:d": "다중 세션 수명주기 + 관찰",
810
+ "set:telegram.backend:o:rpc:l": "RPC",
811
+ "set:telegram.backend:o:rpc:d": "단일 영구 세션 소켓에 연결/분리",
812
+ "set:telegram.enableStop:l": "/stop 활성화",
813
+ "set:telegram.enableStop:d": "정지 요청 허용 (reports 변경 클래스 추가)",
814
+ "set:telegram.enableRich:l": "리치 메시지",
815
+ "set:telegram.enableRich:d": "HTML 포맷팅 + 인라인 키보드",
816
+ "set:telegram.enablePush:l": "푸시 알림",
817
+ "set:telegram.enablePush:d": "코디네이터 이벤트 감시를 통한 팔로우/뮤트 구독",
818
+ "set:telegram.registerCommands:l": "봇 메뉴 등록",
819
+ "set:telegram.registerCommands:d": "시작 시 봇 명령 메뉴 등록",
820
+ "set:telegram.presets:l": "세션 프리셋",
821
+ "set:telegram.presets:d": "{id, workdir, sessionCommand, taskTemplate?, taskMaxLen?} JSON 배열",
822
+ "set:telegram.rpcSocket:l": "RPC 소켓",
823
+ "set:telegram.rpcSocket:d": "skc launch --output rpc UNIX 소켓 경로 (RPC 백엔드 전용)",
824
+ "set:telegram.stateDir:l": "상태 디렉터리",
825
+ "set:telegram.stateDir:d": "재연결/동기화용 게이트웨이 상태 디렉터리 (RPC 백엔드 필수)",
798
826
  };
@@ -34,6 +34,7 @@ export const ko: Partial<Record<MsgKey, string>> = {
34
34
  "settings.tab.tools": "도구",
35
35
  "settings.tab.tasks": "작업",
36
36
  "settings.tab.providers": "공급자",
37
+ "settings.tab.integrations": "연동",
37
38
 
38
39
  "settings.language.label": "언어",
39
40
  "settings.language.desc": "인터페이스 언어. 자동은 시스템 로케일을 따릅니다.",
@@ -776,4 +776,32 @@ export const zhSettings: Record<string, string> = {
776
776
  "cmd:move:d": "将会话移动到其他工作目录",
777
777
  "cmd:exit:d": "退出应用程序",
778
778
  "set:edit.fuzzyThreshold:d": "模糊匹配的相似度阈值",
779
+ "set:telegram.enabled:l": "Telegram远程",
780
+ "set:telegram.enabled:d": "通过双向Telegram机器人控制skc会话",
781
+ "set:telegram.botToken:l": "机器人令牌",
782
+ "set:telegram.botToken:d": "从@BotFather获取的Telegram机器人令牌(启用时必填)",
783
+ "set:telegram.allowedUserIds:l": "允许的用户ID",
784
+ "set:telegram.allowedUserIds:d": "可发送命令的Telegram用户ID(逗号分隔)",
785
+ "set:telegram.allowedChatIds:l": "允许的聊天ID",
786
+ "set:telegram.allowedChatIds:d": "可发送命令的Telegram聊天ID(逗号分隔)",
787
+ "set:telegram.backend:l": "后端",
788
+ "set:telegram.backend:d": "协调器(多会话生命周期)或RPC(单个持久会话)",
789
+ "set:telegram.backend:o:coordinator:l": "协调器",
790
+ "set:telegram.backend:o:coordinator:d": "多会话生命周期 + 观察",
791
+ "set:telegram.backend:o:rpc:l": "RPC",
792
+ "set:telegram.backend:o:rpc:d": "连接/断开单个持久会话套接字",
793
+ "set:telegram.enableStop:l": "启用/stop",
794
+ "set:telegram.enableStop:d": "允许停止请求(添加reports变更类)",
795
+ "set:telegram.enableRich:l": "富文本消息",
796
+ "set:telegram.enableRich:d": "HTML格式 + 内联键盘",
797
+ "set:telegram.enablePush:l": "推送通知",
798
+ "set:telegram.enablePush:d": "通过协调器事件监视的关注/静音订阅",
799
+ "set:telegram.registerCommands:l": "注册机器人菜单",
800
+ "set:telegram.registerCommands:d": "启动时注册机器人命令菜单",
801
+ "set:telegram.presets:l": "会话预设",
802
+ "set:telegram.presets:d": "{id, workdir, sessionCommand, taskTemplate?, taskMaxLen?} JSON数组",
803
+ "set:telegram.rpcSocket:l": "RPC套接字",
804
+ "set:telegram.rpcSocket:d": "skc launch --output rpc UNIX套接字路径(仅RPC后端)",
805
+ "set:telegram.stateDir:l": "状态目录",
806
+ "set:telegram.stateDir:d": "用于重连/重同步的网关状态目录(RPC后端必填)",
779
807
  };
@@ -34,6 +34,7 @@ export const zh: Partial<Record<MsgKey, string>> = {
34
34
  "settings.tab.tools": "工具",
35
35
  "settings.tab.tasks": "任务",
36
36
  "settings.tab.providers": "提供商",
37
+ "settings.tab.integrations": "集成",
37
38
 
38
39
  "settings.language.label": "语言",
39
40
  "settings.language.desc": "界面语言。自动模式跟随系统区域设置。",