@symerian/symi 3.5.7 → 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.
- package/dist/{agent-scope-B1Ina6jV.js → agent-scope-DnJEvgMH.js} +2 -2
- package/dist/{auth-profiles-BSw0aQND.js → auth-profiles-DVc0P8H7.js} +3 -3
- package/dist/build-info.json +3 -3
- package/dist/bundled/boot-md/handler.js +31 -31
- package/dist/bundled/bootstrap-extra-files/handler.js +4 -4
- package/dist/bundled/session-memory/handler.js +30 -30
- package/dist/canvas-host/a2ui/.bundle.hash +1 -1
- package/dist/{chrome-DNssqQJs.js → chrome-3jl2ulOE.js} +7 -7
- package/dist/{chrome-OTJg3QKn.js → chrome-Bu0sk8jc.js} +3 -3
- package/dist/{chunk-BkYIP_hB.js → chunk-DBVjqPm2.js} +1 -1
- package/dist/{commands-registry-BuOUfpmg.js → commands-registry-yWbIOOoD.js} +4 -4
- package/dist/{consolidate-Dyh_aESo.js → consolidate-JptFSFxz.js} +2 -2
- package/dist/control-ui/css/style.css +14 -0
- package/dist/control-ui/js/slash-autocomplete.js +195 -43
- package/dist/{deliver-BiWlR84Y.js → deliver-BZ-5d1Pv.js} +15 -15
- package/dist/{deliver-q23ar_Pm.js → deliver-f3cIWxXT.js} +4 -4
- package/dist/{diagnostic-BALvP9wI.js → diagnostic-BlK1QQVx.js} +1 -1
- package/dist/extensionAPI.js +4 -4
- package/dist/{frontmatter-CJEX1BrH.js → frontmatter-Dm9ehpNF.js} +2 -2
- package/dist/llm-slug-generator.js +30 -30
- package/dist/{local-roots-C7fBKoOI.js → local-roots-Ab2ch8iw.js} +3 -3
- package/dist/{manager-D9m8F3HR.js → manager-CnBU0aOR.js} +1 -1
- package/dist/{manager-CpBJ1BE6.js → manager-_ZfCrpDq.js} +8 -8
- package/dist/{manifest-registry-BGJu2aC-.js → manifest-registry-B1g2QOPw.js} +1 -1
- package/dist/{markdown-tables-CGqX2WvO.js → markdown-tables-CVcd6XRG.js} +1 -1
- package/dist/{model-selection-BqshlIZc.js → model-selection-C_XFh0kf.js} +1 -1
- package/dist/{pi-auth-json-DCGR3yfh.js → pi-auth-json-BxGRaPJK.js} +2 -2
- package/dist/{pi-embedded-C2-v_4OT.js → pi-embedded-C9wLrFjj.js} +10 -10
- package/dist/{plugins-B06cTFHC.js → plugins-BcGFMr_d.js} +1 -1
- package/dist/{pw-ai-DY_6l11g.js → pw-ai-B5v5n5ol.js} +9 -9
- package/dist/{pw-ai-v__CyAlM.js → pw-ai-DOAsQ5NX.js} +1 -1
- package/dist/{qmd-manager-Bc7yrt9d.js → qmd-manager-CM1Zb2vR.js} +5 -5
- package/dist/{registry-C-JddWwo.js → registry-9AaJQms1.js} +2 -2
- package/dist/{replies-D0FYSIJg.js → replies-Rf4NZFNR.js} +3 -3
- package/dist/{reply-prefix-D0NzzC4I.js → reply-prefix-kh8vLHcr.js} +1 -1
- package/dist/{resolve-route-CDsQda0z.js → resolve-route-Cah2oBoB.js} +3 -3
- package/dist/{send-C75uSv6p.js → send-BNMro1go.js} +7 -7
- package/dist/{shell-env-B1lDWz4t.js → shell-env-DUnzZNS9.js} +1 -1
- package/dist/{skill-commands-JIccKWkf.js → skill-commands-DG2orCQ1.js} +5 -5
- package/dist/{skills-Dm4gX4Tl.js → skills-BfqpCx1S.js} +6 -6
- package/dist/{sqlite-CmMv0ans.js → sqlite-B-yVqz_U.js} +1 -1
- package/dist/{ssrf-DNhyFMRW.js → ssrf-CD6rSfmA.js} +10 -10
- package/dist/{subsystem-DzRUKS9f.js → subsystem-DhOo2FZn.js} +1 -1
- package/dist/{synthesis-CmQvOHg6.js → synthesis-C8CALFUp.js} +30 -30
- package/dist/{synthesis-Dq-zHW08.js → synthesis-DIkOQnhF.js} +4 -4
- package/dist/{thinking-h_Lv1OKF.js → thinking-Dc4USx6E.js} +2 -2
- package/dist/{tokens-D_vCJSzF.js → tokens-BHHkQK-k.js} +1 -1
- package/dist/{tool-loop-detection-DGaNCZG0.js → tool-loop-detection-B2hNHeN_.js} +2 -2
- package/dist/{unified-runner-Cu3lGa3A.js → unified-runner-DR-adeyL.js} +47 -47
- package/dist/{workspace-CsaDUuDn.js → workspace-OBnI5mKu.js} +2 -2
- 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-
|
|
4
|
-
import { p as resolveDefaultAgentWorkspaceDir } from "./workspace-
|
|
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-
|
|
5
|
-
import { t as createSubsystemLogger } from "./subsystem-
|
|
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-
|
|
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";
|
package/dist/build-info.json
CHANGED
|
@@ -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-
|
|
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-
|
|
5
|
-
import { r as defaultRuntime, t as createSubsystemLogger } from "../../subsystem-
|
|
6
|
-
import { l as ensureAgentWorkspace } from "../../workspace-
|
|
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-
|
|
8
|
-
import { d as ensureAuthProfileStore } from "../../auth-profiles-
|
|
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-
|
|
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-
|
|
12
|
-
import { c as loadConfig } from "../../ssrf-
|
|
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-
|
|
15
|
-
import "../../manifest-registry-
|
|
16
|
-
import "../../chrome-
|
|
17
|
-
import "../../frontmatter-
|
|
18
|
-
import { n as buildWorkspaceSkillSnapshot } from "../../skills-
|
|
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-
|
|
22
|
-
import { c as normalizeVerboseLevel, n as formatXHighModelHint, o as normalizeThinkLevel, t as formatThinkingLevels, u as supportsXHighThinking } from "../../thinking-
|
|
23
|
-
import { g as isInternalMessageChannel, h as isGatewayMessageChannel, m as isDeliverableMessageChannel, p as INTERNAL_MESSAGE_CHANNEL, x as resolveMessageChannel, y as normalizeMessageChannel } from "../../chunk-
|
|
24
|
-
import { r as normalizeChannelId, t as getChannelPlugin } from "../../plugins-
|
|
25
|
-
import "../../send-
|
|
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-
|
|
28
|
-
import "../../diagnostic-
|
|
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-
|
|
30
|
+
import "../../manager-_ZfCrpDq.js";
|
|
31
31
|
import "../../github-copilot-token-uhEBNQfj.js";
|
|
32
|
-
import "../../pi-auth-json-
|
|
33
|
-
import "../../reply-prefix-
|
|
34
|
-
import "../../sqlite-
|
|
35
|
-
import "../../markdown-tables-
|
|
36
|
-
import "../../commands-registry-
|
|
37
|
-
import { c as getSkillsSnapshotVersion, o as getRemoteSkillEligibility } from "../../skill-commands-
|
|
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-
|
|
40
|
-
import "../../replies-
|
|
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-
|
|
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-
|
|
3
|
-
import "../../subsystem-
|
|
4
|
-
import { d as loadExtraBootstrapFiles, u as filterBootstrapFilesForSession } from "../../workspace-
|
|
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-
|
|
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-
|
|
4
|
-
import { o as resolveAgentWorkspaceDir } from "../../agent-scope-
|
|
5
|
-
import { t as createSubsystemLogger } from "../../subsystem-
|
|
6
|
-
import "../../workspace-
|
|
7
|
-
import "../../unified-runner-
|
|
8
|
-
import "../../auth-profiles-
|
|
9
|
-
import "../../model-selection-
|
|
10
|
-
import { Tt as hasInterSessionUserProvenance } from "../../deliver-
|
|
11
|
-
import "../../ssrf-
|
|
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-
|
|
14
|
-
import "../../manifest-registry-
|
|
15
|
-
import "../../chrome-
|
|
16
|
-
import "../../frontmatter-
|
|
17
|
-
import "../../skills-
|
|
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-
|
|
21
|
-
import "../../thinking-
|
|
22
|
-
import "../../chunk-
|
|
23
|
-
import "../../plugins-
|
|
24
|
-
import "../../send-
|
|
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-
|
|
27
|
-
import "../../diagnostic-
|
|
26
|
+
import "../../tokens-BHHkQK-k.js";
|
|
27
|
+
import "../../diagnostic-BlK1QQVx.js";
|
|
28
28
|
import "../../diagnostic-session-state-BDfanaOY.js";
|
|
29
|
-
import "../../manager-
|
|
29
|
+
import "../../manager-_ZfCrpDq.js";
|
|
30
30
|
import "../../github-copilot-token-uhEBNQfj.js";
|
|
31
|
-
import "../../pi-auth-json-
|
|
32
|
-
import "../../reply-prefix-
|
|
33
|
-
import "../../sqlite-
|
|
34
|
-
import "../../markdown-tables-
|
|
35
|
-
import "../../commands-registry-
|
|
36
|
-
import "../../skill-commands-
|
|
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-
|
|
39
|
-
import "../../replies-
|
|
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
|
-
|
|
1
|
+
614283d782ea646aafd02bb9a9e8ea596914746934fa8c8a3d3d29558c0c7b8d
|
|
@@ -9,7 +9,7 @@ import fs$1 from "node:fs/promises";
|
|
|
9
9
|
import { execFileSync, spawn } from "node:child_process";
|
|
10
10
|
import net from "node:net";
|
|
11
11
|
import { createServer } from "node:http";
|
|
12
|
-
import WebSocket
|
|
12
|
+
import WebSocket, { WebSocketServer } from "ws";
|
|
13
13
|
import { Buffer as Buffer$1 } from "node:buffer";
|
|
14
14
|
|
|
15
15
|
//#region src/browser/constants.ts
|
|
@@ -177,7 +177,7 @@ async function ensureChromeExtensionRelayServer(opts) {
|
|
|
177
177
|
let nextExtensionId = 1;
|
|
178
178
|
const sendToExtension = async (payload) => {
|
|
179
179
|
const ws = extensionWs;
|
|
180
|
-
if (!ws || ws.readyState !== WebSocket
|
|
180
|
+
if (!ws || ws.readyState !== WebSocket.OPEN) throw new Error("Chrome extension not connected");
|
|
181
181
|
ws.send(JSON.stringify(payload));
|
|
182
182
|
return await new Promise((resolve, reject) => {
|
|
183
183
|
const timer = setTimeout(() => {
|
|
@@ -194,12 +194,12 @@ async function ensureChromeExtensionRelayServer(opts) {
|
|
|
194
194
|
const broadcastToCdpClients = (evt) => {
|
|
195
195
|
const msg = JSON.stringify(evt);
|
|
196
196
|
for (const ws of cdpClients) {
|
|
197
|
-
if (ws.readyState !== WebSocket
|
|
197
|
+
if (ws.readyState !== WebSocket.OPEN) continue;
|
|
198
198
|
ws.send(msg);
|
|
199
199
|
}
|
|
200
200
|
};
|
|
201
201
|
const sendResponseToCdp = (ws, res) => {
|
|
202
|
-
if (ws.readyState !== WebSocket
|
|
202
|
+
if (ws.readyState !== WebSocket.OPEN) return;
|
|
203
203
|
ws.send(JSON.stringify(res));
|
|
204
204
|
};
|
|
205
205
|
const ensureTargetEventsForClient = (ws, mode) => {
|
|
@@ -424,7 +424,7 @@ async function ensureChromeExtensionRelayServer(opts) {
|
|
|
424
424
|
wssExtension.on("connection", (ws) => {
|
|
425
425
|
extensionWs = ws;
|
|
426
426
|
const ping = setInterval(() => {
|
|
427
|
-
if (ws.readyState !== WebSocket
|
|
427
|
+
if (ws.readyState !== WebSocket.OPEN) return;
|
|
428
428
|
ws.send(JSON.stringify({ method: "ping" }));
|
|
429
429
|
}, 5e3);
|
|
430
430
|
ws.on("message", (data) => {
|
|
@@ -742,7 +742,7 @@ async function fetchOk(url, timeoutMs = 1500, init) {
|
|
|
742
742
|
}
|
|
743
743
|
async function withCdpSocket(wsUrl, fn, opts) {
|
|
744
744
|
const headers = getHeadersWithAuth(wsUrl, opts?.headers ?? {});
|
|
745
|
-
const ws = new WebSocket
|
|
745
|
+
const ws = new WebSocket(wsUrl, {
|
|
746
746
|
handshakeTimeout: typeof opts?.handshakeTimeoutMs === "number" && Number.isFinite(opts.handshakeTimeoutMs) ? Math.max(1, Math.floor(opts.handshakeTimeoutMs)) : 5e3,
|
|
747
747
|
...Object.keys(headers).length ? { headers } : {}
|
|
748
748
|
});
|
|
@@ -1636,7 +1636,7 @@ async function getChromeWebSocketUrl(cdpUrl, timeoutMs = 500) {
|
|
|
1636
1636
|
async function canOpenWebSocket(wsUrl, timeoutMs = 800) {
|
|
1637
1637
|
return await new Promise((resolve) => {
|
|
1638
1638
|
const headers = getHeadersWithAuth(wsUrl);
|
|
1639
|
-
const ws = new WebSocket
|
|
1639
|
+
const ws = new WebSocket(wsUrl, {
|
|
1640
1640
|
handshakeTimeout: timeoutMs,
|
|
1641
1641
|
...Object.keys(headers).length ? { headers } : {}
|
|
1642
1642
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { z as CONFIG_DIR } from "./registry-
|
|
2
|
-
import { t as createSubsystemLogger } from "./subsystem-
|
|
3
|
-
import { a as resolvePinnedHostnameWithPolicy, c as loadConfig } from "./ssrf-
|
|
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-
|
|
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-
|
|
3
|
-
import { _ as DEFAULT_MODEL, u as resolveConfiguredModelRef, v as DEFAULT_PROVIDER } from "./model-selection-
|
|
4
|
-
import { f as listChannelDocks, r as listThinkingLevels } from "./thinking-
|
|
5
|
-
import { r as normalizeChannelId } from "./plugins-
|
|
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-
|
|
3
|
-
import { t as createSubsystemLogger } from "./subsystem-
|
|
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 {
|
|
@@ -1,7 +1,21 @@
|
|
|
1
1
|
// ── Slash command autocomplete for the prompt input ─────────────────────
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
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, "<")
|
|
80
|
+
.replace(/>/g, ">")
|
|
81
|
+
.replace(/"/g, """);
|
|
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
|
-
|
|
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((
|
|
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
|
-
|
|
82
|
-
|
|
83
|
-
.replace(/&/g, "&")
|
|
84
|
-
.replace(/</g, "<")
|
|
85
|
-
.replace(/>/g, ">")
|
|
86
|
-
.replace(/"/g, """);
|
|
231
|
+
dropdown.innerHTML = html;
|
|
232
|
+
dropdown.classList.add("open");
|
|
87
233
|
}
|
|
88
234
|
|
|
89
|
-
function
|
|
90
|
-
const
|
|
91
|
-
if (!
|
|
92
|
-
isOpen = false;
|
|
93
|
-
render();
|
|
235
|
+
function applySelection() {
|
|
236
|
+
const entry = filtered[selectedIndex];
|
|
237
|
+
if (!entry) {
|
|
94
238
|
return;
|
|
95
239
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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
|
|
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
|
});
|