@sayknow-cli/coding-agent 0.3.7 → 0.3.9

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 (272) hide show
  1. package/dist/types/append-only-mode.d.ts +31 -0
  2. package/dist/types/capability/rule.d.ts +8 -0
  3. package/dist/types/cli/completion-cli.d.ts +41 -0
  4. package/dist/types/cli/config-cli.d.ts +1 -0
  5. package/dist/types/cli/fixture-report.d.ts +20 -0
  6. package/dist/types/cli/fixture-report.test.d.ts +1 -0
  7. package/dist/types/cli/nofile-limit.d.ts +11 -0
  8. package/dist/types/cli/notify-cli.d.ts +7 -0
  9. package/dist/types/cli/update-cli.d.ts +22 -0
  10. package/dist/types/cli.d.ts +124 -1
  11. package/dist/types/commands/completion.d.ts +29 -0
  12. package/dist/types/commands/config.d.ts +3 -0
  13. package/dist/types/commands/deep-interview.d.ts +3 -0
  14. package/dist/types/config/file-lock.d.ts +7 -6
  15. package/dist/types/config/keybindings.d.ts +2 -2
  16. package/dist/types/config/model-profile-activation.d.ts +6 -0
  17. package/dist/types/config/model-profiles.d.ts +1 -0
  18. package/dist/types/config/settings-schema.d.ts +119 -1
  19. package/dist/types/config/settings.d.ts +8 -0
  20. package/dist/types/discovery/index.d.ts +1 -0
  21. package/dist/types/export/html/template.generated.d.ts +1 -1
  22. package/dist/types/export/ttsr.d.ts +14 -3
  23. package/dist/types/extensibility/extensions/runner.d.ts +2 -1
  24. package/dist/types/extensibility/extensions/types.d.ts +8 -0
  25. package/dist/types/goals/runtime.d.ts +1 -0
  26. package/dist/types/hooks/native-skill-hook.d.ts +12 -0
  27. package/dist/types/main.d.ts +4 -1
  28. package/dist/types/modes/components/assistant-message.d.ts +5 -1
  29. package/dist/types/modes/components/model-selector.d.ts +4 -0
  30. package/dist/types/modes/components/queued-message-selector.d.ts +12 -0
  31. package/dist/types/modes/components/settings-selector.d.ts +2 -0
  32. package/dist/types/modes/components/status-line.d.ts +9 -0
  33. package/dist/types/modes/components/thinking-selector.d.ts +2 -2
  34. package/dist/types/modes/controllers/command-controller.d.ts +1 -0
  35. package/dist/types/modes/controllers/event-controller.d.ts +5 -0
  36. package/dist/types/modes/controllers/input-controller.d.ts +1 -3
  37. package/dist/types/modes/controllers/selector-controller.d.ts +1 -0
  38. package/dist/types/modes/interactive-mode.d.ts +4 -0
  39. package/dist/types/modes/print-mode.d.ts +13 -1
  40. package/dist/types/modes/prompt-action-autocomplete.d.ts +1 -1
  41. package/dist/types/modes/rpc/rpc-mode.d.ts +1 -3
  42. package/dist/types/modes/rpc/rpc-socket-security.d.ts +3 -0
  43. package/dist/types/modes/rpc/rpc-types.d.ts +14 -0
  44. package/dist/types/modes/shared/agent-wire/event-contract.d.ts +19 -0
  45. package/dist/types/modes/shared/agent-wire/event-envelope.d.ts +23 -1
  46. package/dist/types/modes/types.d.ts +3 -0
  47. package/dist/types/modes/utils/injected-user-submission.d.ts +52 -0
  48. package/dist/types/modes/utils/ui-helpers.d.ts +1 -0
  49. package/dist/types/notifications/config-commands.d.ts +9 -0
  50. package/dist/types/notifications/config.d.ts +30 -1
  51. package/dist/types/notifications/daemon-paths.d.ts +1 -0
  52. package/dist/types/notifications/index.d.ts +8 -3
  53. package/dist/types/notifications/lifecycle-commands.d.ts +12 -3
  54. package/dist/types/notifications/lifecycle-control-runtime.d.ts +2 -1
  55. package/dist/types/notifications/reply-sent-store.d.ts +53 -0
  56. package/dist/types/notifications/rich-draft.d.ts +68 -0
  57. package/dist/types/notifications/rich-render.d.ts +90 -0
  58. package/dist/types/notifications/telegram-daemon.d.ts +45 -3
  59. package/dist/types/notifications/telegram-reference.d.ts +7 -5
  60. package/dist/types/notifications/threaded-render.d.ts +14 -0
  61. package/dist/types/runtime-api-key.d.ts +7 -0
  62. package/dist/types/sdk.d.ts +3 -0
  63. package/dist/types/session/agent-session.d.ts +61 -6
  64. package/dist/types/session/agent-storage.d.ts +1 -0
  65. package/dist/types/session/file-mention-pruning.d.ts +8 -0
  66. package/dist/types/session/messages.d.ts +4 -0
  67. package/dist/types/session/session-manager.d.ts +17 -1
  68. package/dist/types/skc-runtime/deep-interview-ambiguity.d.ts +39 -0
  69. package/dist/types/skc-runtime/deep-interview-recorder.d.ts +10 -1
  70. package/dist/types/skc-runtime/deep-interview-state.d.ts +17 -2
  71. package/dist/types/skc-runtime/session-state-sidecar.d.ts +7 -0
  72. package/dist/types/skc-runtime/state-writer.d.ts +3 -0
  73. package/dist/types/skc-runtime/tmux-common.d.ts +1 -0
  74. package/dist/types/skc-runtime/ultragoal-receipt-freshness.d.ts +42 -0
  75. package/dist/types/skc-runtime/ultragoal-runtime.d.ts +120 -13
  76. package/dist/types/skill-state/active-state.d.ts +18 -1
  77. package/dist/types/system-prompt.d.ts +18 -2
  78. package/dist/types/task/executor.d.ts +3 -0
  79. package/dist/types/task/fork-context-budget.d.ts +7 -0
  80. package/dist/types/task/token-log.d.ts +30 -0
  81. package/dist/types/task/token-log.test.d.ts +1 -0
  82. package/dist/types/tools/bisect.d.ts +81 -0
  83. package/dist/types/tools/computer.d.ts +2 -2
  84. package/dist/types/tools/index.d.ts +1 -0
  85. package/dist/types/tools/search.d.ts +2 -2
  86. package/dist/types/tools/ultragoal-ask-guard.d.ts +9 -2
  87. package/dist/types/utils/file-mentions.d.ts +14 -0
  88. package/dist/types/utils/git.d.ts +32 -0
  89. package/dist/types/utils/pasted-image-path.d.ts +30 -0
  90. package/dist/types/web/scrapers/youtube.d.ts +8 -0
  91. package/dist/types/workflow/workflow-intent-diff.d.ts +8 -2
  92. package/dist/types/workflow/workflow-intent-report-consumer.d.ts +50 -0
  93. package/dist/types/workflow/workflow-intent-report-schema.d.ts +2 -0
  94. package/dist/types/workflow/workflow-intent-report.d.ts +48 -0
  95. package/package.json +8 -8
  96. package/src/append-only-mode.ts +58 -0
  97. package/src/autoresearch/prompt.md +1 -1
  98. package/src/autoresearch/tools/log-experiment.ts +1 -1
  99. package/src/capability/rule.ts +9 -0
  100. package/src/cli/completion-cli.ts +234 -0
  101. package/src/cli/config-cli.ts +61 -9
  102. package/src/cli/fast-help.ts +1 -0
  103. package/src/cli/fixture-report.test.ts +230 -0
  104. package/src/cli/fixture-report.ts +171 -0
  105. package/src/cli/nofile-limit.ts +48 -0
  106. package/src/cli/notify-cli.ts +103 -17
  107. package/src/cli/telegram-cli.ts +1 -1
  108. package/src/cli/update-cli.ts +148 -33
  109. package/src/cli.ts +29 -1
  110. package/src/commands/completion.ts +84 -0
  111. package/src/commands/config.ts +2 -0
  112. package/src/commands/contribution-prep.ts +1 -1
  113. package/src/commands/deep-interview.ts +2 -1
  114. package/src/config/file-lock.ts +73 -34
  115. package/src/config/keybindings.ts +3 -3
  116. package/src/config/model-profile-activation.ts +65 -0
  117. package/src/config/model-profiles.ts +31 -2
  118. package/src/config/settings-schema.ts +76 -1
  119. package/src/config/settings.ts +22 -0
  120. package/src/defaults/skc/skills/team/SKILL.md +17 -14
  121. package/src/defaults/skc/skills/ultragoal/SKILL.md +59 -4
  122. package/src/defaults/skc/skills/ultragoal/pipeline-validation-contracts.md +30 -0
  123. package/src/defaults/skc-defaults.ts +9 -0
  124. package/src/discovery/helpers.ts +10 -0
  125. package/src/discovery/index.ts +1 -0
  126. package/src/export/html/template.generated.ts +1 -1
  127. package/src/export/html/template.js +60 -2
  128. package/src/export/ttsr.ts +96 -18
  129. package/src/extensibility/extensions/runner.ts +183 -219
  130. package/src/extensibility/extensions/types.ts +9 -0
  131. package/src/extensibility/skc-plugins/runtime-adapters.ts +156 -44
  132. package/src/goals/runtime.ts +10 -2
  133. package/src/hindsight/backend.ts +1 -3
  134. package/src/hooks/native-skill-hook.ts +124 -4
  135. package/src/internal-urls/docs-index.generated.ts +17 -8
  136. package/src/lsp/client.ts +1 -0
  137. package/src/main.ts +95 -43
  138. package/src/memories/index.ts +12 -1
  139. package/src/modes/components/assistant-message.ts +241 -82
  140. package/src/modes/components/custom-editor.ts +1 -0
  141. package/src/modes/components/footer.ts +7 -2
  142. package/src/modes/components/model-selector.ts +54 -11
  143. package/src/modes/components/queued-message-selector.ts +92 -0
  144. package/src/modes/components/settings-selector.ts +4 -0
  145. package/src/modes/components/status-line.ts +167 -54
  146. package/src/modes/components/thinking-selector.ts +10 -8
  147. package/src/modes/components/tool-execution.ts +44 -19
  148. package/src/modes/components/welcome.ts +181 -44
  149. package/src/modes/controllers/command-controller.ts +40 -4
  150. package/src/modes/controllers/event-controller.ts +77 -49
  151. package/src/modes/controllers/extension-ui-controller.ts +12 -11
  152. package/src/modes/controllers/input-controller.ts +192 -35
  153. package/src/modes/controllers/selector-controller.ts +168 -24
  154. package/src/modes/interactive-mode.ts +56 -16
  155. package/src/modes/print-mode.ts +43 -4
  156. package/src/modes/prompt-action-autocomplete.ts +21 -20
  157. package/src/modes/rpc/rpc-mode.ts +32 -12
  158. package/src/modes/rpc/rpc-socket-security.ts +13 -1
  159. package/src/modes/rpc/rpc-types.ts +9 -0
  160. package/src/modes/shared/agent-wire/command-validation.ts +4 -0
  161. package/src/modes/shared/agent-wire/event-contract.ts +22 -0
  162. package/src/modes/shared/agent-wire/event-envelope.ts +82 -0
  163. package/src/modes/shared/agent-wire/scopes.ts +1 -0
  164. package/src/modes/types.ts +3 -0
  165. package/src/modes/utils/hotkeys-markdown.ts +1 -0
  166. package/src/modes/utils/injected-user-submission.ts +94 -0
  167. package/src/modes/utils/ui-helpers.ts +20 -7
  168. package/src/notifications/config-commands.ts +20 -0
  169. package/src/notifications/config.ts +52 -5
  170. package/src/notifications/daemon-paths.ts +2 -0
  171. package/src/notifications/index.ts +144 -18
  172. package/src/notifications/lifecycle-commands.ts +74 -23
  173. package/src/notifications/lifecycle-control-runtime.ts +8 -3
  174. package/src/notifications/lifecycle-orchestrator.ts +19 -6
  175. package/src/notifications/reply-sent-store.ts +134 -0
  176. package/src/notifications/rich-draft.ts +107 -0
  177. package/src/notifications/rich-render.ts +142 -0
  178. package/src/notifications/telegram-daemon-control.ts +5 -3
  179. package/src/notifications/telegram-daemon.ts +606 -98
  180. package/src/notifications/telegram-reference.ts +17 -16
  181. package/src/notifications/threaded-render.ts +45 -2
  182. package/src/prompts/agents/architect.md +19 -10
  183. package/src/prompts/agents/critic.md +16 -18
  184. package/src/prompts/agents/executor.md +14 -11
  185. package/src/prompts/agents/planner.md +18 -13
  186. package/src/prompts/ci-green-request.md +3 -8
  187. package/src/prompts/goals/goal-continuation.md +0 -5
  188. package/src/prompts/goals/goal-mode-active.md +0 -5
  189. package/src/prompts/system/agent-creation-architect.md +2 -2
  190. package/src/prompts/system/plan-mode-active.md +1 -1
  191. package/src/prompts/system/plan-mode-subagent.md +3 -3
  192. package/src/prompts/system/project-prompt.md +0 -13
  193. package/src/prompts/system/subagent-system-prompt.md +3 -2
  194. package/src/prompts/system/system-prompt.md +29 -17
  195. package/src/prompts/system/volatile-project-context.md +10 -0
  196. package/src/prompts/system/web-search.md +4 -7
  197. package/src/prompts/tools/apply-patch.md +6 -0
  198. package/src/prompts/tools/ast-edit.md +1 -0
  199. package/src/prompts/tools/bash.md +1 -1
  200. package/src/prompts/tools/bisect.md +22 -0
  201. package/src/prompts/tools/browser.md +1 -1
  202. package/src/prompts/tools/computer.md +2 -2
  203. package/src/prompts/tools/cron.md +0 -2
  204. package/src/prompts/tools/eval.md +2 -2
  205. package/src/prompts/tools/find.md +1 -1
  206. package/src/prompts/tools/github.md +6 -6
  207. package/src/prompts/tools/goal.md +1 -3
  208. package/src/prompts/tools/image-gen.md +12 -5
  209. package/src/prompts/tools/irc.md +5 -4
  210. package/src/prompts/tools/job.md +2 -2
  211. package/src/prompts/tools/lsp.md +1 -1
  212. package/src/prompts/tools/monitor.md +2 -2
  213. package/src/prompts/tools/patch.md +2 -2
  214. package/src/prompts/tools/replace.md +2 -21
  215. package/src/prompts/tools/rewind.md +1 -1
  216. package/src/prompts/tools/search-tool-bm25.md +6 -11
  217. package/src/prompts/tools/search.md +1 -1
  218. package/src/prompts/tools/skill.md +3 -2
  219. package/src/prompts/tools/ssh.md +2 -1
  220. package/src/prompts/tools/subagent.md +2 -2
  221. package/src/prompts/tools/task.md +4 -5
  222. package/src/prompts/tools/todo-write.md +1 -1
  223. package/src/prompts/tools/vim.md +1 -0
  224. package/src/prompts/tools/web-search.md +2 -0
  225. package/src/prompts/tools/write.md +8 -2
  226. package/src/runtime-api-key.ts +16 -0
  227. package/src/sdk.ts +88 -36
  228. package/src/session/agent-session.ts +1013 -141
  229. package/src/session/agent-storage.ts +4 -0
  230. package/src/session/file-mention-pruning.ts +64 -0
  231. package/src/session/messages.ts +4 -0
  232. package/src/session/session-manager.ts +103 -4
  233. package/src/skc-runtime/deep-interview-ambiguity.ts +206 -0
  234. package/src/skc-runtime/deep-interview-recorder.ts +62 -8
  235. package/src/skc-runtime/deep-interview-state.ts +44 -2
  236. package/src/skc-runtime/session-state-sidecar.ts +263 -20
  237. package/src/skc-runtime/state-runtime.ts +12 -2
  238. package/src/skc-runtime/state-writer.ts +15 -0
  239. package/src/skc-runtime/tmux-common.ts +1 -0
  240. package/src/skc-runtime/ultragoal-guard.ts +55 -66
  241. package/src/skc-runtime/ultragoal-receipt-freshness.ts +315 -0
  242. package/src/skc-runtime/ultragoal-runtime.ts +1672 -159
  243. package/src/skc-runtime/workflow-manifest.generated.json +113 -2
  244. package/src/skc-runtime/workflow-manifest.ts +74 -1
  245. package/src/skill-state/active-state.ts +141 -5
  246. package/src/skill-state/deep-interview-mutation-guard.ts +67 -3
  247. package/src/slash-commands/builtin-registry.ts +296 -72
  248. package/src/system-prompt.ts +57 -16
  249. package/src/task/executor.ts +132 -24
  250. package/src/task/fork-context-advisory.ts +2 -7
  251. package/src/task/fork-context-budget.ts +9 -0
  252. package/src/task/index.ts +13 -6
  253. package/src/task/output-manager.ts +20 -8
  254. package/src/task/receipt.ts +26 -7
  255. package/src/task/token-log.test.ts +188 -0
  256. package/src/task/token-log.ts +179 -0
  257. package/src/tools/bisect.ts +367 -0
  258. package/src/tools/computer.ts +246 -43
  259. package/src/tools/index.ts +3 -0
  260. package/src/tools/output-meta.ts +116 -4
  261. package/src/tools/search.ts +8 -2
  262. package/src/tools/skill.ts +15 -0
  263. package/src/tools/telegram-send.ts +6 -0
  264. package/src/tools/ultragoal-ask-guard.ts +39 -5
  265. package/src/utils/file-mentions.ts +39 -7
  266. package/src/utils/git.ts +73 -0
  267. package/src/utils/pasted-image-path.ts +170 -0
  268. package/src/web/scrapers/youtube.ts +24 -12
  269. package/src/workflow/workflow-intent-diff.ts +29 -6
  270. package/src/workflow/workflow-intent-report-consumer.ts +221 -0
  271. package/src/workflow/workflow-intent-report-schema.ts +129 -0
  272. package/src/workflow/workflow-intent-report.ts +135 -0
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Single source of truth for append-only context-mode resolution and manager
3
+ * construction. Both the initial session build (`sdk.ts`) and the runtime
4
+ * model/setting-change path (`agent-session.ts`), plus the status UI, resolve
5
+ * through here so the auto allowlist and prefix-reset diagnostics never drift.
6
+ */
7
+ import { AppendOnlyContextManager } from "@sayknow-cli/agent-core";
8
+ /**
9
+ * Providers for which append-only context auto-enables. Exact provider-string
10
+ * match only: `anthropic` reached via a gateway/aggregator provider string
11
+ * (e.g. `openrouter`, a custom gateway) does NOT match and stays opt-in via
12
+ * `provider.appendOnlyContext: "on"`, because those transports can rewrite or
13
+ * renormalize the request in ways that have not been validated for append-only
14
+ * prefix stability.
15
+ */
16
+ export declare function providerSupportsAppendOnlyAuto(provider: string): boolean;
17
+ /**
18
+ * Resolve whether to enable append-only context mode based on the setting and provider.
19
+ *
20
+ * - `"on"` → always enable
21
+ * - `"off"` → never enable
22
+ * - `"auto"` → enable for providers with strong prompt-prefix caching that this
23
+ * harness has validated (see {@link providerSupportsAppendOnlyAuto})
24
+ */
25
+ export declare function resolveAppendOnlyMode(setting: "auto" | "on" | "off" | undefined, provider: string): boolean;
26
+ /**
27
+ * Construct an {@link AppendOnlyContextManager} wired to emit per-session
28
+ * stable-prefix reset diagnostics. Use this at every creation site so the
29
+ * telemetry is uniform.
30
+ */
31
+ export declare function createAppendOnlyContextManager(provider: string | undefined): AppendOnlyContextManager;
@@ -12,6 +12,10 @@ export interface RuleFrontmatter {
12
12
  scope?: string | string[];
13
13
  /** Per-rule TTSR interrupt mode override. */
14
14
  interruptMode?: "never" | "prose-only" | "tool-only" | "always";
15
+ /** Per-rule TTSR repeat mode override. */
16
+ repeatMode?: "once" | "after-gap";
17
+ /** Per-rule TTSR repeat gap override. */
18
+ repeatGap?: number;
15
19
  [key: string]: unknown;
16
20
  }
17
21
  /**
@@ -36,6 +40,10 @@ export interface Rule {
36
40
  scope?: string[];
37
41
  /** Per-rule TTSR interrupt mode override (falls back to global ttsr.interruptMode). */
38
42
  interruptMode?: "never" | "prose-only" | "tool-only" | "always";
43
+ /** Per-rule TTSR repeat mode override (falls back to global ttsr.repeatMode). */
44
+ repeatMode?: "once" | "after-gap";
45
+ /** Per-rule TTSR repeat gap override (falls back to global ttsr.repeatGap). */
46
+ repeatGap?: number;
39
47
  /** Source metadata */
40
48
  _source: SourceMeta;
41
49
  }
@@ -0,0 +1,41 @@
1
+ import type { CommandCtor, CommandEntry } from "@sayknow-cli/utils/cli";
2
+ export type FigName = string | string[];
3
+ export interface FigArg {
4
+ name: string;
5
+ description?: string;
6
+ isOptional?: boolean;
7
+ isVariadic?: boolean;
8
+ suggestions?: string[];
9
+ }
10
+ export interface FigOption {
11
+ name: FigName;
12
+ description?: string;
13
+ args?: FigArg;
14
+ isRepeatable?: boolean;
15
+ }
16
+ export interface FigSubcommand {
17
+ name: FigName;
18
+ description?: string;
19
+ options?: FigOption[];
20
+ args?: FigArg | FigArg[];
21
+ }
22
+ export interface FigSpec extends FigSubcommand {
23
+ name: string;
24
+ subcommands?: FigSubcommand[];
25
+ }
26
+ export type InshellisenseIndexStatus = "created" | "updated" | "already-compatible" | "overwritten";
27
+ export interface InstallSkcInshellisenseSpecOptions {
28
+ dir?: string;
29
+ force?: boolean;
30
+ }
31
+ export interface InstallSkcInshellisenseSpecResult {
32
+ directory: string;
33
+ specPath: string;
34
+ indexPath: string;
35
+ indexStatus: InshellisenseIndexStatus;
36
+ }
37
+ export declare function defaultInshellisenseSpecDir(homeDir?: string): string;
38
+ export declare function buildSkcFigSpec(entries: CommandEntry[], rootCommandOverride?: CommandCtor): Promise<FigSpec>;
39
+ export declare function renderFigSpecModule(spec: FigSpec): string;
40
+ export declare function renderInshellisenseIndexModule(): string;
41
+ export declare function installSkcInshellisenseSpec(spec: FigSpec, options?: InstallSkcInshellisenseSpecOptions): Promise<InstallSkcInshellisenseSpecResult>;
@@ -11,6 +11,7 @@ export interface ConfigCommandArgs {
11
11
  value?: string;
12
12
  flags: {
13
13
  json?: boolean;
14
+ showSecrets?: boolean;
14
15
  };
15
16
  }
16
17
  /**
@@ -0,0 +1,20 @@
1
+ import type { TaskTokenLog } from "../task/types";
2
+ export interface LiveRunReportShape {
3
+ schemaVersion: 1;
4
+ binaryId: string;
5
+ fixtureId: string;
6
+ totals: {
7
+ turns: number;
8
+ inputTokens: number;
9
+ outputTokens: number;
10
+ cacheReadTokens: number;
11
+ cacheWriteTokens: number;
12
+ totalTokens: number;
13
+ };
14
+ cacheHitRate: number | null;
15
+ receiptArtifactRatio: number | null;
16
+ spawnDecisions: number | null;
17
+ roi: number | null;
18
+ }
19
+ export declare function buildFixtureReport(fixtureId: string, logs: readonly TaskTokenLog[]): LiveRunReportShape;
20
+ export declare function runFixtureReport(fixtureId: string): Promise<number>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,11 @@
1
+ import { execFileSync } from "node:child_process";
2
+ export declare const RECOMMENDED_MACOS_NOFILE_LIMIT = 4096;
3
+ export declare function parseNoFileLimit(text: string): number | undefined;
4
+ export declare function buildMacOSNoFileLimitWarning(currentLimit: number): string;
5
+ export interface WarnIfMacOSNoFileLimitTooLowDeps {
6
+ platform?: NodeJS.Platform;
7
+ env?: NodeJS.ProcessEnv;
8
+ execFileSync?: typeof execFileSync;
9
+ writeStderr?: (text: string) => void;
10
+ }
11
+ export declare function warnIfMacOSNoFileLimitTooLow(deps?: WarnIfMacOSNoFileLimitTooLowDeps): void;
@@ -22,4 +22,11 @@ export interface NotifyCommandDeps {
22
22
  }
23
23
  export declare function parseNotifyArgs(args: string[]): NotifyCommandArgs | undefined;
24
24
  export declare function runNotifyCommand(cmd: NotifyCommandArgs, deps?: NotifyCommandDeps): Promise<void>;
25
+ type TokenPromptInput = NodeJS.ReadStream & {
26
+ isRaw?: boolean;
27
+ setRawMode?: (mode: boolean) => unknown;
28
+ };
29
+ type TokenPromptOutput = Pick<NodeJS.WriteStream, "write">;
30
+ export declare function promptForToken(input?: TokenPromptInput, output?: TokenPromptOutput): Promise<string>;
25
31
  export declare function printNotifyHelp(): void;
32
+ export {};
@@ -53,6 +53,28 @@ export declare function formatVerificationFailureForTest(result: InstalledVersio
53
53
  */
54
54
  export declare function replaceBinaryForUpdate(options: BinaryReplacementOptions): Promise<InstalledVersionVerification>;
55
55
  export declare function runPackageManagerUpdateForTest(options: PackageManagerUpdateOptions): Promise<InstalledVersionVerification>;
56
+ export declare function fsyncFileForTest(filePath: string): Promise<void>;
57
+ /** Injectable steps of the binary update flow (seams for testing ordering). */
58
+ export interface BinaryUpdateFlow {
59
+ download(url: string, tempPath: string): Promise<void>;
60
+ fsync(filePath: string): Promise<void>;
61
+ replace(options: BinaryReplacementOptions): Promise<InstalledVersionVerification>;
62
+ verifyInstalledVersion(expectedVersion: string): Promise<InstalledVersionVerification>;
63
+ /** Best-effort cleanup of the temp file when the flow aborts before replace. */
64
+ removeTemp?(filePath: string): Promise<void>;
65
+ /** Called once fsync has succeeded, right before replacement begins. */
66
+ beforeReplace?(): void;
67
+ }
68
+ /**
69
+ * Orchestrate download → fsync → replace → verify with a strict ordering
70
+ * contract: the downloaded temp binary MUST be flushed to stable storage
71
+ * before it is published (renamed into place) or exec'd for verification.
72
+ *
73
+ * If fsync fails the temp bytes are not durable, so we abort before
74
+ * replacement/verification and clean up the temp file rather than installing a
75
+ * possibly-truncated binary.
76
+ */
77
+ export declare function runBinaryUpdateFlow(targetPath: string, url: string, expectedVersion: string, flow: BinaryUpdateFlow): Promise<InstalledVersionVerification>;
56
78
  /**
57
79
  * Run the update command.
58
80
  */
@@ -3,7 +3,130 @@
3
3
  * CLI entry point — registers all commands explicitly and delegates to the
4
4
  * lightweight CLI runner from pi-utils.
5
5
  */
6
- import { type CommandEntry } from "@sayknow-cli/utils/cli";
6
+ import { Command, type CommandEntry } from "@sayknow-cli/utils/cli";
7
7
  export declare const commands: CommandEntry[];
8
+ export declare class RootHelpCommand extends Command {
9
+ static description: string;
10
+ static hidden: boolean;
11
+ static args: {
12
+ messages: import("@sayknow-cli/utils/cli").ArgDescriptor & {
13
+ description: string;
14
+ required: false;
15
+ multiple: true;
16
+ };
17
+ };
18
+ static flags: {
19
+ model: import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
20
+ description: string;
21
+ };
22
+ smol: import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
23
+ description: string;
24
+ };
25
+ slow: import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
26
+ description: string;
27
+ };
28
+ plan: import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
29
+ description: string;
30
+ };
31
+ mpreset: import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
32
+ description: string;
33
+ };
34
+ default: import("@sayknow-cli/utils/cli").FlagDescriptor<"boolean"> & {
35
+ description: string;
36
+ };
37
+ provider: import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
38
+ description: string;
39
+ };
40
+ "api-key": import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
41
+ description: string;
42
+ };
43
+ "system-prompt": import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
44
+ description: string;
45
+ };
46
+ "append-system-prompt": import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
47
+ description: string;
48
+ };
49
+ "allow-home": import("@sayknow-cli/utils/cli").FlagDescriptor<"boolean"> & {
50
+ description: string;
51
+ };
52
+ mode: import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
53
+ description: string;
54
+ options: string[];
55
+ };
56
+ print: import("@sayknow-cli/utils/cli").FlagDescriptor<"boolean"> & {
57
+ char: string;
58
+ description: string;
59
+ };
60
+ continue: import("@sayknow-cli/utils/cli").FlagDescriptor<"boolean"> & {
61
+ char: string;
62
+ description: string;
63
+ };
64
+ resume: import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
65
+ char: string;
66
+ description: string;
67
+ };
68
+ "session-dir": import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
69
+ description: string;
70
+ };
71
+ "no-session": import("@sayknow-cli/utils/cli").FlagDescriptor<"boolean"> & {
72
+ description: string;
73
+ };
74
+ models: import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
75
+ description: string;
76
+ };
77
+ "no-tools": import("@sayknow-cli/utils/cli").FlagDescriptor<"boolean"> & {
78
+ description: string;
79
+ };
80
+ "no-lsp": import("@sayknow-cli/utils/cli").FlagDescriptor<"boolean"> & {
81
+ description: string;
82
+ };
83
+ "no-pty": import("@sayknow-cli/utils/cli").FlagDescriptor<"boolean"> & {
84
+ description: string;
85
+ };
86
+ tmux: import("@sayknow-cli/utils/cli").FlagDescriptor<"boolean"> & {
87
+ description: string;
88
+ };
89
+ tools: import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
90
+ description: string;
91
+ };
92
+ thinking: import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
93
+ description: string;
94
+ options: string[];
95
+ };
96
+ hook: import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
97
+ description: string;
98
+ multiple: true;
99
+ };
100
+ extension: import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
101
+ char: string;
102
+ description: string;
103
+ multiple: true;
104
+ };
105
+ "no-extensions": import("@sayknow-cli/utils/cli").FlagDescriptor<"boolean"> & {
106
+ description: string;
107
+ };
108
+ "no-skills": import("@sayknow-cli/utils/cli").FlagDescriptor<"boolean"> & {
109
+ description: string;
110
+ };
111
+ skills: import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
112
+ description: string;
113
+ };
114
+ "no-rules": import("@sayknow-cli/utils/cli").FlagDescriptor<"boolean"> & {
115
+ description: string;
116
+ };
117
+ export: import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
118
+ description: string;
119
+ };
120
+ "list-models": import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
121
+ description: string;
122
+ };
123
+ "no-title": import("@sayknow-cli/utils/cli").FlagDescriptor<"boolean"> & {
124
+ description: string;
125
+ };
126
+ };
127
+ static examples: string[];
128
+ static strict: boolean;
129
+ run(): Promise<void>;
130
+ }
8
131
  /** Run the CLI with the given argv (no `process.argv` prefix). */
9
132
  export declare function runCli(argv: string[]): Promise<void>;
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Generate shell completion specs for external completion engines.
3
+ */
4
+ import { Command } from "@sayknow-cli/utils/cli";
5
+ export default class Completion extends Command {
6
+ static description: string;
7
+ static args: {
8
+ target: import("@sayknow-cli/utils/cli").ArgDescriptor & {
9
+ description: string;
10
+ required: false;
11
+ options: readonly ["inshellisense", "fig"];
12
+ };
13
+ };
14
+ static flags: {
15
+ install: import("@sayknow-cli/utils/cli").FlagDescriptor<"boolean"> & {
16
+ description: string;
17
+ };
18
+ dir: import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
19
+ description: string;
20
+ };
21
+ force: import("@sayknow-cli/utils/cli").FlagDescriptor<"boolean"> & {
22
+ description: string;
23
+ };
24
+ json: import("@sayknow-cli/utils/cli").FlagDescriptor<"boolean"> & {
25
+ description: string;
26
+ };
27
+ };
28
+ run(): Promise<void>;
29
+ }
@@ -25,6 +25,9 @@ export default class Config extends Command {
25
25
  json: import("@sayknow-cli/utils/cli").FlagDescriptor<"boolean"> & {
26
26
  description: string;
27
27
  };
28
+ "show-secrets": import("@sayknow-cli/utils/cli").FlagDescriptor<"boolean"> & {
29
+ description: string;
30
+ };
28
31
  };
29
32
  run(): Promise<void>;
30
33
  }
@@ -12,6 +12,9 @@ export default class DeepInterview extends Command {
12
12
  deep: import("@sayknow-cli/utils/cli").FlagDescriptor<"boolean"> & {
13
13
  description: string;
14
14
  };
15
+ trace: import("@sayknow-cli/utils/cli").FlagDescriptor<"boolean"> & {
16
+ description: string;
17
+ };
15
18
  threshold: import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
16
19
  description: string;
17
20
  };
@@ -13,16 +13,17 @@ export interface FileLockOwnerToken {
13
13
  pid: number;
14
14
  timestamp: number;
15
15
  }
16
- /** Outcome of a guarded GC removal attempt (`removeFileLockDirForGc`). */
16
+ /** Outcome of a guarded lock-dir removal attempt (`removeFileLockDirForGc`). */
17
17
  export type FileLockGcRemoval = "removed" | "owner_changed" | "missing";
18
18
  /**
19
19
  * @internal
20
- * Fail-closed removal of a dead lock dir for GC. Re-reads the on-disk owner
21
- * token as close to the unlink as possible and only deletes the dir when it
22
- * STILL holds the exact `{pid, timestamp}` identity the caller observed dead.
20
+ * Fail-closed removal of a lock dir whose owner is expected to be dead or
21
+ * finished. Re-reads the on-disk owner token as close to the unlink as possible
22
+ * and only deletes the dir when it STILL holds the exact `{pid, timestamp}`
23
+ * identity the caller observed.
23
24
  *
24
- * Closes the prune-time TOCTOU window (#606): between GC's dead re-read/probe
25
- * and the unlink, a live process can reclaim a stale lock at the same path
25
+ * Closes stale-cleanup TOCTOU windows (#606): between a dead/stale re-read and
26
+ * the unlink, a live process can reclaim a stale lock at the same path
26
27
  * (`acquireLock` rms the stale dir, then re-`mkdir`s and rewrites `info` with a
27
28
  * fresh pid+timestamp). Deleting by path alone would reap that LIVE lock. Any
28
29
  * mismatch (`owner_changed`) or absent/unreadable info (`missing` — e.g. a
@@ -244,8 +244,8 @@ export declare const KEYBINDINGS: {
244
244
  readonly description: "Queue message for next turn";
245
245
  };
246
246
  readonly "app.message.dequeue": {
247
- readonly defaultKeys: "alt+up";
248
- readonly description: "Dequeue message";
247
+ readonly defaultKeys: ["alt+up", "alt+down"];
248
+ readonly description: "Select queued message to edit";
249
249
  };
250
250
  readonly "app.clipboard.pasteImage": {
251
251
  readonly defaultKeys: "alt+v" | "ctrl+v";
@@ -46,7 +46,13 @@ export interface MaterializeModelProfileAssignmentOptions {
46
46
  role: SkcModelAssignmentTargetId;
47
47
  selector: string;
48
48
  }
49
+ export interface MaterializeModelProfileAssignmentsOptions {
50
+ session: Pick<ModelProfileActivationSession, "model" | "thinkingLevel" | "setActiveModelProfile" | "getActiveModelProfile">;
51
+ settings: Pick<Settings, "clearOverride" | "get" | "override" | "set">;
52
+ assignments: ReadonlyMap<SkcModelAssignmentTargetId, string> | Partial<Record<SkcModelAssignmentTargetId, string>>;
53
+ }
49
54
  export declare function materializeActiveModelProfileAssignment(options: MaterializeModelProfileAssignmentOptions): boolean;
55
+ export declare function materializeActiveModelProfileAssignments(options: MaterializeModelProfileAssignmentsOptions): boolean;
50
56
  export declare function formatModelProfileCredentialError(profileName: string, providers: readonly string[]): string;
51
57
  export declare function prepareModelProfileActivation(options: PrepareModelProfileActivationOptions): Promise<PreparedModelProfileActivation>;
52
58
  export declare function applyPreparedModelProfileActivation(prepared: PreparedModelProfileActivation, options?: {
@@ -31,6 +31,7 @@ export interface ModelProfilePresentation {
31
31
  providerGroup: string;
32
32
  }
33
33
  export declare function getModelProfilePresentation(profile: string | Pick<ModelProfileDefinition, "name" | "displayName">): ModelProfilePresentation;
34
+ export declare function formatModelProfileDisplayLabel(profile: Pick<ModelProfileDefinition, "name" | "displayName">): string;
34
35
  export declare function groupModelProfilesForPresetLanding(profiles: ReadonlyMap<string, ModelProfileDefinition>): Map<string, ModelProfileDefinition[]>;
35
36
  export declare function recommendModelProfileForProvider(providerId: string, profiles: ReadonlyMap<string, ModelProfileDefinition>): ModelProfileDefinition | undefined;
36
37
  export declare function mergeModelProfiles(userProfiles?: ModelsConfig["profiles"]): Map<string, ModelProfileDefinition>;
@@ -130,6 +130,14 @@ export declare const SETTINGS_SCHEMA: {
130
130
  readonly type: "string";
131
131
  readonly default: undefined;
132
132
  };
133
+ readonly "notifications.telegram.rich.enabled": {
134
+ readonly type: "boolean";
135
+ readonly default: true;
136
+ };
137
+ readonly "notifications.telegram.richDraft.enabled": {
138
+ readonly type: "boolean";
139
+ readonly default: false;
140
+ };
133
141
  readonly "notifications.discord.botToken": {
134
142
  readonly type: "string";
135
143
  readonly default: undefined;
@@ -563,6 +571,66 @@ export declare const SETTINGS_SCHEMA: {
563
571
  }];
564
572
  };
565
573
  };
574
+ readonly "tools.readArtifactSpillThreshold": {
575
+ readonly type: "number";
576
+ readonly default: 0;
577
+ readonly ui: {
578
+ readonly tab: "tools";
579
+ readonly label: "Experimental read-tool artifact spill threshold (KB)";
580
+ readonly description: "Advanced opt-in only: combined-size cap for `read` output across all requested ranges. Above this the full output is saved as an artifact and a bounded head+tail snippet is kept inline. Live layofflabs/gpt-5.5 medium evidence on 2026-07-07 found no token savings and a lower cache-hit rate at 50 KB, so normal coding sessions should leave this Off unless intentionally measuring large-read behavior.";
581
+ readonly options: readonly [{
582
+ readonly value: "0";
583
+ readonly label: "Off";
584
+ readonly description: "Default; no read-specific spill (backstop only)";
585
+ }, {
586
+ readonly value: "50";
587
+ readonly label: "50 KB";
588
+ readonly description: "~12.5K tokens";
589
+ }, {
590
+ readonly value: "100";
591
+ readonly label: "100 KB";
592
+ readonly description: "~25K tokens";
593
+ }, {
594
+ readonly value: "256";
595
+ readonly label: "256 KB";
596
+ readonly description: "~64K tokens";
597
+ }, {
598
+ readonly value: "512";
599
+ readonly label: "512 KB";
600
+ readonly description: "~128K tokens";
601
+ }, {
602
+ readonly value: "1000";
603
+ readonly label: "1 MB";
604
+ readonly description: "~250K tokens";
605
+ }];
606
+ };
607
+ };
608
+ readonly "tools.fileMentionInlineBytes": {
609
+ readonly type: "number";
610
+ readonly default: 20;
611
+ readonly ui: {
612
+ readonly tab: "tools";
613
+ readonly label: "File-mention inline cap (KB)";
614
+ readonly description: "Inline byte cap for auto-read `@path` file mentions, deliberately below the read-tool cap so an incidental mention injects a smaller snippet than an explicit read. The full file is still available via the read tool.";
615
+ readonly options: readonly [{
616
+ readonly value: "5";
617
+ readonly label: "5 KB";
618
+ readonly description: "~1.25K tokens";
619
+ }, {
620
+ readonly value: "10";
621
+ readonly label: "10 KB";
622
+ readonly description: "~2.5K tokens";
623
+ }, {
624
+ readonly value: "20";
625
+ readonly label: "20 KB";
626
+ readonly description: "Default; ~5K tokens";
627
+ }, {
628
+ readonly value: "50";
629
+ readonly label: "50 KB";
630
+ readonly description: "~12.5K tokens (matches read cap)";
631
+ }];
632
+ };
633
+ };
566
634
  readonly "tools.artifactTailBytes": {
567
635
  readonly type: "number";
568
636
  readonly default: 20;
@@ -724,6 +792,40 @@ export declare const SETTINGS_SCHEMA: {
724
792
  }];
725
793
  };
726
794
  };
795
+ readonly "tools.maxInlineResultBytes": {
796
+ readonly type: "number";
797
+ readonly default: 0;
798
+ readonly ui: {
799
+ readonly tab: "tools";
800
+ readonly label: "Max inline tool-result size (KB)";
801
+ readonly description: "Absolute backstop cap on inline tool-result text, enforced after artifact spill for every tool (including read and tools that set their own partial artifact meta). Output above this size is force-saved as an artifact and truncated to head+tail. 0 disables (default; opt-in pending measurement).";
802
+ readonly options: readonly [{
803
+ readonly value: "0";
804
+ readonly label: "Off";
805
+ readonly description: "Disabled; no absolute inline cap";
806
+ }, {
807
+ readonly value: "20";
808
+ readonly label: "20 KB";
809
+ readonly description: "~5K tokens";
810
+ }, {
811
+ readonly value: "30";
812
+ readonly label: "30 KB";
813
+ readonly description: "~7.5K tokens";
814
+ }, {
815
+ readonly value: "50";
816
+ readonly label: "50 KB";
817
+ readonly description: "~12.5K tokens";
818
+ }, {
819
+ readonly value: "75";
820
+ readonly label: "75 KB";
821
+ readonly description: "~19K tokens";
822
+ }, {
823
+ readonly value: "100";
824
+ readonly label: "100 KB";
825
+ readonly description: "~25K tokens";
826
+ }];
827
+ };
828
+ };
727
829
  readonly "statusLine.showHookStatus": {
728
830
  readonly type: "boolean";
729
831
  readonly default: false;
@@ -1689,6 +1791,14 @@ export declare const SETTINGS_SCHEMA: {
1689
1791
  readonly type: "string";
1690
1792
  readonly default: undefined;
1691
1793
  };
1794
+ readonly "compaction.maintenancePruningEnabled": {
1795
+ readonly type: "boolean";
1796
+ readonly default: false;
1797
+ };
1798
+ readonly "compaction.maintenancePruningMinSavingsTokens": {
1799
+ readonly type: "number";
1800
+ readonly default: 8000;
1801
+ };
1692
1802
  readonly "compaction.idleEnabled": {
1693
1803
  readonly type: "boolean";
1694
1804
  readonly default: false;
@@ -2044,7 +2154,7 @@ export declare const SETTINGS_SCHEMA: {
2044
2154
  readonly ui: {
2045
2155
  readonly tab: "context";
2046
2156
  readonly label: "TTSR Context Mode";
2047
- readonly description: "What to do with partial output when TTSR triggers";
2157
+ readonly description: "What to do with partial output when TTSR triggers. 'discard' (recommended) drops the aborted partial turn so it never accumulates in context. 'keep' retains every aborted partial turn, which grows the token footprint each time a rule fires \u2014 prefer 'discard' unless you specifically need the partial output.";
2048
2158
  };
2049
2159
  };
2050
2160
  readonly "ttsr.interruptMode": {
@@ -3890,6 +4000,8 @@ export interface CompactionSettings {
3890
4000
  autoContinue: boolean;
3891
4001
  remoteEnabled: boolean;
3892
4002
  remoteEndpoint: string | undefined;
4003
+ maintenancePruningEnabled: boolean;
4004
+ maintenancePruningMinSavingsTokens: number;
3893
4005
  idleEnabled: boolean;
3894
4006
  idleThresholdTokens: number;
3895
4007
  idleTimeoutSeconds: number;
@@ -3998,6 +4110,12 @@ export interface NotificationsSettings {
3998
4110
  telegram: {
3999
4111
  botToken: string | undefined;
4000
4112
  chatId: string | undefined;
4113
+ rich: {
4114
+ enabled: boolean;
4115
+ };
4116
+ richDraft: {
4117
+ enabled: boolean;
4118
+ };
4001
4119
  };
4002
4120
  discord: {
4003
4121
  botToken: string | undefined;
@@ -108,6 +108,14 @@ export declare class Settings {
108
108
  * Set a model role (helper for modelRoles record).
109
109
  */
110
110
  setModelRole(role: ModelRole | string, modelId: string): void;
111
+ /**
112
+ * Set an agent model override while keeping any live runtime override aligned.
113
+ *
114
+ * Runtime model profiles override `task.agentModelOverrides` for the current
115
+ * session. A user-selected role assignment must win immediately in that same
116
+ * session, but only the explicit agent change should be persisted.
117
+ */
118
+ setAgentModelOverride(agentName: string, modelId: string): void;
111
119
  /**
112
120
  * Get a model role (helper for modelRoles record).
113
121
  */
@@ -20,6 +20,7 @@ import "../capability/system-prompt";
20
20
  import "../capability/tool";
21
21
  import "./agents-md";
22
22
  import "./builtin";
23
+ import "./claude-plugins";
23
24
  import "./cline";
24
25
  import "./agents";
25
26
  import "./cursor";