@symerian/symi 3.5.6 → 3.5.8

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 (45) hide show
  1. package/dist/{agent-scope-B1Ina6jV.js → agent-scope-DnJEvgMH.js} +2 -2
  2. package/dist/{auth-profiles-BSw0aQND.js → auth-profiles-DVc0P8H7.js} +3 -3
  3. package/dist/build-info.json +3 -3
  4. package/dist/bundled/boot-md/handler.js +31 -31
  5. package/dist/bundled/bootstrap-extra-files/handler.js +4 -4
  6. package/dist/bundled/session-memory/handler.js +30 -30
  7. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  8. package/dist/{chrome-OTJg3QKn.js → chrome-Bu0sk8jc.js} +3 -3
  9. package/dist/{chunk-BkYIP_hB.js → chunk-DBVjqPm2.js} +1 -1
  10. package/dist/{commands-registry-BuOUfpmg.js → commands-registry-yWbIOOoD.js} +4 -4
  11. package/dist/{consolidate-Dyh_aESo.js → consolidate-JptFSFxz.js} +2 -2
  12. package/dist/control-ui/css/style.css +14 -0
  13. package/dist/control-ui/js/app.js +8 -0
  14. package/dist/control-ui/js/slash-autocomplete.js +195 -43
  15. package/dist/{deliver-BiWlR84Y.js → deliver-BZ-5d1Pv.js} +15 -15
  16. package/dist/{diagnostic-BALvP9wI.js → diagnostic-BlK1QQVx.js} +1 -1
  17. package/dist/{frontmatter-CJEX1BrH.js → frontmatter-Dm9ehpNF.js} +2 -2
  18. package/dist/llm-slug-generator.js +30 -30
  19. package/dist/{local-roots-C7fBKoOI.js → local-roots-Ab2ch8iw.js} +3 -3
  20. package/dist/{manager-CpBJ1BE6.js → manager-_ZfCrpDq.js} +8 -8
  21. package/dist/{manifest-registry-BGJu2aC-.js → manifest-registry-B1g2QOPw.js} +1 -1
  22. package/dist/{markdown-tables-CGqX2WvO.js → markdown-tables-CVcd6XRG.js} +1 -1
  23. package/dist/{model-selection-BqshlIZc.js → model-selection-C_XFh0kf.js} +1 -1
  24. package/dist/{pi-auth-json-DCGR3yfh.js → pi-auth-json-BxGRaPJK.js} +2 -2
  25. package/dist/{plugins-B06cTFHC.js → plugins-BcGFMr_d.js} +1 -1
  26. package/dist/{pw-ai-DY_6l11g.js → pw-ai-B5v5n5ol.js} +9 -9
  27. package/dist/{qmd-manager-Bc7yrt9d.js → qmd-manager-CM1Zb2vR.js} +5 -5
  28. package/dist/{registry-C-JddWwo.js → registry-9AaJQms1.js} +2 -2
  29. package/dist/{replies-D0FYSIJg.js → replies-Rf4NZFNR.js} +3 -3
  30. package/dist/{reply-prefix-D0NzzC4I.js → reply-prefix-kh8vLHcr.js} +1 -1
  31. package/dist/{resolve-route-CDsQda0z.js → resolve-route-Cah2oBoB.js} +3 -3
  32. package/dist/{send-C75uSv6p.js → send-BNMro1go.js} +7 -7
  33. package/dist/{shell-env-B1lDWz4t.js → shell-env-DUnzZNS9.js} +1 -1
  34. package/dist/{skill-commands-JIccKWkf.js → skill-commands-DG2orCQ1.js} +5 -5
  35. package/dist/{skills-Dm4gX4Tl.js → skills-BfqpCx1S.js} +6 -6
  36. package/dist/{sqlite-CmMv0ans.js → sqlite-B-yVqz_U.js} +1 -1
  37. package/dist/{ssrf-DNhyFMRW.js → ssrf-CD6rSfmA.js} +10 -10
  38. package/dist/{subsystem-DzRUKS9f.js → subsystem-DhOo2FZn.js} +1 -1
  39. package/dist/{synthesis-CmQvOHg6.js → synthesis-C8CALFUp.js} +30 -30
  40. package/dist/{thinking-h_Lv1OKF.js → thinking-Dc4USx6E.js} +2 -2
  41. package/dist/{tokens-D_vCJSzF.js → tokens-BHHkQK-k.js} +1 -1
  42. package/dist/{tool-loop-detection-DGaNCZG0.js → tool-loop-detection-B2hNHeN_.js} +2 -2
  43. package/dist/{unified-runner-Cu3lGa3A.js → unified-runner-DR-adeyL.js} +47 -47
  44. package/dist/{workspace-CsaDUuDn.js → workspace-OBnI5mKu.js} +2 -2
  45. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  import { s as resolveStateDir } from "./paths-CE7eVGHg.js";
2
2
  import { o as normalizeAgentId, t as DEFAULT_AGENT_ID, v as parseAgentSessionKey } from "./session-key-BmQ2R1ev.js";
3
- import { Y as resolveUserPath } from "./registry-C-JddWwo.js";
4
- import { p as resolveDefaultAgentWorkspaceDir } from "./workspace-CsaDUuDn.js";
3
+ import { Y as resolveUserPath } from "./registry-9AaJQms1.js";
4
+ import { p as resolveDefaultAgentWorkspaceDir } from "./workspace-OBnI5mKu.js";
5
5
  import path from "node:path";
6
6
 
7
7
  //#region src/agents/skills/filter.ts
@@ -1,10 +1,10 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
2
2
  import { o as resolveOAuthPath, s as resolveStateDir } from "./paths-CE7eVGHg.js";
3
3
  import { t as DEFAULT_AGENT_ID } from "./session-key-BmQ2R1ev.js";
4
- import { Y as resolveUserPath } from "./registry-C-JddWwo.js";
5
- import { t as createSubsystemLogger } from "./subsystem-DzRUKS9f.js";
4
+ import { Y as resolveUserPath } from "./registry-9AaJQms1.js";
5
+ import { t as createSubsystemLogger } from "./subsystem-DhOo2FZn.js";
6
6
  import { t as formatCliCommand } from "./command-format-BrrHNE8r.js";
7
- import { c as normalizeProviderId, h as getProviderAdapter, i as findNormalizedProviderValue } from "./model-selection-BqshlIZc.js";
7
+ import { c as normalizeProviderId, h as getProviderAdapter, i as findNormalizedProviderValue } from "./model-selection-C_XFh0kf.js";
8
8
  import { n as isPidAlive, t as resolveProcessScopedMap } from "./process-scoped-map-B-dHc_9I.js";
9
9
  import { n as saveJsonFile, t as loadJsonFile } from "./json-file-CZ3ssFR9.js";
10
10
  import path from "node:path";
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "3.5.6",
3
- "commit": "10c5d83eadfa3181e284c09cb33403ad545ec43b",
4
- "builtAt": "2026-05-06T01:01:07.849Z"
2
+ "version": "3.5.8",
3
+ "commit": "8890c5d53b8164e73af40c777ecc8b945c949610",
4
+ "builtAt": "2026-05-06T01:33:45.278Z"
5
5
  }
@@ -1,43 +1,43 @@
1
1
  import "../../paths-CE7eVGHg.js";
2
2
  import { c as resolveAgentIdFromSessionKey, o as normalizeAgentId, s as normalizeMainKey } from "../../session-key-BmQ2R1ev.js";
3
- import { E as shouldLogVerbose, G as isRecord, r as DEFAULT_CHAT_CHANNEL, v as isGatewayStartupEvent } from "../../registry-C-JddWwo.js";
4
- import { a as resolveAgentSkillsFilter, c as resolveEffectiveModelFallbacks, i as resolveAgentModelPrimary, l as resolveSessionAgentId, o as resolveAgentWorkspaceDir, r as resolveAgentDir, t as listAgentIds, u as resolveSessionAgentIds } from "../../agent-scope-B1Ina6jV.js";
5
- import { r as defaultRuntime, t as createSubsystemLogger } from "../../subsystem-DzRUKS9f.js";
6
- import { l as ensureAgentWorkspace } from "../../workspace-CsaDUuDn.js";
7
- import { A as runWithModelFallback, C as resolveSymiDocsPath, D as resolveRunWorkspaceDir, E as redactRunIdentifier, M as resolveFailoverStatus, O as deriveSessionTotalTokens, S as buildAgentSystemPrompt, T as resolveBootstrapContextForRun, _ as AGENT_LANE_NESTED, a as resolveSessionDeliveryTarget, b as emitAgentEvent, c as detectRuntimeShell, d as applyModelOverrideToSessionEntry, f as applyVerboseOverride, g as resolveAgentTimeoutMs, i as resolveOutboundTarget, j as FailoverError, k as hasNonzeroUsage, l as resolveSendPolicy, m as clearSessionAuthProfileOverride, n as buildModelAliasLines, o as buildSystemPromptParams, p as loadModelCatalog, s as getProcessSupervisor, t as runAgentTurn, u as lookupContextTokens, v as AGENT_LANE_SUBAGENT, w as makeBootstrapWarn, x as registerAgentRunContext, y as clearAgentRunContext } from "../../unified-runner-Cu3lGa3A.js";
8
- import { d as ensureAuthProfileStore } from "../../auth-profiles-BSw0aQND.js";
3
+ import { E as shouldLogVerbose, G as isRecord, r as DEFAULT_CHAT_CHANNEL, v as isGatewayStartupEvent } from "../../registry-9AaJQms1.js";
4
+ import { a as resolveAgentSkillsFilter, c as resolveEffectiveModelFallbacks, i as resolveAgentModelPrimary, l as resolveSessionAgentId, o as resolveAgentWorkspaceDir, r as resolveAgentDir, t as listAgentIds, u as resolveSessionAgentIds } from "../../agent-scope-DnJEvgMH.js";
5
+ import { r as defaultRuntime, t as createSubsystemLogger } from "../../subsystem-DhOo2FZn.js";
6
+ import { l as ensureAgentWorkspace } from "../../workspace-OBnI5mKu.js";
7
+ import { A as runWithModelFallback, C as resolveSymiDocsPath, D as resolveRunWorkspaceDir, E as redactRunIdentifier, M as resolveFailoverStatus, O as deriveSessionTotalTokens, S as buildAgentSystemPrompt, T as resolveBootstrapContextForRun, _ as AGENT_LANE_NESTED, a as resolveSessionDeliveryTarget, b as emitAgentEvent, c as detectRuntimeShell, d as applyModelOverrideToSessionEntry, f as applyVerboseOverride, g as resolveAgentTimeoutMs, i as resolveOutboundTarget, j as FailoverError, k as hasNonzeroUsage, l as resolveSendPolicy, m as clearSessionAuthProfileOverride, n as buildModelAliasLines, o as buildSystemPromptParams, p as loadModelCatalog, s as getProcessSupervisor, t as runAgentTurn, u as lookupContextTokens, v as AGENT_LANE_SUBAGENT, w as makeBootstrapWarn, x as registerAgentRunContext, y as clearAgentRunContext } from "../../unified-runner-DR-adeyL.js";
8
+ import { d as ensureAuthProfileStore } from "../../auth-profiles-DVc0P8H7.js";
9
9
  import { t as formatCliCommand } from "../../command-format-BrrHNE8r.js";
10
- import { _ as DEFAULT_MODEL, a as isCliProvider, c as normalizeProviderId, d as resolveDefaultModelForAgent, g as DEFAULT_CONTEXT_TOKENS, m as resolveThinkingDefault, o as modelKey, s as normalizeModelRef, t as buildAllowedModelSet, u as resolveConfiguredModelRef, v as DEFAULT_PROVIDER } from "../../model-selection-BqshlIZc.js";
11
- import { At as resolveSessionResetPolicy, Dt as resolveSessionKey, It as resolveAgentMainSessionKey, Lt as resolveExplicitAgentSessionKey, M as classifyFailoverReason, Ot as evaluateSessionFreshness, Rt as resolveMainSessionKey, U as isFailoverErrorMessage, a as normalizeOutboundPayloadsForJson, at as loadSessionStore, i as normalizeOutboundPayloads, it as resolveAndPersistSessionFile, jt as resolveSessionResetType, kt as resolveChannelResetConfig, lt as updateSessionStore, nt as parseSessionThreadInfo, r as formatOutboundPayloadLog, t as deliverOutboundPayloads, vt as normalizeAccountId } from "../../deliver-BiWlR84Y.js";
12
- import { c as loadConfig } from "../../ssrf-DNhyFMRW.js";
10
+ import { _ as DEFAULT_MODEL, a as isCliProvider, c as normalizeProviderId, d as resolveDefaultModelForAgent, g as DEFAULT_CONTEXT_TOKENS, m as resolveThinkingDefault, o as modelKey, s as normalizeModelRef, t as buildAllowedModelSet, u as resolveConfiguredModelRef, v as DEFAULT_PROVIDER } from "../../model-selection-C_XFh0kf.js";
11
+ import { At as resolveSessionResetPolicy, Dt as resolveSessionKey, It as resolveAgentMainSessionKey, Lt as resolveExplicitAgentSessionKey, M as classifyFailoverReason, Ot as evaluateSessionFreshness, Rt as resolveMainSessionKey, U as isFailoverErrorMessage, a as normalizeOutboundPayloadsForJson, at as loadSessionStore, i as normalizeOutboundPayloads, it as resolveAndPersistSessionFile, jt as resolveSessionResetType, kt as resolveChannelResetConfig, lt as updateSessionStore, nt as parseSessionThreadInfo, r as formatOutboundPayloadLog, t as deliverOutboundPayloads, vt as normalizeAccountId } from "../../deliver-BZ-5d1Pv.js";
12
+ import { c as loadConfig } from "../../ssrf-CD6rSfmA.js";
13
13
  import "../../boolean-BsqeuxE6.js";
14
- import { s as isTruthyEnvValue } from "../../shell-env-B1lDWz4t.js";
15
- import "../../manifest-registry-BGJu2aC-.js";
16
- import "../../chrome-OTJg3QKn.js";
17
- import "../../frontmatter-CJEX1BrH.js";
18
- import { n as buildWorkspaceSkillSnapshot } from "../../skills-Dm4gX4Tl.js";
14
+ import { s as isTruthyEnvValue } from "../../shell-env-DUnzZNS9.js";
15
+ import "../../manifest-registry-B1g2QOPw.js";
16
+ import "../../chrome-Bu0sk8jc.js";
17
+ import "../../frontmatter-Dm9ehpNF.js";
18
+ import { n as buildWorkspaceSkillSnapshot } from "../../skills-BfqpCx1S.js";
19
19
  import "../../redact-CSGZUFxa.js";
20
20
  import "../../errors-C89ppfp9.js";
21
- import "../../local-roots-C7fBKoOI.js";
22
- import { c as normalizeVerboseLevel, n as formatXHighModelHint, o as normalizeThinkLevel, t as formatThinkingLevels, u as supportsXHighThinking } from "../../thinking-h_Lv1OKF.js";
23
- import { g as isInternalMessageChannel, h as isGatewayMessageChannel, m as isDeliverableMessageChannel, p as INTERNAL_MESSAGE_CHANNEL, x as resolveMessageChannel, y as normalizeMessageChannel } from "../../chunk-BkYIP_hB.js";
24
- import { r as normalizeChannelId, t as getChannelPlugin } from "../../plugins-B06cTFHC.js";
25
- import "../../send-C75uSv6p.js";
21
+ import "../../local-roots-Ab2ch8iw.js";
22
+ import { c as normalizeVerboseLevel, n as formatXHighModelHint, o as normalizeThinkLevel, t as formatThinkingLevels, u as supportsXHighThinking } from "../../thinking-Dc4USx6E.js";
23
+ import { g as isInternalMessageChannel, h as isGatewayMessageChannel, m as isDeliverableMessageChannel, p as INTERNAL_MESSAGE_CHANNEL, x as resolveMessageChannel, y as normalizeMessageChannel } from "../../chunk-DBVjqPm2.js";
24
+ import { r as normalizeChannelId, t as getChannelPlugin } from "../../plugins-BcGFMr_d.js";
25
+ import "../../send-BNMro1go.js";
26
26
  import { i as resolveSessionTranscriptPath, n as resolveSessionFilePath, s as resolveStorePath } from "../../paths-BsT3BvfH.js";
27
- import { t as SILENT_REPLY_TOKEN } from "../../tokens-D_vCJSzF.js";
28
- import "../../diagnostic-BALvP9wI.js";
27
+ import { t as SILENT_REPLY_TOKEN } from "../../tokens-BHHkQK-k.js";
28
+ import "../../diagnostic-BlK1QQVx.js";
29
29
  import "../../diagnostic-session-state-BDfanaOY.js";
30
- import "../../manager-CpBJ1BE6.js";
30
+ import "../../manager-_ZfCrpDq.js";
31
31
  import "../../github-copilot-token-uhEBNQfj.js";
32
- import "../../pi-auth-json-DCGR3yfh.js";
33
- import "../../reply-prefix-D0NzzC4I.js";
34
- import "../../sqlite-CmMv0ans.js";
35
- import "../../markdown-tables-CGqX2WvO.js";
36
- import "../../commands-registry-BuOUfpmg.js";
37
- import { c as getSkillsSnapshotVersion, o as getRemoteSkillEligibility } from "../../skill-commands-JIccKWkf.js";
32
+ import "../../pi-auth-json-BxGRaPJK.js";
33
+ import "../../reply-prefix-kh8vLHcr.js";
34
+ import "../../sqlite-B-yVqz_U.js";
35
+ import "../../markdown-tables-CVcd6XRG.js";
36
+ import "../../commands-registry-yWbIOOoD.js";
37
+ import { c as getSkillsSnapshotVersion, o as getRemoteSkillEligibility } from "../../skill-commands-DG2orCQ1.js";
38
38
  import "../../pi-model-discovery-Rgm3jE5N.js";
39
- import "../../resolve-route-CDsQda0z.js";
40
- import "../../replies-D0FYSIJg.js";
39
+ import "../../resolve-route-Cah2oBoB.js";
40
+ import "../../replies-Rf4NZFNR.js";
41
41
  import path from "node:path";
42
42
  import os from "node:os";
43
43
  import fs from "node:fs/promises";
@@ -46,7 +46,7 @@ import crypto from "node:crypto";
46
46
  //#region src/cli/deps.ts
47
47
  function createDefaultDeps() {
48
48
  return { sendMessageSlack: async (...args) => {
49
- const { sendMessageSlack } = await import("../../send-C75uSv6p.js").then((n) => n.n);
49
+ const { sendMessageSlack } = await import("../../send-BNMro1go.js").then((n) => n.n);
50
50
  return await sendMessageSlack(...args);
51
51
  } };
52
52
  }
@@ -1,9 +1,9 @@
1
1
  import "../../paths-CE7eVGHg.js";
2
- import { _ as isAgentBootstrapEvent } from "../../registry-C-JddWwo.js";
3
- import "../../subsystem-DzRUKS9f.js";
4
- import { d as loadExtraBootstrapFiles, u as filterBootstrapFilesForSession } from "../../workspace-CsaDUuDn.js";
2
+ import { _ as isAgentBootstrapEvent } from "../../registry-9AaJQms1.js";
3
+ import "../../subsystem-DhOo2FZn.js";
4
+ import { d as loadExtraBootstrapFiles, u as filterBootstrapFilesForSession } from "../../workspace-OBnI5mKu.js";
5
5
  import "../../boolean-BsqeuxE6.js";
6
- import "../../frontmatter-CJEX1BrH.js";
6
+ import "../../frontmatter-Dm9ehpNF.js";
7
7
  import { t as resolveHookConfig } from "../../config-By1mFioa.js";
8
8
 
9
9
  //#region src/hooks/bundled/bootstrap-extra-files/handler.ts
@@ -1,42 +1,42 @@
1
1
  import { s as resolveStateDir } from "../../paths-CE7eVGHg.js";
2
2
  import { c as resolveAgentIdFromSessionKey } from "../../session-key-BmQ2R1ev.js";
3
- import "../../registry-C-JddWwo.js";
4
- import { o as resolveAgentWorkspaceDir } from "../../agent-scope-B1Ina6jV.js";
5
- import { t as createSubsystemLogger } from "../../subsystem-DzRUKS9f.js";
6
- import "../../workspace-CsaDUuDn.js";
7
- import "../../unified-runner-Cu3lGa3A.js";
8
- import "../../auth-profiles-BSw0aQND.js";
9
- import "../../model-selection-BqshlIZc.js";
10
- import { Tt as hasInterSessionUserProvenance } from "../../deliver-BiWlR84Y.js";
11
- import "../../ssrf-DNhyFMRW.js";
3
+ import "../../registry-9AaJQms1.js";
4
+ import { o as resolveAgentWorkspaceDir } from "../../agent-scope-DnJEvgMH.js";
5
+ import { t as createSubsystemLogger } from "../../subsystem-DhOo2FZn.js";
6
+ import "../../workspace-OBnI5mKu.js";
7
+ import "../../unified-runner-DR-adeyL.js";
8
+ import "../../auth-profiles-DVc0P8H7.js";
9
+ import "../../model-selection-C_XFh0kf.js";
10
+ import { Tt as hasInterSessionUserProvenance } from "../../deliver-BZ-5d1Pv.js";
11
+ import "../../ssrf-CD6rSfmA.js";
12
12
  import "../../boolean-BsqeuxE6.js";
13
- import "../../shell-env-B1lDWz4t.js";
14
- import "../../manifest-registry-BGJu2aC-.js";
15
- import "../../chrome-OTJg3QKn.js";
16
- import "../../frontmatter-CJEX1BrH.js";
17
- import "../../skills-Dm4gX4Tl.js";
13
+ import "../../shell-env-DUnzZNS9.js";
14
+ import "../../manifest-registry-B1g2QOPw.js";
15
+ import "../../chrome-Bu0sk8jc.js";
16
+ import "../../frontmatter-Dm9ehpNF.js";
17
+ import "../../skills-BfqpCx1S.js";
18
18
  import "../../redact-CSGZUFxa.js";
19
19
  import "../../errors-C89ppfp9.js";
20
- import "../../local-roots-C7fBKoOI.js";
21
- import "../../thinking-h_Lv1OKF.js";
22
- import "../../chunk-BkYIP_hB.js";
23
- import "../../plugins-B06cTFHC.js";
24
- import "../../send-C75uSv6p.js";
20
+ import "../../local-roots-Ab2ch8iw.js";
21
+ import "../../thinking-Dc4USx6E.js";
22
+ import "../../chunk-DBVjqPm2.js";
23
+ import "../../plugins-BcGFMr_d.js";
24
+ import "../../send-BNMro1go.js";
25
25
  import "../../paths-BsT3BvfH.js";
26
- import "../../tokens-D_vCJSzF.js";
27
- import "../../diagnostic-BALvP9wI.js";
26
+ import "../../tokens-BHHkQK-k.js";
27
+ import "../../diagnostic-BlK1QQVx.js";
28
28
  import "../../diagnostic-session-state-BDfanaOY.js";
29
- import "../../manager-CpBJ1BE6.js";
29
+ import "../../manager-_ZfCrpDq.js";
30
30
  import "../../github-copilot-token-uhEBNQfj.js";
31
- import "../../pi-auth-json-DCGR3yfh.js";
32
- import "../../reply-prefix-D0NzzC4I.js";
33
- import "../../sqlite-CmMv0ans.js";
34
- import "../../markdown-tables-CGqX2WvO.js";
35
- import "../../commands-registry-BuOUfpmg.js";
36
- import "../../skill-commands-JIccKWkf.js";
31
+ import "../../pi-auth-json-BxGRaPJK.js";
32
+ import "../../reply-prefix-kh8vLHcr.js";
33
+ import "../../sqlite-B-yVqz_U.js";
34
+ import "../../markdown-tables-CVcd6XRG.js";
35
+ import "../../commands-registry-yWbIOOoD.js";
36
+ import "../../skill-commands-DG2orCQ1.js";
37
37
  import "../../pi-model-discovery-Rgm3jE5N.js";
38
- import "../../resolve-route-CDsQda0z.js";
39
- import "../../replies-D0FYSIJg.js";
38
+ import "../../resolve-route-Cah2oBoB.js";
39
+ import "../../replies-Rf4NZFNR.js";
40
40
  import { generateSlugViaLLM } from "../../llm-slug-generator.js";
41
41
  import { t as resolveHookConfig } from "../../config-By1mFioa.js";
42
42
  import path from "node:path";
@@ -1 +1 @@
1
- c523a3508bc8122b119dc3ed8af76e2adb4176bf32676e8b60d3426986bbbe66
1
+ 614283d782ea646aafd02bb9a9e8ea596914746934fa8c8a3d3d29558c0c7b8d
@@ -1,6 +1,6 @@
1
- import { z as CONFIG_DIR } from "./registry-C-JddWwo.js";
2
- import { t as createSubsystemLogger } from "./subsystem-DzRUKS9f.js";
3
- import { a as resolvePinnedHostnameWithPolicy, c as loadConfig } from "./ssrf-DNhyFMRW.js";
1
+ import { z as CONFIG_DIR } from "./registry-9AaJQms1.js";
2
+ import { t as createSubsystemLogger } from "./subsystem-DhOo2FZn.js";
3
+ import { a as resolvePinnedHostnameWithPolicy, c as loadConfig } from "./ssrf-CD6rSfmA.js";
4
4
  import { r as isErrno } from "./errors-C89ppfp9.js";
5
5
  import path from "node:path";
6
6
  import fs from "node:fs";
@@ -1,6 +1,6 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
2
2
  import { f as normalizeAccountId } from "./session-key-BmQ2R1ev.js";
3
- import { c as getActivePluginRegistry, s as normalizeChatChannelId, t as CHANNEL_IDS } from "./registry-C-JddWwo.js";
3
+ import { c as getActivePluginRegistry, s as normalizeChatChannelId, t as CHANNEL_IDS } from "./registry-9AaJQms1.js";
4
4
 
5
5
  //#region src/gateway/protocol/client-info.ts
6
6
  const GATEWAY_CLIENT_IDS = {
@@ -1,8 +1,8 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
2
- import { U as escapeRegExp, c as getActivePluginRegistry, nt as isPlainObject } from "./registry-C-JddWwo.js";
3
- import { _ as DEFAULT_MODEL, u as resolveConfiguredModelRef, v as DEFAULT_PROVIDER } from "./model-selection-BqshlIZc.js";
4
- import { f as listChannelDocks, r as listThinkingLevels } from "./thinking-h_Lv1OKF.js";
5
- import { r as normalizeChannelId } from "./plugins-B06cTFHC.js";
2
+ import { U as escapeRegExp, c as getActivePluginRegistry, nt as isPlainObject } from "./registry-9AaJQms1.js";
3
+ import { _ as DEFAULT_MODEL, u as resolveConfiguredModelRef, v as DEFAULT_PROVIDER } from "./model-selection-C_XFh0kf.js";
4
+ import { f as listChannelDocks, r as listThinkingLevels } from "./thinking-Dc4USx6E.js";
5
+ import { r as normalizeChannelId } from "./plugins-BcGFMr_d.js";
6
6
 
7
7
  //#region src/config/commands.ts
8
8
  function resolveAutoDefault(providerId) {
@@ -1,6 +1,6 @@
1
1
  import "./paths-CE7eVGHg.js";
2
- import "./registry-C-JddWwo.js";
3
- import { t as createSubsystemLogger } from "./subsystem-DzRUKS9f.js";
2
+ import "./registry-9AaJQms1.js";
3
+ import { t as createSubsystemLogger } from "./subsystem-DhOo2FZn.js";
4
4
  import { l as parseEmbedding, r as cosineSimilarity } from "./internal-BYHsj5p6.js";
5
5
  import path from "node:path";
6
6
  import fs from "node:fs/promises";
@@ -1070,6 +1070,20 @@ body {
1070
1070
  overflow: hidden;
1071
1071
  text-overflow: ellipsis;
1072
1072
  }
1073
+ .slash-ac-header {
1074
+ font-family: var(--font-mono);
1075
+ font-size: 10px;
1076
+ letter-spacing: 0.06em;
1077
+ text-transform: uppercase;
1078
+ color: var(--text-dim);
1079
+ opacity: 0.7;
1080
+ padding: 4px 10px 6px;
1081
+ margin-bottom: 2px;
1082
+ border-bottom: 1px solid rgba(0, 212, 255, 0.12);
1083
+ }
1084
+ .slash-ac-arg {
1085
+ grid-template-columns: auto 1fr;
1086
+ }
1073
1087
 
1074
1088
  /* ── Prompt rows ──────────────────────────────────────────────────── */
1075
1089
  .prompt-row-main {
@@ -1126,6 +1126,14 @@ queueBtn.addEventListener("click", (e) => {
1126
1126
  });
1127
1127
  promptInput.addEventListener("keydown", (e) => {
1128
1128
  if (e.key === "Enter" && !e.shiftKey) {
1129
+ // When the slash-command autocomplete is open, Enter selects the
1130
+ // highlighted command (handled by slash-autocomplete.js) — don't
1131
+ // submit the partial text to the agent. preventDefault() blocks the
1132
+ // browser default but not other listeners, so we explicitly bail.
1133
+ const slashOpen = document.getElementById("slash-autocomplete")?.classList.contains("open");
1134
+ if (slashOpen) {
1135
+ return;
1136
+ }
1129
1137
  e.preventDefault();
1130
1138
  void handleSend();
1131
1139
  }
@@ -1,7 +1,21 @@
1
1
  // ── Slash command autocomplete for the prompt input ─────────────────────
2
- // Fetches the chat command registry from the gateway via `chat.commands.list`
3
- // and surfaces it as a dropdown when the user types `/` at the start of the
4
- // prompt. Replaces the prior "you have to memorize the slash commands" UX.
2
+ // Layer 1: type "/" dropdown lists matching commands.
3
+ // Layer 2: pick a command if its args[0] has `choices`, the dropdown
4
+ // immediately re-opens showing those choices. Picking a value
5
+ // inserts it and (if args[1] also has choices) chains to the
6
+ // next arg. When all arg-choices are consumed (or an arg has
7
+ // no choices), the dropdown closes and the user submits with
8
+ // Enter (gated by app.js so Enter-while-open never submits).
9
+ //
10
+ // The arg metadata is the `args[i].choices` field already exposed by
11
+ // `chat.commands.list` — no server-side change needed for static enums.
12
+ // Dynamic completions (skill names, session ids) are a Phase 2 follow-up
13
+ // that will extend `getArgChoices` to call a per-arg RPC.
14
+ //
15
+ // Choices in the registry come in two shapes; both are normalised to
16
+ // `{ value, label }` here so the renderer doesn't care:
17
+ // - "today" → { value: "today", label: "today" }
18
+ // - { value: "today", label: "Today" } → { value: "today", label: "Today" }
5
19
 
6
20
  (function () {
7
21
  const promptInput = document.getElementById("prompt-input");
@@ -20,6 +34,12 @@
20
34
  let filtered = [];
21
35
  let selectedIndex = 0;
22
36
  let isOpen = false;
37
+ // When non-null we're filling an arg for this command at activeArgIndex;
38
+ // when null we're picking a command. Set/cleared by `refilter()` based
39
+ // on the parsed input, never by hand — keeps the state machine from
40
+ // drifting from what the user actually typed.
41
+ let activeCommand = null;
42
+ let activeArgIndex = -1;
23
43
 
24
44
  // Fetch the command registry. The WebSocket handshake completes async, so
25
45
  // we must wait for `gateway:connected` (dispatched by app.js after the
@@ -53,17 +73,149 @@
53
73
  void loadCommands();
54
74
  });
55
75
 
76
+ function escapeHtml(str) {
77
+ return String(str)
78
+ .replace(/&/g, "&")
79
+ .replace(/</g, "&lt;")
80
+ .replace(/>/g, "&gt;")
81
+ .replace(/"/g, "&quot;");
82
+ }
83
+
84
+ // Normalise the registry's args[i].choices into {value,label} pairs and
85
+ // suppress completion for captureRemaining args (free-form text). This is
86
+ // also the seam for Phase 2's dynamic completions: when arg.argsRpc is
87
+ // present we'll await an rpc here instead of returning a static list.
88
+ function getArgChoices(cmd, argIndex) {
89
+ const arg = cmd?.args?.[argIndex];
90
+ if (!arg) {
91
+ return [];
92
+ }
93
+ if (arg.captureRemaining) {
94
+ return [];
95
+ }
96
+ const raw = Array.isArray(arg.choices) ? arg.choices : [];
97
+ return raw.map((choice) => {
98
+ if (typeof choice === "string") {
99
+ return { value: choice, label: choice };
100
+ }
101
+ const value = String(choice.value ?? "");
102
+ const label = String(choice.label ?? choice.value ?? "");
103
+ return { value, label };
104
+ });
105
+ }
106
+
107
+ function findCommandByName(name) {
108
+ const lower = String(name).toLowerCase();
109
+ return commands.find((cmd) => (cmd.nativeName ?? cmd.key).toLowerCase() === lower);
110
+ }
111
+
112
+ // Parse the current input into either {mode:"command", commandQuery} or
113
+ // {mode:"args", command, argIndex, argPartial}. Returns null if the input
114
+ // doesn't start with "/" — caller closes the dropdown.
115
+ function parseInput() {
116
+ const value = promptInput.value;
117
+ if (!value.startsWith("/")) {
118
+ return null;
119
+ }
120
+ const afterSlash = value.slice(1);
121
+ const endsWithSpace = afterSlash.length > 0 && /\s$/.test(value);
122
+ const tokens = afterSlash.split(/\s+/).filter(Boolean);
123
+
124
+ if (tokens.length === 0) {
125
+ return { mode: "command", commandQuery: "" };
126
+ }
127
+ if (tokens.length === 1 && !endsWithSpace) {
128
+ return { mode: "command", commandQuery: tokens[0] };
129
+ }
130
+
131
+ const cmd = findCommandByName(tokens[0]);
132
+ if (!cmd) {
133
+ // Typed a "/foo " prefix that doesn't match any registered command.
134
+ // Nothing useful to complete — fall back to command-mode filter so
135
+ // the dropdown shows close matches if any.
136
+ return { mode: "command", commandQuery: tokens[0] };
137
+ }
138
+
139
+ const completedArgs = tokens.length - 1;
140
+ const argIndex = endsWithSpace ? completedArgs : completedArgs - 1;
141
+ const argPartial = endsWithSpace ? "" : (tokens[tokens.length - 1] ?? "");
142
+ return { mode: "args", command: cmd, argIndex, argPartial };
143
+ }
144
+
145
+ function refilter() {
146
+ const parsed = parseInput();
147
+ if (!parsed) {
148
+ isOpen = false;
149
+ activeCommand = null;
150
+ activeArgIndex = -1;
151
+ render();
152
+ return;
153
+ }
154
+
155
+ if (parsed.mode === "command") {
156
+ activeCommand = null;
157
+ activeArgIndex = -1;
158
+ const query = parsed.commandQuery.toLowerCase();
159
+ filtered = commands.filter((cmd) => {
160
+ const name = (cmd.nativeName ?? cmd.key).toLowerCase();
161
+ if (name.startsWith(query)) {
162
+ return true;
163
+ }
164
+ if (Array.isArray(cmd.textAliases)) {
165
+ return cmd.textAliases.some((a) => a.toLowerCase().slice(1).startsWith(query));
166
+ }
167
+ return false;
168
+ });
169
+ } else {
170
+ activeCommand = parsed.command;
171
+ activeArgIndex = parsed.argIndex;
172
+ const choices = getArgChoices(parsed.command, parsed.argIndex);
173
+ const partial = parsed.argPartial.toLowerCase();
174
+ filtered = choices.filter((choice) => {
175
+ if (choice.value.toLowerCase().startsWith(partial)) {
176
+ return true;
177
+ }
178
+ return choice.label.toLowerCase().startsWith(partial);
179
+ });
180
+ }
181
+
182
+ selectedIndex = 0;
183
+ isOpen = filtered.length > 0;
184
+ render();
185
+ }
186
+
56
187
  function render() {
57
188
  if (!isOpen || filtered.length === 0) {
58
189
  dropdown.classList.remove("open");
59
190
  dropdown.innerHTML = "";
60
191
  return;
61
192
  }
62
- dropdown.innerHTML = filtered
193
+
194
+ const isArgsMode = activeCommand !== null && activeArgIndex >= 0;
195
+ let html = "";
196
+
197
+ if (isArgsMode) {
198
+ const cmdName = activeCommand.nativeName ?? activeCommand.key;
199
+ const arg = activeCommand.args?.[activeArgIndex];
200
+ const argName = arg?.name ?? "value";
201
+ html += `<div class="slash-ac-header">/${escapeHtml(cmdName)} · choose ${escapeHtml(argName)}</div>`;
202
+ }
203
+
204
+ html += filtered
63
205
  .slice(0, 8)
64
- .map((cmd, i) => {
65
- const name = cmd.nativeName ?? cmd.key;
206
+ .map((entry, i) => {
66
207
  const sel = i === selectedIndex ? " selected" : "";
208
+ if (isArgsMode) {
209
+ const value = entry.value;
210
+ const label = entry.label;
211
+ const showLabel = label && label !== value;
212
+ return `<div class="slash-ac-item slash-ac-arg${sel}" data-index="${i}">
213
+ <span class="slash-ac-name">${escapeHtml(value)}</span>
214
+ ${showLabel ? `<span class="slash-ac-desc">${escapeHtml(label)}</span>` : ""}
215
+ </div>`;
216
+ }
217
+ const cmd = entry;
218
+ const name = cmd.nativeName ?? cmd.key;
67
219
  const aliasText =
68
220
  Array.isArray(cmd.textAliases) && cmd.textAliases.length > 0
69
221
  ? `<span class="slash-ac-alias">${escapeHtml(cmd.textAliases[0])}</span>`
@@ -75,56 +227,52 @@
75
227
  </div>`;
76
228
  })
77
229
  .join("");
78
- dropdown.classList.add("open");
79
- }
80
230
 
81
- function escapeHtml(str) {
82
- return String(str)
83
- .replace(/&/g, "&amp;")
84
- .replace(/</g, "&lt;")
85
- .replace(/>/g, "&gt;")
86
- .replace(/"/g, "&quot;");
231
+ dropdown.innerHTML = html;
232
+ dropdown.classList.add("open");
87
233
  }
88
234
 
89
- function refilter() {
90
- const value = promptInput.value;
91
- if (!value.startsWith("/")) {
92
- isOpen = false;
93
- render();
235
+ function applySelection() {
236
+ const entry = filtered[selectedIndex];
237
+ if (!entry) {
94
238
  return;
95
239
  }
96
- // Only the first token (no spaces) is the command query.
97
- const query = value.slice(1).split(/\s/, 1)[0].toLowerCase();
98
- filtered = commands.filter((cmd) => {
99
- const name = (cmd.nativeName ?? cmd.key).toLowerCase();
100
- if (name.startsWith(query)) {
101
- return true;
102
- }
103
- if (Array.isArray(cmd.textAliases)) {
104
- return cmd.textAliases.some((a) => a.toLowerCase().slice(1).startsWith(query));
105
- }
106
- return false;
107
- });
108
- selectedIndex = 0;
109
- isOpen = filtered.length > 0;
110
- render();
240
+ if (activeCommand !== null && activeArgIndex >= 0) {
241
+ applyArgSelection(entry);
242
+ } else {
243
+ applyCommandSelection(entry);
244
+ }
111
245
  }
112
246
 
113
- function applySelection() {
114
- const cmd = filtered[selectedIndex];
115
- if (!cmd) {
116
- return;
117
- }
247
+ function applyCommandSelection(cmd) {
118
248
  const name = cmd.nativeName ?? cmd.key;
119
- // Preserve any existing args after the first space.
249
+ // Preserve any existing args after the first space (e.g. user pressed
250
+ // / late in a partially-typed command).
120
251
  const rest = promptInput.value.slice(1).split(/\s/).slice(1).join(" ");
121
252
  promptInput.value =
122
253
  cmd.acceptsArgs && !rest ? `/${name} ` : `/${name}${rest ? " " + rest : ""}`;
123
- isOpen = false;
124
- render();
125
254
  promptInput.focus();
126
- // Move caret to end.
127
255
  promptInput.selectionStart = promptInput.selectionEnd = promptInput.value.length;
256
+ // refilter() reparses: if cmd.args[0] has choices the dropdown chains
257
+ // into args mode; otherwise it closes.
258
+ refilter();
259
+ }
260
+
261
+ function applyArgSelection(choice) {
262
+ const value = promptInput.value;
263
+ const endsWithSpace = /\s$/.test(value);
264
+ if (endsWithSpace) {
265
+ promptInput.value = value + choice.value + " ";
266
+ } else {
267
+ // Replace the partial at the end with the chosen value.
268
+ const lastSpaceIdx = value.lastIndexOf(" ");
269
+ promptInput.value = value.slice(0, lastSpaceIdx + 1) + choice.value + " ";
270
+ }
271
+ promptInput.focus();
272
+ promptInput.selectionStart = promptInput.selectionEnd = promptInput.value.length;
273
+ // refilter() reparses: if the next arg has choices, chain to it;
274
+ // otherwise close.
275
+ refilter();
128
276
  }
129
277
 
130
278
  promptInput.addEventListener("input", refilter);
@@ -146,6 +294,8 @@
146
294
  applySelection();
147
295
  } else if (e.key === "Escape") {
148
296
  isOpen = false;
297
+ activeCommand = null;
298
+ activeArgIndex = -1;
149
299
  render();
150
300
  }
151
301
  });
@@ -162,6 +312,8 @@
162
312
  document.addEventListener("click", (e) => {
163
313
  if (!dropdown.contains(e.target) && e.target !== promptInput) {
164
314
  isOpen = false;
315
+ activeCommand = null;
316
+ activeArgIndex = -1;
165
317
  render();
166
318
  }
167
319
  });