@openspecui/core 9.0.2 → 10.0.0
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/{active-root-config-DxYz3yKb.d.mts → active-root-config-N3lOotoq.d.mts} +13 -13
- package/dist/active-root-config.d.mts +5 -5
- package/dist/app-daemon-control.d.mts +8 -8
- package/dist/{cli-projection-Bf5KrMN0.d.mts → cli-projection-bB650ru4.d.mts} +9 -9
- package/dist/cli-projection.d.mts +5 -5
- package/dist/{workflow-CmQ4pFYC.mjs → command-result-DWMmDl6I.mjs} +91 -80
- package/dist/{dashboard-summary-transport-BNOPiGUP.d.mts → dashboard-summary-transport-DcyVID8z.d.mts} +3728 -3631
- package/dist/dashboard-summary-transport.d.mts +18 -18
- package/dist/{document-translation-CBqubtWC.d.mts → document-translation-DM2eydNr.d.mts} +2 -2
- package/dist/document-translation.d.mts +1 -1
- package/dist/hosted-app.d.mts +18 -18
- package/dist/hosted-contract.d.mts +18 -18
- package/dist/{index-CajHC-38.d.mts → index-CW5hcqKC.d.mts} +12277 -7316
- package/dist/index.d.mts +19 -19
- package/dist/index.mjs +513 -184
- package/dist/{local-download-profiles-Cu0nXbF1.d.mts → local-download-profiles-DXmw0Zs3.d.mts} +1 -1
- package/dist/local-download-profiles.d.mts +2 -2
- package/dist/local-download-profiles.mjs +1 -1
- package/dist/{notifications-D0M-01SA.d.mts → notifications-BQhnmovr.d.mts} +13 -13
- package/dist/notifications.d.mts +2 -2
- package/dist/{openspec-compat-B246EQNW.mjs → openspec-compat-DctIDxRM.mjs} +23 -17
- package/dist/openspec-compat.d.mts +4 -76
- package/dist/openspec-compat.mjs +2 -2
- package/dist/{openspec-projection-DKHk3L2e.d.mts → openspec-projection-FKuNsfBp.d.mts} +1 -1
- package/dist/openspec-projection.d.mts +2 -2
- package/dist/{opsx-entity-eoJAox1u.d.mts → opsx-entity-CulylXeK.d.mts} +2 -2
- package/dist/opsx-entity.d.mts +7 -7
- package/dist/{opsx-schema-detail-C3xm4DKk.d.mts → opsx-schema-detail-C9kNWQmO.d.mts} +2 -2
- package/dist/opsx-schema-detail.d.mts +8 -8
- package/dist/{opsx-types-DXBwJP68.d.mts → opsx-types-BeQJ4Le_.d.mts} +81 -81
- package/dist/{planning-cli-projection-DV22v3Xl.mjs → planning-cli-projection-pq8vZC1r.mjs} +2 -2
- package/dist/planning-cli-projection.d.mts +18 -18
- package/dist/planning-cli-projection.mjs +3 -3
- package/dist/{schemas-CxBYcq-e.d.mts → schemas-BIaPbul1.d.mts} +66 -66
- package/dist/{sounds-X-Wf5v3V.d.mts → sounds-CxSkCgKh.d.mts} +8 -8
- package/dist/sounds.d.mts +1 -1
- package/dist/{spec-catalog-Ce3uSLSc.mjs → spec-catalog-BkX0tZp9.mjs} +149 -2
- package/dist/spec-catalog.d.mts +18 -18
- package/dist/spec-catalog.mjs +2 -2
- package/dist/{store-mutation-protocol-B0e6UlO3.d.mts → store-mutation-protocol-DXeWtAvN.d.mts} +36 -36
- package/dist/store-mutation-protocol.d.mts +1 -1
- package/dist/{store-types-DhoV8sV7.d.mts → store-types-TDbmbvPx.d.mts} +1 -1
- package/dist/store-types.d.mts +5 -5
- package/dist/task-progress.d.mts +6 -6
- package/dist/{terminal-audio-D5CfhorV.d.mts → terminal-audio-R-3VBy0x.d.mts} +1 -1
- package/dist/terminal-audio.d.mts +2 -2
- package/dist/terminal-audio.mjs +1 -1
- package/dist/terminal-control.d.mts +2 -2
- package/dist/{terminal-invocation-C71aMyAX.d.mts → terminal-invocation-C8mSioBZ.d.mts} +93 -93
- package/dist/terminal-invocation.d.mts +1 -1
- package/dist/terminal-theme.mjs +1 -1
- package/dist/translation-language-pair.mjs +1 -1
- package/dist/{translator-BgCkaOkw.d.mts → translator-CVkc7MHh.d.mts} +91 -91
- package/dist/translator.d.mts +1 -1
- package/package.json +3 -2
- /package/dist/{local-download-profiles-BRsR1-kK.mjs → local-download-profiles-3I8AOUJj.mjs} +0 -0
- /package/dist/{terminal-audio-ELHVH24M.mjs → terminal-audio-CLEDFFpW.mjs} +0 -0
- /package/dist/{terminal-theme-C6BPfQ2G.mjs → terminal-theme-Bse1UdaX.mjs} +0 -0
- /package/dist/{translation-language-pair-CWLlH7Ab.mjs → translation-language-pair-BTfLQehX.mjs} +0 -0
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { A as
|
|
1
|
+
import { A as isCliBatchStatusEntryFailure, C as CliStoreDoctorSchema, E as CliStoreSchema, M as requireCanonicalOpenSpecSpecId, N as requireOpenSpecEntityRelativePath, O as CliSchemasSuccessSchema, S as CliStoreDoctorEntrySchema, T as CliStoreMutationSchema, _ as specRoutePath, a as SpecDocumentProjectionSchema, b as CliDoctorSchema, c as createStaticSpecCatalogOwnedProjection, d as getSpecCatalogEntry, f as isReferencedSpecIdentity, g as specIdentityKey, h as specIdentityFromRoute, i as SpecCommandEvidenceSchema, j as requireCanonicalOpenSpecEntityId, k as isCliSchemasFailure, l as createStaticSpecCatalogReferenceProjection, m as specDocumentDisplayPath, n as ReferencedSpecIdentitySchema, o as SpecIdentitySchema, p as mergeSpecCatalog, r as SpecCatalogSchema, s as buildSpecCatalog, t as OwnedSpecIdentitySchema, u as createStaticSpecCatalogReferenceSource, v as OpenSpecCliContractExecutor, w as CliStoreListSchema, x as CliStoreCleanupSchema, y as CliContextSchema } from "./spec-catalog-BkX0tZp9.mjs";
|
|
2
2
|
import { _ as isTextLikeMime, a as DeltaSpecSchema, c as ScenarioStepSchema, d as TrackedTaskProgressSchema, f as FILE_PREVIEW_KINDS, g as isTextLikeFile, h as isPreviewableFile, i as DeltaSchema, l as SpecSchema, m as inferFilePreviewKind, n as ChangeSchema, o as RequirementSchema, p as inferFileMime, r as DeltaOperationType, s as ScenarioStepKeywordSchema, t as ChangeFileSchema, u as TaskSchema } from "./schemas-CMThmKx1.mjs";
|
|
3
3
|
import { a as normalizeOpsxEntityPath, c as parseOpsxEntityMetadata, i as isOpsxGlobPattern, n as getOpsxEntityMetadataPath, o as opsxGlobToRegex, r as getOpsxEntityRootRelativePath, s as opsxPathMatchesPattern, t as buildOpsxEntityDetail } from "./opsx-entity-BnO3k48r.mjs";
|
|
4
4
|
import { t as parseOpsxSchemaDetail } from "./opsx-schema-detail-zk8ePaKK.mjs";
|
|
@@ -8,7 +8,7 @@ import { a as getOpenSpecAnnotationsForFact, i as getOpenSpecAnnotation, n as an
|
|
|
8
8
|
import { a as getOpenSpecReadingSections, c as projectOpenSpecMarkdown, i as getOpenSpecProjectionAnnotation, n as OPEN_SPEC_SPEC_PROJECTION_ID, o as parseOpenSpecMarkdownToSpec, r as createOpenSpecReadingPlugin, s as projectAnnotatedOpenSpecToSpec, t as OPEN_SPEC_READING_SECTIONS_PROJECTION_ID } from "./openspec-projection-Cno7FlwE.mjs";
|
|
9
9
|
import { a as isMarkdownTaskSourcePath, c as toggleMarkdownTask, i as deriveTrackedTaskPhase, n as createDocumentChecklistSummary, o as parseMarkdownTasks, r as createTrackedTaskProgress, s as projectTaskProjectionsFromMarkdownFiles, t as createApplyInstructionProgress } from "./task-progress-Bvid_Ws8.mjs";
|
|
10
10
|
import { a as CliRootSchema, i as CliReferenceIndexEntrySchema, n as CliDiagnosticSchema, o as CliRootSourceSchema, r as CliDoctorReferenceEntrySchema, t as CliDiagnosticFailureSchema } from "./common-BRL_34xt.mjs";
|
|
11
|
-
import { C as
|
|
11
|
+
import { C as CliValidateReportSchema, D as CliWorkflowStatusSuccessSchema, E as CliWorkflowStatusSchema, _ as CliShowSpecDocumentSchema, a as CliApplyInstructionsSuccessSchema, c as CliArchiveSchema, f as CliChangeListSchema, i as CliApplyInstructionsSchema, l as CliArtifactInstructionsSchema, n as parseCliCommandResult, o as CliArchiveInstructionsSchema, s as CliArchiveInstructionsSuccessSchema, t as CliCommandTransportSchema, u as CliArtifactInstructionsSuccessSchema, v as CliShowSpecSchema, w as CliValidateSchema, y as CliSpecListSchema } from "./command-result-DWMmDl6I.mjs";
|
|
12
12
|
import { a as CliProjectionInvalidationCauseSchema, d as toCliProjectionCommandEvidence, f as toCliProjectionFailure, i as CliProjectionFailureSchema, l as cliProjectionStates, n as CliProjectionCommandError, o as CliProjectionNoticeSchema, p as toCliProjectionNotice, r as CliProjectionCommandEvidenceSchema, s as CliProjectionStateNameSchema, t as CliJsonValueSchema, u as createCliProjectionStateSchema } from "./cli-projection-Bc2WVwGj.mjs";
|
|
13
13
|
import { $ as shouldShowTranslationEngineInstallGate, A as TranslationEngineIdSchema, B as TranslationLocalLlamaSettingsUpdateSchema, C as TranslationDownloadGroupPlanSchema, D as TranslationEngineDependencyStatusSchema, E as TranslationEngineDependencyStateSchema, F as TranslationEngineRuntimeStateSchema, G as createTranslationEngineLifecycleStatus, H as TranslationLocalSettingsUpdateSchema, I as TranslationEngineRuntimeStatusSchema, J as getTranslationEngineManifest, K as getManagedLocalTranslationEngineManifest, L as TranslationLocalCt2SettingsSchema, M as TranslationEngineInstallLogStreamSchema, N as TranslationEngineLifecycleEventSchema, O as TranslationEngineGlobalSettingsSchema, P as TranslationEngineLifecycleStatusSchema, Q as isTranslationEngineRuntimeReady, R as TranslationLocalCt2SettingsUpdateSchema, S as TranslationDownloadFilePlanSchema, T as TranslationEngineAssetStatusSchema, U as TranslationOpenAISettingsSchema, V as TranslationLocalSettingsSchema, W as TranslationOpenAISettingsUpdateSchema, X as isManagedLocalTranslationEngineId, Y as isDirectionalManagedLocalTranslationEngineId, Z as isTranslationEngineDependencyReady, _ as SERVICE_TRANSLATION_ENGINE_IDS, a as LocalModelAssetLogSchema, b as TRANSLATION_ENGINE_MANIFESTS, c as LocalModelDownloadStatusSchema, d as LocalModelProfileLoadStateSchema, et as isBatchTranslationAbort, f as LocalModelProfileManifestFileSchema, g as ManagedLocalCatalogSourceSchema, h as LocalModelProfileStatusSchema, i as DEFAULT_TRANSLATION_ENGINE_ID, j as TranslationEngineInstallLogEventSchema, k as TranslationEngineGlobalSettingsUpdateSchema, l as LocalModelLifecycleFileStateSchema, m as LocalModelProfileManifestSchema, n as BatchTranslateInputSchema, nt as runControlledTranslationTask, o as LocalModelAssetPlanSnapshotSchema, p as LocalModelProfileManifestGroupSchema, q as getTranslationEngineLifecycleMessage, s as LocalModelAssetStateSchema, t as BatchTranslateEventSchema, tt as normalizeBatchTranslationError, u as LocalModelLifecycleGroupStateSchema, v as ServiceTranslationEngineIdSchema, w as TranslationEngineAssetStateSchema, x as TRANSLATOR_CONTRACT_VERSION, y as TRANSLATION_ENGINE_IDS, z as TranslationLocalLlamaSettingsSchema } from "./translator-BkNACZ9R.mjs";
|
|
14
14
|
import { a as ActiveRootOfficialConfigSchema, c as MAX_ACTIVE_ROOT_CONTEXT_BYTES, i as ActiveRootMutationSchema, n as patchActiveRootOfficialFields, o as ActiveRootRevisionSchema, r as validateActiveRootRawYaml, s as ActiveRootStructuredUpdateSchema, t as inspectActiveRootOfficialConfig } from "./active-root-config-K_wVeuI3.mjs";
|
|
@@ -16,12 +16,12 @@ import { a as DocumentTranslationDisplayModeSchema, c as TRANSLATION_CACHE_POLIC
|
|
|
16
16
|
import { _ as customHashFromSoundId, a as CustomSoundHashSchema, b as soundIdFromCustomHash, c as CustomSoundMetadataSchema, f as LEGACY_SOUND_ID_MAP, g as SoundVolumeSchema, h as SoundIdSchema, i as CUSTOM_SOUND_ADD_VALUE, l as DEFAULT_BELL_SOUND_ID, m as SoundConfigIdSchema, n as BUILTIN_SOUND_OPTIONS, o as CustomSoundIdSchema, p as SILENT_SOUND_ID, r as BuiltinSoundIdSchema, s as CustomSoundMetadataFileSchema, t as BUILTIN_SOUND_IDS, u as DEFAULT_NOTIFICATION_SOUND_ID, v as getBuiltinSoundUrl, y as normalizeLegacySoundId } from "./sounds-cd9lIDxN.mjs";
|
|
17
17
|
import { n as terminalNotificationEventToPublishInput, t as TerminalControlParser } from "./terminal-control-D893EEN_.mjs";
|
|
18
18
|
import { a as NotificationPublishInputSchema, c as NotificationSoundSchema, h as groupNotifications, i as NotificationGroupKeySchema, l as NotificationSourceSchema, m as getNotificationGroupLabel, n as NOTIFICATION_SOUND_VALUES, o as NotificationRecordSchema, p as getNotificationGroupKey, r as NotificationActionSchema, s as NotificationSettingsSchema, t as NOTIFICATION_SOUND_OPTIONS, u as TerminalNotificationParser } from "./notifications-D6XlgL9b.mjs";
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import { i as
|
|
22
|
-
import { n as
|
|
23
|
-
import {
|
|
24
|
-
import { h as
|
|
19
|
+
import { h as parseOpenSpecCliVersion, p as deriveOpenSpecCliCapabilities, u as OPENSPEC_CLI_TARGET_SERIES } from "./openspec-compat-DctIDxRM.mjs";
|
|
20
|
+
import { n as TERMINAL_BELL_SOUND_VALUES, r as TerminalBellSoundSchema, t as TERMINAL_BELL_SOUND_OPTIONS } from "./terminal-audio-CLEDFFpW.mjs";
|
|
21
|
+
import { a as TERMINAL_THEME_VALUES, i as TERMINAL_THEME_MODE_VALUES, n as DEFAULT_TERMINAL_LIGHT_THEME, r as DEFAULT_TERMINAL_THEME_MODE, t as DEFAULT_TERMINAL_DARK_THEME } from "./terminal-theme-Bse1UdaX.mjs";
|
|
22
|
+
import { i as selectLocalDownloadGroup, n as buildLocalDownloadPlanFromRepositoryFiles, r as buildLocalDownloadPlanFromRuntimeProfileFiles, t as LOCAL_MODEL_PROFILE_DEFINITIONS } from "./local-download-profiles-3I8AOUJj.mjs";
|
|
23
|
+
import { n as inferLocalDirectionalModelLanguagePair, t as checkLocalDirectionalModelLanguagePair } from "./translation-language-pair-BTfLQehX.mjs";
|
|
24
|
+
import { C as SchemaResolutionSchema, D as isGlobPattern, E as TemplatesSchema, S as SchemaInfoSchema, T as TemplateContentSchema, _ as OpsxCliEvidenceSchema, a as PlanningCliProjectionDataSchema, b as SchemaArtifactSchema, c as ApplyInstructionsContextFilesSchema, d as ApplyTaskSchema, f as ArchiveInstructionsSchema, g as DependencyInfoSchema, h as ChangeStatusSchema, i as EnvironmentGlobalProjectionStateSchema, l as ApplyInstructionsProjectionSchema, m as ArtifactStatusSchema, n as EnvironmentGlobalFileProjectionStateSchema, o as PlanningCliProjectionSelectorSchema, p as ArtifactInstructionsSchema, r as EnvironmentGlobalProjectionDataSchema, s as PlanningCliProjectionStateSchema, t as EnvironmentGlobalFileProjectionDataSchema, u as ApplyInstructionsSchema, v as OpsxConfigBundleSchema, w as TemplateContentMapSchema, x as SchemaDetailSchema, y as OpsxStatusEvidenceSchema } from "./planning-cli-projection-pq8vZC1r.mjs";
|
|
25
25
|
import { a as OPSX_CORE_PROFILE_WORKFLOWS, c as OPSX_WORKFLOW_TO_SKILL_DIR, i as OPSX_COMMAND_CAPABLE_WORKFLOWS, l as isOpsxCoreWorkflowSelection, n as OPSX_ARTIFACT_INPUT_ACTIONS, o as OPSX_TEXT_INPUT_ACTIONS, r as OPSX_CHANGE_INPUT_ACTIONS, s as OPSX_WORKFLOW_LABELS, t as OPSX_ALL_WORKFLOWS } from "./opsx-workflows-BA-46T7_.mjs";
|
|
26
26
|
import { a as DASHBOARD_METRIC_KEYS, c as DashboardSummaryProjectionSchema, i as DashboardSummaryProjectionStateSchema, l as DashboardTrendsProjectionSchema, n as DashboardSummaryInvalidationCauseSchema, o as DashboardGitSnapshotSchema, r as DashboardSummaryInvalidationSchema, s as DashboardOverviewSchema, t as DashboardSummaryIdentitySchema } from "./dashboard-summary-transport-Do8pzSES.mjs";
|
|
27
27
|
import { a as StoreListResultSchema, n as StoreDoctorResultSchema, o as classifyStoreCliResult, s as toStoreFeatureResult } from "./store-types-C87SlrJ3.mjs";
|
|
@@ -38,7 +38,7 @@ import { createHash, randomBytes, randomUUID } from "node:crypto";
|
|
|
38
38
|
import { access, lstat, mkdir as mkdir$1, open, readFile, readdir, realpath, rename, rm, stat, writeFile as writeFile$1 } from "node:fs/promises";
|
|
39
39
|
import { basename, dirname as dirname$1, extname, isAbsolute, join as join$1, matchesGlob, posix, relative, resolve, sep, win32 } from "node:path";
|
|
40
40
|
import { setTimeout as setTimeout$1 } from "node:timers/promises";
|
|
41
|
-
import { existsSync, lstatSync, readFileSync, realpathSync } from "node:fs";
|
|
41
|
+
import { existsSync, lstatSync, readFileSync, realpathSync, statSync } from "node:fs";
|
|
42
42
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
43
43
|
import { z } from "zod";
|
|
44
44
|
import { EventEmitter } from "events";
|
|
@@ -2738,6 +2738,11 @@ function sanitizePersistedSettings(value, rules) {
|
|
|
2738
2738
|
//#region src/child-process-tree.ts
|
|
2739
2739
|
const execFileAsync$1 = promisify$1(execFile$1);
|
|
2740
2740
|
const WINDOWS_PROCESS_TABLE_MAX_BUFFER = 16 * 1024 * 1024;
|
|
2741
|
+
/**
|
|
2742
|
+
* In-flight serialization for Win32_Process reads. Multiple tests reading the full
|
|
2743
|
+
* process table concurrently delays WMI settlement past their bounded timeouts.
|
|
2744
|
+
*/
|
|
2745
|
+
let processTableReadInFlight = null;
|
|
2741
2746
|
function hasChildExited(child) {
|
|
2742
2747
|
return child.exitCode !== null || child.signalCode !== null;
|
|
2743
2748
|
}
|
|
@@ -2751,21 +2756,29 @@ function isWindowsProcessRecord(value) {
|
|
|
2751
2756
|
}
|
|
2752
2757
|
/** Read the current Windows process table used for exact ancestry and root ownership checks. */
|
|
2753
2758
|
async function readWindowsProcessTable() {
|
|
2754
|
-
|
|
2755
|
-
|
|
2756
|
-
"
|
|
2757
|
-
|
|
2758
|
-
|
|
2759
|
-
|
|
2760
|
-
|
|
2761
|
-
|
|
2762
|
-
|
|
2763
|
-
|
|
2764
|
-
|
|
2765
|
-
|
|
2766
|
-
|
|
2767
|
-
|
|
2768
|
-
|
|
2759
|
+
if (processTableReadInFlight) return processTableReadInFlight;
|
|
2760
|
+
processTableReadInFlight = (async () => {
|
|
2761
|
+
const { stdout } = await execFileAsync$1("powershell.exe", [
|
|
2762
|
+
"-NoLogo",
|
|
2763
|
+
"-NoProfile",
|
|
2764
|
+
"-NonInteractive",
|
|
2765
|
+
"-Command",
|
|
2766
|
+
"[Console]::OutputEncoding = [Text.UTF8Encoding]::new($false); Get-CimInstance Win32_Process | Select-Object ProcessId,ParentProcessId,ExecutablePath | ConvertTo-Json -Compress"
|
|
2767
|
+
], {
|
|
2768
|
+
encoding: "utf8",
|
|
2769
|
+
maxBuffer: WINDOWS_PROCESS_TABLE_MAX_BUFFER,
|
|
2770
|
+
windowsHide: true
|
|
2771
|
+
});
|
|
2772
|
+
const json = stdout.trim();
|
|
2773
|
+
if (json.length === 0) return [];
|
|
2774
|
+
const parsed = JSON.parse(json);
|
|
2775
|
+
return (Array.isArray(parsed) ? parsed : [parsed]).filter(isWindowsProcessRecord);
|
|
2776
|
+
})();
|
|
2777
|
+
try {
|
|
2778
|
+
return await processTableReadInFlight;
|
|
2779
|
+
} finally {
|
|
2780
|
+
processTableReadInFlight = null;
|
|
2781
|
+
}
|
|
2769
2782
|
}
|
|
2770
2783
|
/** Terminate a Windows tree only when the root PID still owns the expected executable. */
|
|
2771
2784
|
async function terminateWindowsProcessTreeByIdentity(rootPid, expectedExecutablePath) {
|
|
@@ -2808,12 +2821,16 @@ async function terminateChildProcessTree(child, signal = "SIGTERM") {
|
|
|
2808
2821
|
//#endregion
|
|
2809
2822
|
//#region src/command-invocation.ts
|
|
2810
2823
|
/**
|
|
2811
|
-
* Orthogonal intents (
|
|
2824
|
+
* Orthogonal intents (updated 2026-08-28 Asia/Shanghai):
|
|
2812
2825
|
* 1. Resolve caller-environment Windows commands to native argv-preserving executable boundaries.
|
|
2813
2826
|
* 2. Project standard npm-style shims and explicit Node shebang launchers onto their real Node executable.
|
|
2814
2827
|
* 3. Prefer native executables, route shell-sensitive pnpm through Corepack, and reject opaque command shims.
|
|
2828
|
+
* 4. Extract modern (`%dp0%`) and legacy (`%~dp0`) npm shim entries under hardened containment
|
|
2829
|
+
* that admits only real files inside the shim directory or its `.bin` parent.
|
|
2815
2830
|
*
|
|
2816
2831
|
* Original request (2026-08-04): "Make pnpm openspecui start and equivalent package scripts work on Windows."
|
|
2832
|
+
* Original request (2026-08-28, issue #258): "No available OpenSpec CLI runner." — npm ≥7 `cmd-shim`
|
|
2833
|
+
* references its entry through the `%dp0%` variable, which the legacy-only extractor missed.
|
|
2817
2834
|
*/
|
|
2818
2835
|
const WINDOWS_NATIVE_EXTENSIONS = new Set([".com", ".exe"]);
|
|
2819
2836
|
function isBareCommand(command$1) {
|
|
@@ -2837,7 +2854,7 @@ function findWindowsCommandCandidates(command$1, options) {
|
|
|
2837
2854
|
windowsHide: true
|
|
2838
2855
|
});
|
|
2839
2856
|
if (result.error) throw result.error;
|
|
2840
|
-
if (result.status !== 0) throw new Error(result.stderr.trim() || `Unable to resolve ${command$1} from PATH.`);
|
|
2857
|
+
if (result.status !== 0) throw Object.assign(new Error(result.stderr.trim() || `Unable to resolve ${command$1} from PATH.`), { code: "ENOENT" });
|
|
2841
2858
|
return result.stdout.split(/\r?\n/).map((candidate) => candidate.trim()).filter(Boolean);
|
|
2842
2859
|
}
|
|
2843
2860
|
function tryFindWindowsCommandCandidates(command$1, options) {
|
|
@@ -2871,17 +2888,76 @@ function findNodeExecutable(commandShim, options) {
|
|
|
2871
2888
|
if (process$1.release.name === "node" && extname(process$1.execPath).toLowerCase() === ".exe") return process$1.execPath;
|
|
2872
2889
|
throw new Error(`Unable to resolve the Node executable required by ${commandShim}.`);
|
|
2873
2890
|
}
|
|
2891
|
+
const NODE_COMMAND_SHIM_GUARD_PATTERN = /(?:node(?:\.exe)?|node_exe|npm_node_execpath|_prog)/i;
|
|
2892
|
+
/**
|
|
2893
|
+
* npm shim generations reference their entry relative to the shim directory through two shapes:
|
|
2894
|
+
* the legacy literal `%~dp0\path\entry.js` and the modern (cmd-shim v4+, npm ≥7) variable form
|
|
2895
|
+
* `SET dp0=%~dp0` … `"%dp0%\path\entry.js"`.
|
|
2896
|
+
*/
|
|
2897
|
+
const NODE_COMMAND_SHIM_ENTRY_PATTERN = /%(?:~dp0|dp0%)([^"\r\n]*?\.(?:c|m)?js)/gi;
|
|
2898
|
+
/** Raw dp0-relative JavaScript entry references found in one npm-style command shim. */
|
|
2899
|
+
function extractNodeCommandShimEntryTokens(source) {
|
|
2900
|
+
const tokens = [];
|
|
2901
|
+
for (const match of source.matchAll(NODE_COMMAND_SHIM_ENTRY_PATTERN)) {
|
|
2902
|
+
const rawToken = match[1]?.trim() ?? "";
|
|
2903
|
+
if (rawToken.startsWith("\\\\") || rawToken.startsWith("//")) continue;
|
|
2904
|
+
const token = rawToken.replace(/^[/\\]+/, "");
|
|
2905
|
+
if (token) tokens.push(token);
|
|
2906
|
+
}
|
|
2907
|
+
return tokens;
|
|
2908
|
+
}
|
|
2909
|
+
function isContainableShimEntryToken(token, normalizedToken) {
|
|
2910
|
+
if (!token) return false;
|
|
2911
|
+
if (token.includes("\0")) return false;
|
|
2912
|
+
if (/^[a-zA-Z]:/.test(normalizedToken)) return false;
|
|
2913
|
+
if (token.startsWith("\\\\") || normalizedToken.startsWith("//")) return false;
|
|
2914
|
+
return !token.includes("%");
|
|
2915
|
+
}
|
|
2916
|
+
function isWithinDirectory(root, candidate) {
|
|
2917
|
+
const relativePath = relative(root, candidate);
|
|
2918
|
+
return relativePath !== "" && !relativePath.startsWith("..") && !isAbsolute(relativePath);
|
|
2919
|
+
}
|
|
2920
|
+
function resolveExistingShimEntry(commandShim, token) {
|
|
2921
|
+
const normalizedToken = token.replace(/\\/g, "/");
|
|
2922
|
+
if (!isContainableShimEntryToken(token, normalizedToken)) return null;
|
|
2923
|
+
const entry = resolve(dirname$1(commandShim), normalizedToken);
|
|
2924
|
+
let realEntry;
|
|
2925
|
+
let realShimDirectory;
|
|
2926
|
+
try {
|
|
2927
|
+
realEntry = realpathSync.native(entry);
|
|
2928
|
+
realShimDirectory = dirname$1(realpathSync.native(commandShim));
|
|
2929
|
+
} catch {
|
|
2930
|
+
return null;
|
|
2931
|
+
}
|
|
2932
|
+
let stats;
|
|
2933
|
+
try {
|
|
2934
|
+
stats = statSync(realEntry);
|
|
2935
|
+
} catch {
|
|
2936
|
+
return null;
|
|
2937
|
+
}
|
|
2938
|
+
if (!stats.isFile()) return null;
|
|
2939
|
+
const realShimParent = dirname$1(realShimDirectory);
|
|
2940
|
+
const withinShimDirectory = isWithinDirectory(realShimDirectory, realEntry);
|
|
2941
|
+
const withinDotBinParent = basename(realShimDirectory).toLowerCase() === ".bin" && isWithinDirectory(realShimParent, realEntry);
|
|
2942
|
+
if (!withinShimDirectory && !withinDotBinParent) return null;
|
|
2943
|
+
return realEntry;
|
|
2944
|
+
}
|
|
2945
|
+
/**
|
|
2946
|
+
* Resolve the JavaScript entry one standard npm-style Node command shim delegates to, or null
|
|
2947
|
+
* when no dp0-relative entry survives containment validation.
|
|
2948
|
+
*/
|
|
2949
|
+
function resolveNodeCommandShimEntry(commandShim, source) {
|
|
2950
|
+
const tokens = extractNodeCommandShimEntryTokens(source);
|
|
2951
|
+
for (let index = tokens.length - 1; index >= 0; index -= 1) {
|
|
2952
|
+
const entry = resolveExistingShimEntry(commandShim, tokens[index] ?? "");
|
|
2953
|
+
if (entry) return entry;
|
|
2954
|
+
}
|
|
2955
|
+
return null;
|
|
2956
|
+
}
|
|
2874
2957
|
function resolveNodeCommandShim(commandShim, args, options) {
|
|
2875
2958
|
const source = readFileSync(commandShim, "utf8");
|
|
2876
|
-
if (
|
|
2877
|
-
const
|
|
2878
|
-
for (const match of source.matchAll(/%~dp0([^"\r\n]*?\.(?:c|m)?js)/gi)) {
|
|
2879
|
-
const relativeEntry = match[1]?.trim().replace(/^[\\/]+/, "");
|
|
2880
|
-
if (!relativeEntry) continue;
|
|
2881
|
-
const entry$1 = resolve(dirname$1(commandShim), relativeEntry);
|
|
2882
|
-
if (existsSync(entry$1)) entries.push(entry$1);
|
|
2883
|
-
}
|
|
2884
|
-
const entry = entries.at(-1);
|
|
2959
|
+
if (!NODE_COMMAND_SHIM_GUARD_PATTERN.test(source)) return null;
|
|
2960
|
+
const entry = resolveNodeCommandShimEntry(commandShim, source);
|
|
2885
2961
|
if (!entry) return null;
|
|
2886
2962
|
return {
|
|
2887
2963
|
command: findNodeExecutable(commandShim, options),
|
|
@@ -3173,7 +3249,7 @@ function runBufferedCommand(options) {
|
|
|
3173
3249
|
//#endregion
|
|
3174
3250
|
//#region src/config.ts
|
|
3175
3251
|
/**
|
|
3176
|
-
* Orthogonal intents (updated 2026-
|
|
3252
|
+
* Orthogonal intents (updated 2026-08-28 Asia/Shanghai):
|
|
3177
3253
|
* 1. Define and persist project-scoped OpenSpecUI settings.
|
|
3178
3254
|
* 2. Resolve, diagnose, cache, and explicitly invalidate the OpenSpec CLI runner.
|
|
3179
3255
|
* 3. Prevent retired in-flight runner resolutions from reclaiming cache ownership.
|
|
@@ -3182,7 +3258,11 @@ function runBufferedCommand(options) {
|
|
|
3182
3258
|
* extension-less script (issue #209 hotfix).
|
|
3183
3259
|
* 6. Hide runner-probe subprocess console windows (`windowsHide`) so a console-less Windows daemon
|
|
3184
3260
|
* never flashes a cmd window while resolving or sniffing the CLI runner.
|
|
3261
|
+
* 7. Pin auto-fallback runners to the supported CLI series and probe the global CLI through the
|
|
3262
|
+
* spawn-safe boundary so resolved `.cmd` shims execute instead of failing EINVAL (issue #258).
|
|
3185
3263
|
*
|
|
3264
|
+
* Original request (2026-08-28, issue #258): "No available OpenSpec CLI runner." on Windows with an
|
|
3265
|
+
* in-range global npm CLI; the npx fallback resolved an out-of-range `@latest`.
|
|
3186
3266
|
* Original request (2026-08-14): "在Windows平台上,执行命令总是会弹出cmd窗口,这个可否统一隐藏,你先调查一下原因"
|
|
3187
3267
|
* Original request (2026-07-14): "openspec 1.6.0 已经放出,我们需要开始进行适配。"
|
|
3188
3268
|
* Independent review correction (2026-07-20): Global CLI installation must retire cached and
|
|
@@ -3225,6 +3305,7 @@ const CodeEditorThemeSchema = z.enum(CODE_EDITOR_THEME_VALUES);
|
|
|
3225
3305
|
function isTerminalRendererEngine(value) {
|
|
3226
3306
|
return TERMINAL_RENDERER_ENGINE_VALUES.includes(value);
|
|
3227
3307
|
}
|
|
3308
|
+
const OPENSPEC_CLI_FALLBACK_SPEC = `@fission-ai/openspec@${OPENSPEC_CLI_TARGET_SERIES}`;
|
|
3228
3309
|
const BASE_PACKAGE_MANAGER_RUNNERS = [
|
|
3229
3310
|
{
|
|
3230
3311
|
id: "npx",
|
|
@@ -3232,13 +3313,13 @@ const BASE_PACKAGE_MANAGER_RUNNERS = [
|
|
|
3232
3313
|
commandParts: [
|
|
3233
3314
|
"npx",
|
|
3234
3315
|
"-y",
|
|
3235
|
-
|
|
3316
|
+
OPENSPEC_CLI_FALLBACK_SPEC
|
|
3236
3317
|
]
|
|
3237
3318
|
},
|
|
3238
3319
|
{
|
|
3239
3320
|
id: "bunx",
|
|
3240
3321
|
source: "bunx",
|
|
3241
|
-
commandParts: ["bunx",
|
|
3322
|
+
commandParts: ["bunx", OPENSPEC_CLI_FALLBACK_SPEC]
|
|
3242
3323
|
},
|
|
3243
3324
|
{
|
|
3244
3325
|
id: "deno",
|
|
@@ -3247,7 +3328,7 @@ const BASE_PACKAGE_MANAGER_RUNNERS = [
|
|
|
3247
3328
|
"deno",
|
|
3248
3329
|
"run",
|
|
3249
3330
|
"-A",
|
|
3250
|
-
|
|
3331
|
+
`npm:${OPENSPEC_CLI_FALLBACK_SPEC}`
|
|
3251
3332
|
]
|
|
3252
3333
|
},
|
|
3253
3334
|
{
|
|
@@ -3256,7 +3337,7 @@ const BASE_PACKAGE_MANAGER_RUNNERS = [
|
|
|
3256
3337
|
commandParts: [
|
|
3257
3338
|
"pnpm",
|
|
3258
3339
|
"dlx",
|
|
3259
|
-
|
|
3340
|
+
OPENSPEC_CLI_FALLBACK_SPEC
|
|
3260
3341
|
]
|
|
3261
3342
|
},
|
|
3262
3343
|
{
|
|
@@ -3265,7 +3346,7 @@ const BASE_PACKAGE_MANAGER_RUNNERS = [
|
|
|
3265
3346
|
commandParts: [
|
|
3266
3347
|
"yarn",
|
|
3267
3348
|
"dlx",
|
|
3268
|
-
|
|
3349
|
+
OPENSPEC_CLI_FALLBACK_SPEC
|
|
3269
3350
|
]
|
|
3270
3351
|
}
|
|
3271
3352
|
];
|
|
@@ -3563,15 +3644,16 @@ async function fetchLatestVersion() {
|
|
|
3563
3644
|
async function sniffGlobalCli() {
|
|
3564
3645
|
const env = createCleanCliEnv();
|
|
3565
3646
|
const resolvedCommand = await resolveShellExecutablePath("openspec", process.cwd(), env) ?? "openspec";
|
|
3566
|
-
const [localResult, latestVersion] = await Promise.all([
|
|
3647
|
+
const [localResult, latestVersion] = await Promise.all([runBufferedCommand({
|
|
3648
|
+
command: resolvedCommand,
|
|
3649
|
+
args: ["--version"],
|
|
3650
|
+
cwd: process.cwd(),
|
|
3567
3651
|
env,
|
|
3568
|
-
|
|
3569
|
-
|
|
3570
|
-
|
|
3571
|
-
|
|
3572
|
-
|
|
3573
|
-
const error = localResult.error instanceof Error ? localResult.error.message : String(localResult.error);
|
|
3574
|
-
if (error.includes("not found") || error.includes("ENOENT") || error.includes("not recognized")) return {
|
|
3652
|
+
timeoutMs: 1e4
|
|
3653
|
+
}), fetchLatestVersion()]);
|
|
3654
|
+
if (localResult.spawnError || localResult.timedOut || localResult.exitCode !== 0) {
|
|
3655
|
+
const message = localResult.spawnError?.message ?? (localResult.timedOut ? "Global CLI probe timed out." : localResult.stderr.trim() || `Exit code ${localResult.exitCode ?? "null"}`);
|
|
3656
|
+
if (localResult.spawnError?.code === "ENOENT" || /not found|ENOENT|not recognized|unable to resolve/i.test(message)) return {
|
|
3575
3657
|
hasGlobal: false,
|
|
3576
3658
|
latestVersion,
|
|
3577
3659
|
hasUpdate: !!latestVersion
|
|
@@ -3580,7 +3662,7 @@ async function sniffGlobalCli() {
|
|
|
3580
3662
|
hasGlobal: false,
|
|
3581
3663
|
latestVersion,
|
|
3582
3664
|
hasUpdate: !!latestVersion,
|
|
3583
|
-
error
|
|
3665
|
+
error: message
|
|
3584
3666
|
};
|
|
3585
3667
|
}
|
|
3586
3668
|
const version = localResult.stdout.trim();
|
|
@@ -5033,7 +5115,7 @@ function runOpenSpecCliWorker(options) {
|
|
|
5033
5115
|
//#endregion
|
|
5034
5116
|
//#region src/cli-executor.ts
|
|
5035
5117
|
/**
|
|
5036
|
-
* Orthogonal intents (updated 2026-08-
|
|
5118
|
+
* Orthogonal intents (updated 2026-08-28 Asia/Shanghai):
|
|
5037
5119
|
* 1. Execute buffered CLI work through process/Worker backends with runner recovery, observer-explicit
|
|
5038
5120
|
* OTel phase evidence, bounded probes, and owner-scoped disposal.
|
|
5039
5121
|
* 2. Own streaming CLI process trees through cancellation request, escalation, and confirmed settlement.
|
|
@@ -5042,10 +5124,13 @@ function runOpenSpecCliWorker(options) {
|
|
|
5042
5124
|
* 4. Expose the physically separated OpenSpec 1.6-1.9 typed command facade with response-Span delivery
|
|
5043
5125
|
* separate from late child-process settlement evidence.
|
|
5044
5126
|
* 5. Report eager-resolved exit codes as unknown instead of fabricated zeros.
|
|
5127
|
+
* 6. Pass the OpenSpec 1.10 `init --language` context-block option through init/initStream argv only
|
|
5128
|
+
* for a non-empty value.
|
|
5045
5129
|
*
|
|
5046
5130
|
* Original request (2026-07-15): "你先负责后端(内核)的开发。"
|
|
5047
5131
|
* Original request (2026-07-17): "A stream cancellation request is not child-process settlement."
|
|
5048
5132
|
* Original request (2026-08-15): "v9的适配需要同时适配 1.8和1.9。"
|
|
5133
|
+
* Original request (2026-08-28): "直接将 0.10.0 和 0.11.0 一起适配,然后发布 v11。"
|
|
5049
5134
|
*/
|
|
5050
5135
|
/** Failure raised when even forced termination cannot confirm child-process close. */
|
|
5051
5136
|
var CliStreamTerminationError = class extends Error {
|
|
@@ -5459,6 +5544,9 @@ var CliExecutor = class {
|
|
|
5459
5544
|
}
|
|
5460
5545
|
/**
|
|
5461
5546
|
* 执行 openspec init(非交互式)
|
|
5547
|
+
*
|
|
5548
|
+
* `language`(OpenSpec 1.10+)非空时透传 `--language <value>`;CLI 会在
|
|
5549
|
+
* openspec/config.yaml 写入固定三行 context 块,并拒绝覆盖已有配置。
|
|
5462
5550
|
*/
|
|
5463
5551
|
async init(options) {
|
|
5464
5552
|
const args = ["init"];
|
|
@@ -5468,6 +5556,7 @@ var CliExecutor = class {
|
|
|
5468
5556
|
}
|
|
5469
5557
|
if (options?.profile) args.push("--profile", options.profile);
|
|
5470
5558
|
if (options?.force) args.push("--force");
|
|
5559
|
+
if (options?.language) args.push("--language", options.language);
|
|
5471
5560
|
return this.execute(args);
|
|
5472
5561
|
}
|
|
5473
5562
|
/**
|
|
@@ -5752,6 +5841,8 @@ var CliExecutor = class {
|
|
|
5752
5841
|
}
|
|
5753
5842
|
/**
|
|
5754
5843
|
* 流式执行 openspec init
|
|
5844
|
+
*
|
|
5845
|
+
* `language`(OpenSpec 1.10+)非空时透传 `--language <value>`。
|
|
5755
5846
|
*/
|
|
5756
5847
|
initStream(options, onEvent) {
|
|
5757
5848
|
const args = ["init"];
|
|
@@ -5761,6 +5852,7 @@ var CliExecutor = class {
|
|
|
5761
5852
|
}
|
|
5762
5853
|
if (options.profile) args.push("--profile", options.profile);
|
|
5763
5854
|
if (options.force) args.push("--force");
|
|
5855
|
+
if (options.language) args.push("--language", options.language);
|
|
5764
5856
|
return this.executeStream(args, onEvent);
|
|
5765
5857
|
}
|
|
5766
5858
|
/** Stream the fixed project bootstrap command without installing Agent integrations. */
|
|
@@ -6205,26 +6297,57 @@ var RuntimeRootInvalidationRegistry = class {
|
|
|
6205
6297
|
//#endregion
|
|
6206
6298
|
//#region src/agent-delivery-registry.ts
|
|
6207
6299
|
/**
|
|
6208
|
-
* Orthogonal intents (updated 2026-08-
|
|
6209
|
-
* 1. Preserve the complete pinned OpenSpec 1.
|
|
6300
|
+
* Orthogonal intents (updated 2026-08-28 Asia/Shanghai):
|
|
6301
|
+
* 1. Preserve the complete pinned OpenSpec 1.11 Agent delivery registry in one typed physical owner.
|
|
6210
6302
|
* 2. Co-locate capability, command artifact, invocation, alias, setup, cleanup, and migration metadata.
|
|
6211
6303
|
* 3. Model current/legacy project roots, user-global skill roots, detection paths, and IDE restart facts.
|
|
6212
|
-
* 4.
|
|
6213
|
-
*
|
|
6304
|
+
* 4. Express the single per-series root divergence (Antigravity `.agent` -> `.agents`, 1.11 only)
|
|
6305
|
+
* as typed series overrides so each admitted line selects a faithful snapshot.
|
|
6306
|
+
* 5. Declare the shared `.agents` skills-root owner candidate set and its arbitration order as
|
|
6307
|
+
* metadata only; physical arbitration stays owned by the official CLI and the Server projection.
|
|
6308
|
+
* 6. Select the official inventory per admitted CLI line (1.10 / 1.11).
|
|
6214
6309
|
*
|
|
6215
6310
|
* Original request (2026-08-01): adapt the complete OpenSpec 1.7 Agent delivery protocol for OpenSpecUI 7.
|
|
6216
6311
|
* Original request (2026-08-15): "v9的适配需要同时适配 1.8和1.9。"
|
|
6312
|
+
* Original request (2026-08-28): "直接将 0.10.0 和 0.11.0 一起适配,然后发布 v11。"
|
|
6217
6313
|
*/
|
|
6218
6314
|
function agentCliSeriesOrder(series) {
|
|
6219
|
-
|
|
6315
|
+
switch (series) {
|
|
6316
|
+
case "1.9": return 9;
|
|
6317
|
+
case "1.10": return 10;
|
|
6318
|
+
case "1.11": return 11;
|
|
6319
|
+
}
|
|
6220
6320
|
}
|
|
6321
|
+
/** Physical project root shared by Codex, Zed Agent, and the vendor-neutral skills target. */
|
|
6322
|
+
const SHARED_AGENTS_SKILLS_ROOT = ".agents";
|
|
6323
|
+
/** Marker file the official CLI writes inside `<root>/skills/` to pin one shared-root writer. */
|
|
6324
|
+
const SHARED_SKILLS_TARGET_MARKER = ".openspec-target";
|
|
6325
|
+
/**
|
|
6326
|
+
* Candidate owners that may render the shared `.agents` skills root, in pinned upstream
|
|
6327
|
+
* registry order (`codex`, `zed`, `agents` on both admitted lines).
|
|
6328
|
+
*
|
|
6329
|
+
* Arbitration is owned by the official CLI and projected by the Server Agent delivery
|
|
6330
|
+
* service — never by this registry — and follows: the `.openspec-target` marker, then
|
|
6331
|
+
* the owner inferred from generated invocation syntax, then `agents` when current skills
|
|
6332
|
+
* already exist, then the `codex` fallback. Antigravity joins the shared root on 1.11
|
|
6333
|
+
* but is adapter-backed and is excluded from skills-writer candidacy; its own
|
|
6334
|
+
* `.agents/workflows` commands root is unaffected by that exclusion.
|
|
6335
|
+
*/
|
|
6336
|
+
const SHARED_AGENTS_SKILLS_OWNER_CANDIDATES = [
|
|
6337
|
+
"codex",
|
|
6338
|
+
"zed",
|
|
6339
|
+
"agents"
|
|
6340
|
+
];
|
|
6221
6341
|
/**
|
|
6222
6342
|
* Select the official Agent delivery inventory for one CLI version string.
|
|
6223
6343
|
*
|
|
6224
|
-
* Only a stable, admitted version — current (1.
|
|
6225
|
-
* an inventory. Unsupported forms (prereleases, >=1.
|
|
6226
|
-
*
|
|
6227
|
-
*
|
|
6344
|
+
* Only a stable, admitted version — current (1.11.x) or supported non-current
|
|
6345
|
+
* (1.10.x) — selects an inventory. Unsupported forms (prereleases, >=1.12,
|
|
6346
|
+
* below-range lines including 1.8/1.9) and unparseable output select none: a
|
|
6347
|
+
* page-level version bypass must not manufacture an admitted inventory for a
|
|
6348
|
+
* CLI the release line refuses to admit. The returned snapshot carries the
|
|
6349
|
+
* per-series physical reality of the selected line (Antigravity roots differ
|
|
6350
|
+
* between 1.10 and 1.11).
|
|
6228
6351
|
*/
|
|
6229
6352
|
function selectAgentDeliveryRegistry(cliVersion) {
|
|
6230
6353
|
const series = parseOpenSpecCliSeries(cliVersion);
|
|
@@ -6234,12 +6357,11 @@ function selectAgentDeliveryRegistry(cliVersion) {
|
|
|
6234
6357
|
if (tool.minCliSeries && agentCliSeriesOrder(tool.minCliSeries) > running) return false;
|
|
6235
6358
|
return true;
|
|
6236
6359
|
}).map((tool) => {
|
|
6237
|
-
|
|
6238
|
-
|
|
6239
|
-
|
|
6240
|
-
|
|
6241
|
-
|
|
6242
|
-
return { ...tool };
|
|
6360
|
+
const { perSeriesOverrides, ...selected } = tool;
|
|
6361
|
+
if (selected.requiresIdeRestart !== void 0 && selected.requiresIdeRestartSince && agentCliSeriesOrder(selected.requiresIdeRestartSince) > running) delete selected.requiresIdeRestart;
|
|
6362
|
+
const override = perSeriesOverrides?.[series];
|
|
6363
|
+
if (override) Object.assign(selected, override);
|
|
6364
|
+
return selected;
|
|
6243
6365
|
});
|
|
6244
6366
|
}
|
|
6245
6367
|
/**
|
|
@@ -6247,14 +6369,15 @@ function selectAgentDeliveryRegistry(cliVersion) {
|
|
|
6247
6369
|
*
|
|
6248
6370
|
* Delegates to the single compat version parser so the same stdout that classifies a session
|
|
6249
6371
|
* also selects its inventory — two parsers must never disagree at this boundary. Returns
|
|
6250
|
-
* '1.
|
|
6251
|
-
* form: prereleases, >=1.
|
|
6372
|
+
* '1.11' only for stable 1.11.x, '1.10' only for stable 1.10.x, and null for every
|
|
6373
|
+
* non-admitted form: prereleases, >=1.12, below-range lines (including 1.9.x), or
|
|
6374
|
+
* unparseable output.
|
|
6252
6375
|
*/
|
|
6253
6376
|
function parseOpenSpecCliSeries(cliVersion) {
|
|
6254
6377
|
const version = parseOpenSpecCliVersion(cliVersion ?? void 0);
|
|
6255
6378
|
if (!version || version.prerelease !== null) return null;
|
|
6256
|
-
if (version.major === 1 && version.minor ===
|
|
6257
|
-
if (version.major === 1 && version.minor ===
|
|
6379
|
+
if (version.major === 1 && version.minor === 11) return "1.11";
|
|
6380
|
+
if (version.major === 1 && version.minor === 10) return "1.10";
|
|
6258
6381
|
return null;
|
|
6259
6382
|
}
|
|
6260
6383
|
const CODEX_MANAGED_PROMPTS = {
|
|
@@ -6311,7 +6434,7 @@ const projectCleanup = (...patterns) => ({
|
|
|
6311
6434
|
kind: "project-patterns",
|
|
6312
6435
|
patterns
|
|
6313
6436
|
});
|
|
6314
|
-
/** Complete OpenSpec 1.
|
|
6437
|
+
/** Complete OpenSpec 1.11 Agent delivery registry in official order (the newest admitted line). */
|
|
6315
6438
|
const AGENT_DELIVERY_REGISTRY = [
|
|
6316
6439
|
{
|
|
6317
6440
|
name: "Amazon Q Developer",
|
|
@@ -6330,12 +6453,27 @@ const AGENT_DELIVERY_REGISTRY = [
|
|
|
6330
6453
|
value: "antigravity",
|
|
6331
6454
|
available: true,
|
|
6332
6455
|
successLabel: "Antigravity",
|
|
6333
|
-
skillsDir: ".
|
|
6456
|
+
skillsDir: ".agents",
|
|
6457
|
+
legacySkillsDirs: [".agent"],
|
|
6458
|
+
detectionPaths: [".agent", ".agents/workflows"],
|
|
6334
6459
|
requiresIdeRestart: true,
|
|
6335
6460
|
requiresIdeRestartSince: "1.9",
|
|
6336
6461
|
capability: "adapter-backed",
|
|
6337
|
-
command: command(".
|
|
6338
|
-
cleanup: projectCleanup(".agent/workflows/openspec-*.md")
|
|
6462
|
+
command: command(".agents/workflows/opsx-{workflow}.md", yamlMarkdown("description")),
|
|
6463
|
+
cleanup: projectCleanup(".agent/workflows/openspec-*.md"),
|
|
6464
|
+
migrations: [{
|
|
6465
|
+
from: ".agent",
|
|
6466
|
+
to: ".agents",
|
|
6467
|
+
needsConsent: false,
|
|
6468
|
+
timing: "after-generation"
|
|
6469
|
+
}],
|
|
6470
|
+
perSeriesOverrides: { "1.10": {
|
|
6471
|
+
skillsDir: ".agent",
|
|
6472
|
+
legacySkillsDirs: void 0,
|
|
6473
|
+
detectionPaths: void 0,
|
|
6474
|
+
command: command(".agent/workflows/opsx-{workflow}.md", yamlMarkdown("description")),
|
|
6475
|
+
migrations: void 0
|
|
6476
|
+
} }
|
|
6339
6477
|
},
|
|
6340
6478
|
{
|
|
6341
6479
|
name: "Auggie (Augment CLI)",
|
|
@@ -6416,7 +6554,8 @@ const AGENT_DELIVERY_REGISTRY = [
|
|
|
6416
6554
|
migrations: [{
|
|
6417
6555
|
from: ".codex",
|
|
6418
6556
|
to: ".agents",
|
|
6419
|
-
needsConsent: false
|
|
6557
|
+
needsConsent: false,
|
|
6558
|
+
timing: "after-generation"
|
|
6420
6559
|
}]
|
|
6421
6560
|
},
|
|
6422
6561
|
{
|
|
@@ -6734,6 +6873,17 @@ const AGENT_DELIVERY_REGISTRY = [
|
|
|
6734
6873
|
capability: "adapter-backed",
|
|
6735
6874
|
command: command(".trae/commands/opsx-{workflow}.md", yamlMarkdown("name", "description"))
|
|
6736
6875
|
},
|
|
6876
|
+
{
|
|
6877
|
+
name: "Zed Agent",
|
|
6878
|
+
value: "zed",
|
|
6879
|
+
available: true,
|
|
6880
|
+
successLabel: "Zed Agent",
|
|
6881
|
+
skillsDir: ".agents",
|
|
6882
|
+
detectionPaths: [".zed", ".agents/skills"],
|
|
6883
|
+
minCliSeries: "1.10",
|
|
6884
|
+
capability: "none",
|
|
6885
|
+
command: null
|
|
6886
|
+
},
|
|
6737
6887
|
{
|
|
6738
6888
|
name: "ZCode",
|
|
6739
6889
|
value: "zcode",
|
|
@@ -6765,21 +6915,137 @@ function resolveAgentCommandPathTemplate(pathTemplate, workflow) {
|
|
|
6765
6915
|
return pathTemplate.replace("{workflow}", workflow);
|
|
6766
6916
|
}
|
|
6767
6917
|
|
|
6918
|
+
//#endregion
|
|
6919
|
+
//#region src/agent-command-content.ts
|
|
6920
|
+
/**
|
|
6921
|
+
* Orthogonal intents (updated 2026-08-28 Asia/Shanghai):
|
|
6922
|
+
* 1. Resolve the running OpenSpec CLI's private command-generation boundary without bundling copied prompts.
|
|
6923
|
+
* 2. Produce exact per-Agent, per-workflow command contents for physical fingerprint comparison.
|
|
6924
|
+
* 3. Fail closed when the configured runner has no importable OpenSpec module or compatible generator contract.
|
|
6925
|
+
* 4. Isolate per-tool adapter absence as version-scoped unavailability, keeping unrelated evidence.
|
|
6926
|
+
* 5. Own command-content equivalence, tolerating exactly the OpenCode provided-arguments
|
|
6927
|
+
* injection line that 1.10+ adapters append to placeholder-free templates.
|
|
6928
|
+
*
|
|
6929
|
+
* Original request (2026-08-01): adapt the complete OpenSpec 1.7 Agent delivery protocol for OpenSpecUI 7.
|
|
6930
|
+
|
|
6931
|
+
* Original request (2026-08-15): "v9的适配需要同时适配 1.8和1.9。"
|
|
6932
|
+
* Original request (2026-08-28): "直接将 0.10.0 和 0.11.0 一起适配,然后发布 v11。"
|
|
6933
|
+
*/
|
|
6934
|
+
/**
|
|
6935
|
+
* Passthrough line the OpenCode adapter injects after the complete `**Input**`
|
|
6936
|
+
* contract when a command template carries no argument placeholder of its own
|
|
6937
|
+
* (see the pinned upstream `command-generation/adapters/opencode.ts`). OpenSpecUI
|
|
6938
|
+
* treats this line as generator-owned, so command files may differ by exactly
|
|
6939
|
+
* this line and still be content-current across the admitted series pair.
|
|
6940
|
+
*/
|
|
6941
|
+
const OPENCODE_PROVIDED_ARGUMENTS_LINE = "**Provided arguments**: $ARGUMENTS";
|
|
6942
|
+
/** Normalize checkout artifacts that are not real content drift (UTF-8 BOM, CRLF). */
|
|
6943
|
+
function normalizeContentForEquivalence(content) {
|
|
6944
|
+
return content.replace(/^\uFEFF/u, "").replaceAll("\r\n", "\n");
|
|
6945
|
+
}
|
|
6946
|
+
/**
|
|
6947
|
+
* Line-anchored form of the injected passthrough line: it matches only when the
|
|
6948
|
+
* passthrough text stands as a complete line (a newline before it, a newline or end
|
|
6949
|
+
* of content after it), never as a prefix of a longer genuine body line.
|
|
6950
|
+
*/
|
|
6951
|
+
const STANDALONE_PROVIDED_ARGUMENTS_LINE_PATTERN = /* @__PURE__ */ new RegExp(`\\n${OPENCODE_PROVIDED_ARGUMENTS_LINE.replace(/[$*]/g, "\\$&")}(?=\\n|$)`);
|
|
6952
|
+
/** Remove at most one standalone injected passthrough line, wherever it sits. */
|
|
6953
|
+
function stripInjectedProvidedArgumentsLine(content) {
|
|
6954
|
+
const match = STANDALONE_PROVIDED_ARGUMENTS_LINE_PATTERN.exec(content);
|
|
6955
|
+
if (!match) return content;
|
|
6956
|
+
return content.slice(0, match.index) + content.slice(match.index + match[0].length);
|
|
6957
|
+
}
|
|
6958
|
+
/**
|
|
6959
|
+
* Whether an on-disk command file is content-equivalent to the expected generated command.
|
|
6960
|
+
*
|
|
6961
|
+
* Equivalence is exact string equality after BOM/CRLF normalization, plus one
|
|
6962
|
+
* deliberate tolerance: the OpenCode passthrough line above may appear as a
|
|
6963
|
+
* standalone line on either side, because 1.10+ adapters inject it while earlier
|
|
6964
|
+
* admitted runners did not. A longer body line that merely starts with the
|
|
6965
|
+
* passthrough text is genuine content, never generator-owned. No other tool or
|
|
6966
|
+
* difference is tolerated.
|
|
6967
|
+
*/
|
|
6968
|
+
function isEquivalentAgentCommandContent(toolId, actual, expected) {
|
|
6969
|
+
const normalizedActual = normalizeContentForEquivalence(actual);
|
|
6970
|
+
const normalizedExpected = normalizeContentForEquivalence(expected);
|
|
6971
|
+
if (normalizedActual === normalizedExpected) return true;
|
|
6972
|
+
if (toolId !== "opencode") return false;
|
|
6973
|
+
return stripInjectedProvidedArgumentsLine(normalizedActual) === stripInjectedProvidedArgumentsLine(normalizedExpected);
|
|
6974
|
+
}
|
|
6975
|
+
const KNOWN_WORKFLOWS = new Set(OPSX_ALL_WORKFLOWS);
|
|
6976
|
+
function isRecord(value) {
|
|
6977
|
+
return typeof value === "object" && value !== null;
|
|
6978
|
+
}
|
|
6979
|
+
function isRuntimeSkillGenerationModule(value) {
|
|
6980
|
+
return isRecord(value) && typeof value.getCommandContents === "function";
|
|
6981
|
+
}
|
|
6982
|
+
function isRuntimeCommandAdapterRegistry(value) {
|
|
6983
|
+
if (typeof value !== "object" && typeof value !== "function" || value === null) return false;
|
|
6984
|
+
return "get" in value && typeof value.get === "function";
|
|
6985
|
+
}
|
|
6986
|
+
function isRuntimeCommandGenerationModule(value) {
|
|
6987
|
+
return isRecord(value) && isRuntimeCommandAdapterRegistry(value.CommandAdapterRegistry) && typeof value.generateCommands === "function";
|
|
6988
|
+
}
|
|
6989
|
+
function isRuntimeCommandContent(value) {
|
|
6990
|
+
return isRecord(value) && typeof value.id === "string" && KNOWN_WORKFLOWS.has(value.id);
|
|
6991
|
+
}
|
|
6992
|
+
function isRuntimeGeneratedCommand(value) {
|
|
6993
|
+
return isRecord(value) && typeof value.fileContent === "string";
|
|
6994
|
+
}
|
|
6995
|
+
/**
|
|
6996
|
+
* Load exact command contents from the configured OpenSpec CLI.
|
|
6997
|
+
*
|
|
6998
|
+
* The private generator is intentionally treated as optional evidence. When the runner is not an
|
|
6999
|
+
* importable local OpenSpec module, callers receive `null` and commands-only installs cannot be
|
|
7000
|
+
* declared current from path existence alone.
|
|
7001
|
+
*/
|
|
7002
|
+
async function loadOpenSpecAgentCommandContents(cliCommand, workflows) {
|
|
7003
|
+
try {
|
|
7004
|
+
const cliModuleDir = dirname$1((await resolveOpenSpecWorkerInvocation(cliCommand)).modulePath);
|
|
7005
|
+
const [skillGenerationModule, commandGenerationModule] = await Promise.all([import(pathToFileURL(resolve(cliModuleDir, "../core/shared/skill-generation.js")).href), import(pathToFileURL(resolve(cliModuleDir, "../core/command-generation/index.js")).href)]);
|
|
7006
|
+
if (!isRuntimeSkillGenerationModule(skillGenerationModule) || !isRuntimeCommandGenerationModule(commandGenerationModule)) return null;
|
|
7007
|
+
const commandContents = skillGenerationModule.getCommandContents(workflows);
|
|
7008
|
+
if (!Array.isArray(commandContents) || !commandContents.every(isRuntimeCommandContent)) return null;
|
|
7009
|
+
const catalog = {};
|
|
7010
|
+
const unavailableTools = {};
|
|
7011
|
+
for (const tool of AGENT_DELIVERY_REGISTRY) {
|
|
7012
|
+
if (!tool.command) continue;
|
|
7013
|
+
const adapter = commandGenerationModule.CommandAdapterRegistry.get(tool.value);
|
|
7014
|
+
if (!adapter) {
|
|
7015
|
+
unavailableTools[tool.value] = tool.minCliSeries !== void 0 ? `Command adapter first ships with OpenSpec CLI ${tool.minCliSeries}; this runner does not declare it.` : "This OpenSpec CLI runner does not register the command adapter.";
|
|
7016
|
+
continue;
|
|
7017
|
+
}
|
|
7018
|
+
const generatedCommands = commandGenerationModule.generateCommands(commandContents, adapter);
|
|
7019
|
+
if (!Array.isArray(generatedCommands) || generatedCommands.length !== commandContents.length || !generatedCommands.every(isRuntimeGeneratedCommand)) return null;
|
|
7020
|
+
catalog[tool.value] = Object.fromEntries(commandContents.map((content, index) => [content.id, generatedCommands[index]?.fileContent]));
|
|
7021
|
+
}
|
|
7022
|
+
return {
|
|
7023
|
+
catalog,
|
|
7024
|
+
unavailableTools
|
|
7025
|
+
};
|
|
7026
|
+
} catch {
|
|
7027
|
+
return null;
|
|
7028
|
+
}
|
|
7029
|
+
}
|
|
7030
|
+
|
|
6768
7031
|
//#endregion
|
|
6769
7032
|
//#region src/tool-init-state.ts
|
|
6770
7033
|
/**
|
|
6771
|
-
* Orthogonal intents (updated 2026-08-
|
|
6772
|
-
* 1. Project the unified OpenSpec 1.
|
|
7034
|
+
* Orthogonal intents (updated 2026-08-28 Asia/Shanghai):
|
|
7035
|
+
* 1. Project the unified OpenSpec 1.11 Agent registry into exact skill and command artifact state.
|
|
6773
7036
|
* 2. Report partial, stale-version, cleanup-needed, migration-required, and unavailable states from physical evidence.
|
|
6774
7037
|
* 3. Observe user-global skill roots (e.g. MiniMax Code) without ever cleaning or migrating them here.
|
|
6775
7038
|
* 4. Preserve bounded reactive directory observation and fresh one-shot cache invalidation.
|
|
6776
7039
|
* 5. Expose Codex managed-global-prompt observation without treating those prompts as current commands.
|
|
7040
|
+
* 6. Judge generated-by staleness series-aware: either admitted line (1.10.x/1.11.x) is current
|
|
7041
|
+
* for both admitted sessions; only below-admitted generators are stale.
|
|
6777
7042
|
*
|
|
6778
7043
|
* Original request (2026-08-01): adapt the complete OpenSpec 1.7 Agent delivery protocol for OpenSpecUI 7.
|
|
6779
7044
|
* Original request (2026-08-15): "v9的适配需要同时适配 1.8和1.9。"
|
|
7045
|
+
* Original request (2026-08-28): "直接将 0.10.0 和 0.11.0 一起适配,然后发布 v11。"
|
|
6780
7046
|
*/
|
|
6781
7047
|
/** Pinned source version used when a runtime CLI version is not supplied by the Server owner. */
|
|
6782
|
-
const PINNED_AGENT_GENERATOR_VERSION = "1.
|
|
7048
|
+
const PINNED_AGENT_GENERATOR_VERSION = "1.11.0";
|
|
6783
7049
|
/** Resolve the physical skills inventory scope for one registry entry. */
|
|
6784
7050
|
function resolveToolSkillsScope(tool) {
|
|
6785
7051
|
if (tool.globalSkillsDir) return {
|
|
@@ -6929,9 +7195,6 @@ async function readGeneratedByVersion(entries, existingPaths) {
|
|
|
6929
7195
|
}
|
|
6930
7196
|
return null;
|
|
6931
7197
|
}
|
|
6932
|
-
function normalizeCommandContent(content) {
|
|
6933
|
-
return content.replace(/^\uFEFF/u, "").replaceAll("\r\n", "\n");
|
|
6934
|
-
}
|
|
6935
7198
|
async function areExpectedCommandContentsCurrent(toolId, entries, existingPaths, commandContents) {
|
|
6936
7199
|
if (entries.length === 0) return false;
|
|
6937
7200
|
const expectedContents = commandContents?.[toolId];
|
|
@@ -6941,12 +7204,21 @@ async function areExpectedCommandContentsCurrent(toolId, entries, existingPaths,
|
|
|
6941
7204
|
const expectedContent = expectedContents[entry.workflow];
|
|
6942
7205
|
if (!path || expectedContent === void 0) return false;
|
|
6943
7206
|
const actualContent = await reactiveReadFile(path);
|
|
6944
|
-
if (actualContent === null ||
|
|
7207
|
+
if (actualContent === null || !isEquivalentAgentCommandContent(toolId, actualContent, expectedContent)) return false;
|
|
6945
7208
|
}
|
|
6946
7209
|
return true;
|
|
6947
7210
|
}
|
|
6948
|
-
|
|
6949
|
-
|
|
7211
|
+
/**
|
|
7212
|
+
* Series-aware generator currency.
|
|
7213
|
+
*
|
|
7214
|
+
* Artifacts whose `generatedBy` stamp names either admitted line (stable 1.10.x or
|
|
7215
|
+
* 1.11.x) are current for both admitted sessions; only below-admitted generators
|
|
7216
|
+
* (and unparseable or future stamps) are stale. The pinned constant never feeds
|
|
7217
|
+
* this comparison — it is fallback display only and never fabricates a live version.
|
|
7218
|
+
*/
|
|
7219
|
+
function isCurrentGeneratedByVersion(version, hasAnyArtifacts) {
|
|
7220
|
+
if (!hasAnyArtifacts) return true;
|
|
7221
|
+
return parseOpenSpecCliSeries(version) !== null;
|
|
6950
7222
|
}
|
|
6951
7223
|
async function collectCodexCleanup(cleanup) {
|
|
6952
7224
|
const promptRoot = getExternalCodexCommandObservationRoot();
|
|
@@ -7011,7 +7283,7 @@ async function collectCleanup(projectDir, tool, projectRootEntries) {
|
|
|
7011
7283
|
kind: projectCleanup$1.paths.length > 0 && globalCleanup ? "mixed" : globalCleanup ? "managed-global-prompts" : "project-artifacts",
|
|
7012
7284
|
paths,
|
|
7013
7285
|
workflows,
|
|
7014
|
-
replacementLabel: globalCleanup?.replacementLabel ?? "OpenSpec 1.
|
|
7286
|
+
replacementLabel: globalCleanup?.replacementLabel ?? "OpenSpec 1.11 Agent delivery"
|
|
7015
7287
|
};
|
|
7016
7288
|
}
|
|
7017
7289
|
async function collectMigrationEvidence(projectDir, tool, projectRootEntries) {
|
|
@@ -7106,7 +7378,7 @@ async function projectToolInitStates(projectDir, options) {
|
|
|
7106
7378
|
const migration = migrationEvidence?.state;
|
|
7107
7379
|
const readiness = !hasAnyArtifacts ? "uninitialized" : isInitialized ? "initialized" : "partial";
|
|
7108
7380
|
const issues = [];
|
|
7109
|
-
if (!isCurrentGeneratedByVersion(generatedByVersion,
|
|
7381
|
+
if (!isCurrentGeneratedByVersion(generatedByVersion, hasAnyArtifacts)) issues.push("stale-version");
|
|
7110
7382
|
if (cleanup) issues.push("cleanup-needed");
|
|
7111
7383
|
if (migration) issues.push("migration-required");
|
|
7112
7384
|
return {
|
|
@@ -7310,75 +7582,6 @@ function applyAgentDeliveryPolicy(config, update) {
|
|
|
7310
7582
|
};
|
|
7311
7583
|
}
|
|
7312
7584
|
|
|
7313
|
-
//#endregion
|
|
7314
|
-
//#region src/agent-command-content.ts
|
|
7315
|
-
/**
|
|
7316
|
-
* Orthogonal intents (updated 2026-08-15 Asia/Shanghai):
|
|
7317
|
-
* 1. Resolve the running OpenSpec CLI's private command-generation boundary without bundling copied prompts.
|
|
7318
|
-
* 2. Produce exact per-Agent, per-workflow command contents for physical fingerprint comparison.
|
|
7319
|
-
* 3. Fail closed when the configured runner has no importable OpenSpec module or compatible generator contract.
|
|
7320
|
-
* 4. Isolate per-tool adapter absence as version-scoped unavailability, keeping unrelated evidence.
|
|
7321
|
-
*
|
|
7322
|
-
* Original request (2026-08-01): adapt the complete OpenSpec 1.7 Agent delivery protocol for OpenSpecUI 7.
|
|
7323
|
-
|
|
7324
|
-
* Original request (2026-08-15): "v9的适配需要同时适配 1.8和1.9。"
|
|
7325
|
-
*/
|
|
7326
|
-
const KNOWN_WORKFLOWS = new Set(OPSX_ALL_WORKFLOWS);
|
|
7327
|
-
function isRecord(value) {
|
|
7328
|
-
return typeof value === "object" && value !== null;
|
|
7329
|
-
}
|
|
7330
|
-
function isRuntimeSkillGenerationModule(value) {
|
|
7331
|
-
return isRecord(value) && typeof value.getCommandContents === "function";
|
|
7332
|
-
}
|
|
7333
|
-
function isRuntimeCommandAdapterRegistry(value) {
|
|
7334
|
-
if (typeof value !== "object" && typeof value !== "function" || value === null) return false;
|
|
7335
|
-
return "get" in value && typeof value.get === "function";
|
|
7336
|
-
}
|
|
7337
|
-
function isRuntimeCommandGenerationModule(value) {
|
|
7338
|
-
return isRecord(value) && isRuntimeCommandAdapterRegistry(value.CommandAdapterRegistry) && typeof value.generateCommands === "function";
|
|
7339
|
-
}
|
|
7340
|
-
function isRuntimeCommandContent(value) {
|
|
7341
|
-
return isRecord(value) && typeof value.id === "string" && KNOWN_WORKFLOWS.has(value.id);
|
|
7342
|
-
}
|
|
7343
|
-
function isRuntimeGeneratedCommand(value) {
|
|
7344
|
-
return isRecord(value) && typeof value.fileContent === "string";
|
|
7345
|
-
}
|
|
7346
|
-
/**
|
|
7347
|
-
* Load exact command contents from the configured OpenSpec CLI.
|
|
7348
|
-
*
|
|
7349
|
-
* The private generator is intentionally treated as optional evidence. When the runner is not an
|
|
7350
|
-
* importable local OpenSpec module, callers receive `null` and commands-only installs cannot be
|
|
7351
|
-
* declared current from path existence alone.
|
|
7352
|
-
*/
|
|
7353
|
-
async function loadOpenSpecAgentCommandContents(cliCommand, workflows) {
|
|
7354
|
-
try {
|
|
7355
|
-
const cliModuleDir = dirname$1((await resolveOpenSpecWorkerInvocation(cliCommand)).modulePath);
|
|
7356
|
-
const [skillGenerationModule, commandGenerationModule] = await Promise.all([import(pathToFileURL(resolve(cliModuleDir, "../core/shared/skill-generation.js")).href), import(pathToFileURL(resolve(cliModuleDir, "../core/command-generation/index.js")).href)]);
|
|
7357
|
-
if (!isRuntimeSkillGenerationModule(skillGenerationModule) || !isRuntimeCommandGenerationModule(commandGenerationModule)) return null;
|
|
7358
|
-
const commandContents = skillGenerationModule.getCommandContents(workflows);
|
|
7359
|
-
if (!Array.isArray(commandContents) || !commandContents.every(isRuntimeCommandContent)) return null;
|
|
7360
|
-
const catalog = {};
|
|
7361
|
-
const unavailableTools = {};
|
|
7362
|
-
for (const tool of AGENT_DELIVERY_REGISTRY) {
|
|
7363
|
-
if (!tool.command) continue;
|
|
7364
|
-
const adapter = commandGenerationModule.CommandAdapterRegistry.get(tool.value);
|
|
7365
|
-
if (!adapter) {
|
|
7366
|
-
unavailableTools[tool.value] = tool.minCliSeries !== void 0 ? `Command adapter first ships with OpenSpec CLI ${tool.minCliSeries}; this runner does not declare it.` : "This OpenSpec CLI runner does not register the command adapter.";
|
|
7367
|
-
continue;
|
|
7368
|
-
}
|
|
7369
|
-
const generatedCommands = commandGenerationModule.generateCommands(commandContents, adapter);
|
|
7370
|
-
if (!Array.isArray(generatedCommands) || generatedCommands.length !== commandContents.length || !generatedCommands.every(isRuntimeGeneratedCommand)) return null;
|
|
7371
|
-
catalog[tool.value] = Object.fromEntries(commandContents.map((content, index) => [content.id, generatedCommands[index]?.fileContent]));
|
|
7372
|
-
}
|
|
7373
|
-
return {
|
|
7374
|
-
catalog,
|
|
7375
|
-
unavailableTools
|
|
7376
|
-
};
|
|
7377
|
-
} catch {
|
|
7378
|
-
return null;
|
|
7379
|
-
}
|
|
7380
|
-
}
|
|
7381
|
-
|
|
7382
7585
|
//#endregion
|
|
7383
7586
|
//#region src/hooks.ts
|
|
7384
7587
|
const OPENSPECUI_DOCUMENT_HOOK_VERSION = 1;
|
|
@@ -7515,13 +7718,23 @@ function snapshotHasAbsolutePath(snapshot) {
|
|
|
7515
7718
|
//#endregion
|
|
7516
7719
|
//#region src/cli-projection-sequence.ts
|
|
7517
7720
|
/**
|
|
7518
|
-
* Orthogonal intents (
|
|
7721
|
+
* Orthogonal intents (updated 2026-08-28 Asia/Shanghai):
|
|
7519
7722
|
* 1. Submit aggregate CLI projection entities lazily while preserving source order.
|
|
7520
7723
|
* 2. Prevent one aggregate read from pre-filling the shared buffered CLI admission queue.
|
|
7724
|
+
* 3. Document that the capability-gated OpenSpec 1.11 batch status command satisfies the
|
|
7725
|
+
* same one-admission-slot constraint by construction: it is exactly one spawn, so the
|
|
7726
|
+
* status-list aggregates never need a per-entity series for transport admission.
|
|
7521
7727
|
*
|
|
7522
7728
|
* Original request (2026-07-31): "系统性地进行修复,因为List页面也有类似的问题。所有可能其它页面都有类似的问题。"
|
|
7729
|
+
* Original request (2026-08-28): "直接将 0.10.0 和 0.11.0 一起适配,然后发布 v11。"
|
|
7730
|
+
*/
|
|
7731
|
+
/**
|
|
7732
|
+
* Map CLI-backed projection entities in order, admitting only the current entity.
|
|
7733
|
+
*
|
|
7734
|
+
* A capability-gated single-spawn batch command (see `OpsxKernel`'s `status --all`
|
|
7735
|
+
* transport) is its own serial admission unit and bypasses this helper legitimately;
|
|
7736
|
+
* every transport that still spawns per entity must keep submitting through it.
|
|
7523
7737
|
*/
|
|
7524
|
-
/** Map CLI-backed projection entities in order, admitting only the current entity. */
|
|
7525
7738
|
async function mapCliProjectionSeries(inputs, project) {
|
|
7526
7739
|
const outputs = [];
|
|
7527
7740
|
for (const [index, input] of inputs.entries()) outputs.push(await project(input, index));
|
|
@@ -7531,16 +7744,20 @@ async function mapCliProjectionSeries(inputs, project) {
|
|
|
7531
7744
|
//#endregion
|
|
7532
7745
|
//#region src/opsx-kernel.ts
|
|
7533
7746
|
/**
|
|
7534
|
-
* Orthogonal intents (updated 2026-08-
|
|
7747
|
+
* Orthogonal intents (updated 2026-08-28 Asia/Shanghai):
|
|
7535
7748
|
* 1. Maintain reactive CLI-backed projections and their direct typed Projection Work readers.
|
|
7536
7749
|
* 2. Share and release per-entity streams through one planning-root kernel lifecycle.
|
|
7537
7750
|
* 3. Keep OpenSpec configuration ownership outside the workflow cache while tracking both YAML filename variants.
|
|
7538
7751
|
* 4. Preserve typed Status and Artifact/Apply/Archive Instructions provenance with the resolved root selector.
|
|
7539
7752
|
* 5. Resolve per-command CLI capabilities once per lifetime and gate version-only selectors behind admission.
|
|
7753
|
+
* 6. Serve the status-list projections through the capability-gated OpenSpec 1.11 batch transport
|
|
7754
|
+
* (one `status --all` spawn) with projections, per-change dependencies, and failure evidence
|
|
7755
|
+
* identical to the per-change serial transport; 1.10 sessions keep the serial path.
|
|
7540
7756
|
*
|
|
7541
7757
|
* Original request (2026-07-15): "Planning-root adapters and services consume the CLI-resolved root."
|
|
7542
7758
|
* Original request (2026-07-31): "系统性地进行修复,因为List页面也有类似的问题。所有可能其它页面都有类似的问题。"
|
|
7543
7759
|
* Original request (2026-08-15): "v9的适配需要同时适配 1.8和1.9。"
|
|
7760
|
+
* Original request (2026-08-28): "直接将 0.10.0 和 0.11.0 一起适配,然后发布 v11。"
|
|
7544
7761
|
*/
|
|
7545
7762
|
function toRelativePath(root, absolutePath) {
|
|
7546
7763
|
return relative(root, absolutePath).split(sep).join("/");
|
|
@@ -7688,6 +7905,40 @@ function createOpsxCliEvidence(result, command$1, rootSelector) {
|
|
|
7688
7905
|
function createOpsxStatusEvidence(result, rootSelector) {
|
|
7689
7906
|
return OpsxStatusEvidenceSchema.parse(createOpsxCliEvidence(result, "status", rootSelector));
|
|
7690
7907
|
}
|
|
7908
|
+
/**
|
|
7909
|
+
* Project one CLI Status success payload into the retained ChangeStatus shape.
|
|
7910
|
+
*
|
|
7911
|
+
* Shared by the per-change serial transport and the OpenSpec 1.11 batch transport so both
|
|
7912
|
+
* publish byte-identical projection semantics; only the command evidence differs because
|
|
7913
|
+
* it honestly records the transport that produced the payload.
|
|
7914
|
+
*/
|
|
7915
|
+
function projectWorkflowStatus(data, evidence) {
|
|
7916
|
+
return ChangeStatusSchema.parse({
|
|
7917
|
+
changeName: data.changeName,
|
|
7918
|
+
schemaName: data.schemaName,
|
|
7919
|
+
isPlanningComplete: data.isPlanningComplete,
|
|
7920
|
+
applyRequires: data.applyRequires,
|
|
7921
|
+
artifacts: data.artifacts,
|
|
7922
|
+
provenance: {
|
|
7923
|
+
kind: "cli",
|
|
7924
|
+
planningHome: data.planningHome,
|
|
7925
|
+
changeRoot: data.changeRoot,
|
|
7926
|
+
artifactPaths: data.artifactPaths,
|
|
7927
|
+
nextSteps: data.nextSteps,
|
|
7928
|
+
actionContext: data.actionContext,
|
|
7929
|
+
root: data.root,
|
|
7930
|
+
evidence
|
|
7931
|
+
}
|
|
7932
|
+
});
|
|
7933
|
+
}
|
|
7934
|
+
/** Publish artifact relative paths and register the same reactive deps as the serial transport. */
|
|
7935
|
+
async function settleStatusArtifactDeps(projectDir, changeId, status) {
|
|
7936
|
+
const changeRelDir = `openspec/changes/${changeId}`;
|
|
7937
|
+
for (const artifact of status.artifacts) if (artifact.status !== "skipped") {
|
|
7938
|
+
artifact.relativePath = `${changeRelDir}/${artifact.outputPath}`;
|
|
7939
|
+
await touchArtifactOutputDeps(projectDir, changeId, artifact.outputPath);
|
|
7940
|
+
}
|
|
7941
|
+
}
|
|
7691
7942
|
var OpsxKernel = class {
|
|
7692
7943
|
projectDir;
|
|
7693
7944
|
cliExecutor;
|
|
@@ -8066,36 +8317,99 @@ var OpsxKernel = class {
|
|
|
8066
8317
|
...schema ? { schema } : {}
|
|
8067
8318
|
});
|
|
8068
8319
|
const evidence = createOpsxStatusEvidence(result, this.rootSelector);
|
|
8069
|
-
const
|
|
8070
|
-
|
|
8071
|
-
|
|
8072
|
-
|
|
8073
|
-
|
|
8074
|
-
|
|
8075
|
-
|
|
8076
|
-
|
|
8077
|
-
|
|
8078
|
-
|
|
8079
|
-
|
|
8080
|
-
|
|
8081
|
-
|
|
8082
|
-
|
|
8083
|
-
|
|
8084
|
-
|
|
8085
|
-
|
|
8320
|
+
const status = projectWorkflowStatus(requireCommandData("openspec status", result, CliWorkflowStatusSuccessSchema), evidence);
|
|
8321
|
+
await settleStatusArtifactDeps(this.projectDir, changeId, status);
|
|
8322
|
+
return status;
|
|
8323
|
+
}
|
|
8324
|
+
/**
|
|
8325
|
+
* Capability-gated OpenSpec 1.11 batch Status transport for the status-list projections.
|
|
8326
|
+
*
|
|
8327
|
+
* Returns `null` when the admitted session cannot run `status --all` (OpenSpec 1.10, an
|
|
8328
|
+
* unverifiable CLI, or a typed capability refusal) so callers keep the per-change serial
|
|
8329
|
+
* transport. One spawn replaces the per-change spawns; healthy entries reuse the exact
|
|
8330
|
+
* per-change projection (shared decoder plus shared reactive dependency touching), a
|
|
8331
|
+
* per-change failure entry stays that change's own evidence, and only an unparseable
|
|
8332
|
+
* envelope or the root-selection null shape rejects the aggregate. The single spawn
|
|
8333
|
+
* occupies one buffered-admission slot by construction, so the serial aggregate
|
|
8334
|
+
* submission constraint holds without mapCliProjectionSeries.
|
|
8335
|
+
*/
|
|
8336
|
+
async fetchBatchStatusListProjection(changeIds) {
|
|
8337
|
+
const capabilities = await this.resolveCliCapabilities();
|
|
8338
|
+
if (!capabilities.batchStatus) return null;
|
|
8339
|
+
await touchOpsxProjectDeps(this.projectDir);
|
|
8340
|
+
for (const changeId of changeIds) await touchOpsxChangeDeps(this.projectDir, changeId);
|
|
8341
|
+
const gated = await this.cliExecutor.contracts.workflowStatusAll({
|
|
8342
|
+
...this.rootSelector,
|
|
8343
|
+
capabilities: { batchStatus: capabilities.batchStatus }
|
|
8086
8344
|
});
|
|
8087
|
-
|
|
8088
|
-
|
|
8089
|
-
|
|
8090
|
-
|
|
8345
|
+
if (gated.kind === "unavailable") return null;
|
|
8346
|
+
const result = gated.result;
|
|
8347
|
+
const batch = result.data;
|
|
8348
|
+
if (!batch) throw new CliProjectionCommandError(result.contractError || result.stderr.trim() || result.diagnostics.map((diagnostic) => diagnostic.message).join("\n") || `openspec status --all failed (exit ${result.exitCode ?? "null"})`, result);
|
|
8349
|
+
if (batch.root === null) throw new CliProjectionCommandError((batch.status ?? []).map((diagnostic) => diagnostic.message).join("\n") || "openspec status --all failed to select a Root.", result);
|
|
8350
|
+
const statusEvidence = createOpsxStatusEvidence(result, this.rootSelector);
|
|
8351
|
+
const entries = /* @__PURE__ */ new Map();
|
|
8352
|
+
for (const entry of batch.changes) entries.set(entry.changeName, entry);
|
|
8353
|
+
const resolutions = /* @__PURE__ */ new Map();
|
|
8354
|
+
for (const changeId of changeIds) {
|
|
8355
|
+
const entry = entries.get(changeId);
|
|
8356
|
+
if (!entry) {
|
|
8357
|
+
resolutions.set(changeId, { kind: "missing" });
|
|
8358
|
+
continue;
|
|
8359
|
+
}
|
|
8360
|
+
if (isCliBatchStatusEntryFailure(entry)) {
|
|
8361
|
+
resolutions.set(changeId, { kind: "per-change-failure" });
|
|
8362
|
+
continue;
|
|
8363
|
+
}
|
|
8364
|
+
const parsed = CliWorkflowStatusSuccessSchema.safeParse({
|
|
8365
|
+
...entry,
|
|
8366
|
+
root: batch.root
|
|
8367
|
+
});
|
|
8368
|
+
if (!parsed.success) throw new CliProjectionCommandError(`openspec status --all entry "${changeId}" drifted from the Status contract: ${parsed.error.issues.map((issue) => `${issue.path.join(".") || "<root>"}: ${issue.message}`).join("; ")}`, result);
|
|
8369
|
+
const status = projectWorkflowStatus(parsed.data, statusEvidence);
|
|
8370
|
+
await settleStatusArtifactDeps(this.projectDir, changeId, status);
|
|
8371
|
+
resolutions.set(changeId, {
|
|
8372
|
+
kind: "status",
|
|
8373
|
+
status
|
|
8374
|
+
});
|
|
8091
8375
|
}
|
|
8092
|
-
return
|
|
8376
|
+
return {
|
|
8377
|
+
resolutions,
|
|
8378
|
+
evidence: toCliProjectionCommandEvidence(result)
|
|
8379
|
+
};
|
|
8093
8380
|
}
|
|
8094
8381
|
async fetchStatusList() {
|
|
8095
8382
|
await this.ensureChangeIds();
|
|
8096
8383
|
const changeIds = this._changeIds.get();
|
|
8097
|
-
|
|
8098
|
-
|
|
8384
|
+
const batch = await this.fetchBatchStatusListProjection(changeIds);
|
|
8385
|
+
if (!batch) {
|
|
8386
|
+
await mapCliProjectionSeries(changeIds, (id) => this.ensureStatus(id));
|
|
8387
|
+
return changeIds.map((id) => this.getStatus(id));
|
|
8388
|
+
}
|
|
8389
|
+
const statuses = [];
|
|
8390
|
+
for (const changeId of changeIds) {
|
|
8391
|
+
const resolution = batch.resolutions.get(changeId);
|
|
8392
|
+
if (resolution?.kind === "status") {
|
|
8393
|
+
this.retainStatusState(changeId, resolution.status);
|
|
8394
|
+
statuses.push(resolution.status);
|
|
8395
|
+
continue;
|
|
8396
|
+
}
|
|
8397
|
+
try {
|
|
8398
|
+
await this.ensureStatus(changeId);
|
|
8399
|
+
statuses.push(this.getStatus(changeId));
|
|
8400
|
+
} catch {}
|
|
8401
|
+
}
|
|
8402
|
+
return statuses;
|
|
8403
|
+
}
|
|
8404
|
+
/** Publish one batch-projected Status into the existing per-change status cache. */
|
|
8405
|
+
retainStatusState(changeId, status, schema) {
|
|
8406
|
+
const key = `${requireCanonicalOpenSpecEntityId(changeId, "changeId")}:${schema ?? ""}`;
|
|
8407
|
+
let state = this._statuses.get(key);
|
|
8408
|
+
if (!state) {
|
|
8409
|
+
state = new ReactiveState(null);
|
|
8410
|
+
this._statuses.set(key, state);
|
|
8411
|
+
}
|
|
8412
|
+
state.set(status);
|
|
8099
8413
|
}
|
|
8100
8414
|
async fetchInstructions(changeId, artifact, schema) {
|
|
8101
8415
|
await touchOpsxProjectDeps(this.projectDir);
|
|
@@ -8251,10 +8565,25 @@ var OpsxKernel = class {
|
|
|
8251
8565
|
/** Execute the current Change Status list without joining the Kernel's retained entity streams. */
|
|
8252
8566
|
async readStatusListProjection() {
|
|
8253
8567
|
const changeList = await this.fetchChangeListProjection();
|
|
8254
|
-
|
|
8568
|
+
const batch = await this.fetchBatchStatusListProjection(changeList.value);
|
|
8569
|
+
if (!batch) return {
|
|
8255
8570
|
value: await mapCliProjectionSeries(changeList.value, (changeId) => this.fetchStatus(changeId)),
|
|
8256
8571
|
evidence: changeList.evidence
|
|
8257
8572
|
};
|
|
8573
|
+
const value = [];
|
|
8574
|
+
for (const changeId of changeList.value) {
|
|
8575
|
+
const resolution = batch.resolutions.get(changeId);
|
|
8576
|
+
if (resolution?.kind === "status") {
|
|
8577
|
+
value.push(resolution.status);
|
|
8578
|
+
continue;
|
|
8579
|
+
}
|
|
8580
|
+
if (resolution?.kind === "per-change-failure") continue;
|
|
8581
|
+
value.push(await this.fetchStatus(changeId));
|
|
8582
|
+
}
|
|
8583
|
+
return {
|
|
8584
|
+
value,
|
|
8585
|
+
evidence: batch.evidence
|
|
8586
|
+
};
|
|
8258
8587
|
}
|
|
8259
8588
|
/** Execute one artifact-instructions projection in the caller-owned Work generation. */
|
|
8260
8589
|
readInstructionsProjection(changeId, artifact, schema) {
|
|
@@ -8596,4 +8925,4 @@ const PtyServerMessageSchema = z.discriminatedUnion("type", [
|
|
|
8596
8925
|
]);
|
|
8597
8926
|
|
|
8598
8927
|
//#endregion
|
|
8599
|
-
export { ACCESS_GATE_CREDENTIAL_BYTES, AI_TOOLS, ActiveRootMutationSchema, ActiveRootOfficialConfigSchema, ActiveRootRevisionSchema, ActiveRootStructuredUpdateSchema, AgentDeliveryModeSchema, AgentDeliveryPolicyUpdateSchema, AgentDeliveryProfileSchema, AgentDeliveryWorkflowSchema, ApplyInstructionsContextFilesSchema, ApplyInstructionsProjectionSchema, ApplyInstructionsSchema, ApplyTaskSchema, ArchiveInstructionsSchema, ArtifactInstructionsSchema, ArtifactStatusSchema, BUILTIN_SOUND_IDS, BUILTIN_SOUND_OPTIONS, BUILTIN_TERMINAL_SPAWN_COMMANDS, BatchTranslateEventSchema, BatchTranslateInputSchema, BuiltinSoundIdSchema, CODE_EDITOR_THEME_VALUES, CUSTOM_SOUND_ADD_VALUE, ChangeFileSchema, ChangeSchema, ChangeStatusSchema, CliApplyInstructionsSchema, CliArchiveInstructionsSchema, CliArchiveSchema, CliArtifactInstructionsSchema, CliChangeListSchema, CliCommandTransportSchema, CliContextSchema, CliDiagnosticFailureSchema, CliDiagnosticSchema, CliDoctorReferenceEntrySchema, CliDoctorSchema, CliExecutor, CliJsonValueSchema, CliProjectionCommandError, CliProjectionCommandEvidenceSchema, CliProjectionFailureSchema, CliProjectionInvalidationCauseSchema, CliProjectionNoticeSchema, CliProjectionStateNameSchema, CliReferenceIndexEntrySchema, CliRootSchema, CliRootSourceSchema, CliShowSpecDocumentSchema, CliShowSpecSchema, CliSpecListSchema, CliStoreCleanupSchema, CliStoreDoctorEntrySchema, CliStoreDoctorSchema, CliStoreListSchema, CliStoreMutationSchema, CliStoreSchema, CliStreamTerminationError, CliValidateReportSchema, CliValidateSchema, CliWorkflowStatusSchema, CodeEditorThemeSchema, ConfigManager, CustomSoundHashSchema, CustomSoundIdSchema, CustomSoundMetadataFileSchema, CustomSoundMetadataSchema, DASHBOARD_METRIC_KEYS, DEFAULT_BELL_SOUND_ID, DEFAULT_CONFIG, DEFAULT_GIT_DIFF_EAGER_LINE_BUDGET, DEFAULT_GLOBAL_SETTINGS, DEFAULT_NOTIFICATION_SOUND_ID, DEFAULT_TERMINAL_DARK_THEME, DEFAULT_TERMINAL_LIGHT_THEME, DEFAULT_TERMINAL_THEME_MODE, DEFAULT_TRANSLATION_CACHE_ENTRY_LIMIT, DEFAULT_TRANSLATION_ENGINE_ID, DOCUMENT_TRANSLATION_DISPLAY_MODES, DashboardConfigSchema, DashboardGitSnapshotSchema, DashboardOverviewSchema, DashboardSummaryIdentitySchema, DashboardSummaryInvalidationCauseSchema, DashboardSummaryInvalidationSchema, DashboardSummaryProjectionSchema, DashboardSummaryProjectionStateSchema, DashboardTrendsProjectionSchema, DeltaOperationType, DeltaSchema, DeltaSpecSchema, DependencyInfoSchema, DocumentTranslationConfigSchema, DocumentTranslationConfigUpdateSchema, DocumentTranslationDisplayModeSchema, DocumentTranslationGlobalSettingsUpdateSchema, EnvironmentDefaultStoreUpdateSchema, EnvironmentGlobalConfigValueSchema, EnvironmentGlobalFileProjectionDataSchema, EnvironmentGlobalFileProjectionStateSchema, EnvironmentGlobalProjectionDataSchema, EnvironmentGlobalProjectionStateSchema, FILE_PREVIEW_KINDS, GitConfigSchema, GlobalSettingsManager, HOSTED_SHELL_PROTOCOL_VERSION, LEGACY_SOUND_ID_MAP, LOCAL_MODEL_PROFILE_DEFINITIONS, LocalModelAssetLogSchema, LocalModelAssetPlanSnapshotSchema, LocalModelAssetStateSchema, LocalModelDownloadStatusSchema, LocalModelLifecycleFileStateSchema, LocalModelLifecycleGroupStateSchema, LocalModelProfileLoadStateSchema, LocalModelProfileManifestFileSchema, LocalModelProfileManifestGroupSchema, LocalModelProfileManifestSchema, LocalModelProfileStatusSchema, MAX_ACTIVE_ROOT_CONTEXT_BYTES, MAX_TRANSLATION_CACHE_ENTRY_LIMIT, MIN_TRANSLATION_CACHE_ENTRY_LIMIT, ManagedLocalCatalogSourceSchema, MarkdownParser, MarkdownReadingPluginRegistry, NOTIFICATION_SOUND_OPTIONS, NOTIFICATION_SOUND_VALUES, NotificationActionSchema, NotificationGroupKeySchema, NotificationPublishInputSchema, NotificationRecordSchema, NotificationSettingsSchema, NotificationSoundSchema, NotificationSourceSchema, OFFICIAL_APP_BASE_URL, OPENSPECUI_DOCUMENT_HOOK_VERSION, OPENSPECUI_RUNTIME_CAPABILITIES, OPENSPECUI_WORKFLOW_HOOK_VERSION, OPENSPEC_SPAWN_MODE_ENV, OPEN_SPEC_DATA_DIRECTORY_NAME, OPEN_SPEC_DATA_HOME_OBSERVATION_TARGETS, OPEN_SPEC_READING_SECTIONS_PROJECTION_ID, OPEN_SPEC_SPEC_PROJECTION_ID, OPSX_AGENT_INVOCATION_MODE_VALUES, OPSX_ALL_WORKFLOWS, OPSX_ARTIFACT_INPUT_ACTIONS, OPSX_CHANGE_INPUT_ACTIONS, OPSX_COMMAND_CAPABLE_WORKFLOWS, OPSX_CORE_PROFILE_WORKFLOWS, OPSX_TEXT_INPUT_ACTIONS, OPSX_WORKFLOW_LABELS, OPSX_WORKFLOW_TO_SKILL_DIR, OPSX_WORKFLOW_TO_SKILL_DIR as TOOL_WORKFLOW_TO_SKILL_DIR, OpenSpecAdapter, OpenSpecCliContractExecutor, OpenSpecDataHomeObserver, OpenSpecUIConfigSchema, OpenSpecUIGlobalSettingsSchema, OpenSpecUIGlobalSettingsUpdateSchema, OpenSpecWatcher, OpsxAgentInvocationModeSchema, OpsxCliEvidenceSchema, OpsxConfigBundleSchema, OpsxConfigSchema, OpsxKernel, OpsxStatusEvidenceSchema, OwnedSpecIdentitySchema, PINNED_AGENT_GENERATOR_VERSION, PlanningCliProjectionDataSchema, PlanningCliProjectionSelectorSchema, PlanningCliProjectionStateSchema, PlanningConfigJsonValueSchema, PlanningConfigReferenceSchema, ProjectBindingUpdateSchema, ProjectWatcher, PtyAttachMessageSchema, PtyBellResponseSchema, PtyBufferResponseSchema, PtyClientMessageSchema, PtyCloseMessageSchema, PtyCreateMessageSchema, PtyCreatedResponseSchema, PtyErrorCodeSchema, PtyErrorResponseSchema, PtyExitResponseSchema, PtyInputMessageSchema, PtyListMessageSchema, PtyListResponseSchema, PtyOutputResponseSchema, PtyPlatformSchema, PtyProcessTitleResponseSchema, PtyResizeMessageSchema, PtyServerMessageSchema, PtyTitleResponseSchema, RUNTIME_INVALIDATION_FACETS, ReactiveContext, ReactiveObservationEnvironment, ReactiveState, ReferencedSpecIdentitySchema, RequirementSchema, RuntimeInvalidationIndex, RuntimeRootInvalidationRegistry, SERVE_PRESENTATION_MODES, SERVICE_TRANSLATION_ENGINE_IDS, SILENT_SOUND_ID, ScenarioStepKeywordSchema, ScenarioStepSchema, SchemaArtifactSchema, SchemaDetailSchema, SchemaInfoSchema, SchemaResolutionSchema, ServePresentationModeSchema, ServiceTranslationEngineIdSchema, SoundConfigIdSchema, SoundIdSchema, SpecCatalogSchema, SpecCommandEvidenceSchema, SpecDocumentProjectionSchema, SpecIdentitySchema, SpecSchema, StoreDoctorResultSchema, StoreListResultSchema, StoreMutationLifecycleEventSchema, StoreMutationResultSchema, StoreMutationSchema, StoreMutationStartResponseSchema, TERMINAL_BELL_SOUND_OPTIONS, TERMINAL_BELL_SOUND_VALUES, TERMINAL_COMMAND_FIELD_TYPE_VALUES, TERMINAL_SHELL_QUOTE_STYLE_VALUES, TERMINAL_THEME_MODE_VALUES, TERMINAL_THEME_VALUES, TRANSLATION_CACHE_POLICY_VERSION, TRANSLATION_ENGINE_IDS, TRANSLATION_ENGINE_MANIFESTS, TRANSLATOR_CONTRACT_VERSION, TaskSchema, TemplateContentMapSchema, TemplateContentSchema, TemplatesSchema, TerminalBellSoundSchema, TerminalCommandFieldSchema, TerminalConfigSchema, TerminalControlParser, TerminalCwdTargetSchema, TerminalInvocationSettingsSchema, TerminalNotificationParser, TerminalRendererEngineSchema, TerminalShellProfileSchema, TerminalShellQuoteStyleSchema, TerminalSpawnCommandSchema, TerminalThemeModeSchema, TerminalThemeSchema, TrackedTaskProgressSchema, TranslationCacheEntrySchema, TranslationCacheReadInputSchema, TranslationCacheSettingsSchema, TranslationCacheSettingsUpdateSchema, TranslationCacheStatsSchema, TranslationCacheWriteInputSchema, TranslationDownloadFilePlanSchema, TranslationDownloadGroupPlanSchema, TranslationEngineAssetStateSchema, TranslationEngineAssetStatusSchema, TranslationEngineDependencyStateSchema, TranslationEngineDependencyStatusSchema, TranslationEngineGlobalSettingsSchema, TranslationEngineGlobalSettingsUpdateSchema, TranslationEngineIdSchema, TranslationEngineInstallLogEventSchema, TranslationEngineInstallLogStreamSchema, TranslationEngineLifecycleEventSchema, TranslationEngineLifecycleStatusSchema, TranslationEngineProjectSettingsSchema, TranslationEngineProjectSettingsUpdateSchema, TranslationEngineRuntimeStateSchema, TranslationEngineRuntimeStatusSchema, TranslationLocalCt2SettingsSchema, TranslationLocalCt2SettingsUpdateSchema, TranslationLocalLlamaSettingsSchema, TranslationLocalLlamaSettingsUpdateSchema, TranslationLocalSettingsSchema, TranslationLocalSettingsUpdateSchema, TranslationOpenAISettingsSchema, TranslationOpenAISettingsUpdateSchema, VIRTUAL_PROJECT_DIRNAME, Validator, accessGateFingerprint, acquireWatcher, acquireWatcherRoot, annotateOpenSpecFacts, annotateOpenSpecMarkdown, applyAgentDeliveryPolicy, asEnvUri, buildBackendHealthPayload, buildCliRunnerCandidates, buildEmbeddedUiLaunchUrl, buildHostedLaunchUrl, buildLocalDownloadPlanFromRepositoryFiles, buildLocalDownloadPlanFromRuntimeProfileFiles, buildMarkdownParentMap, buildOpsxEntityDetail, buildRuntimePackageInstallCommand, buildSpecCatalog, builtinOpenSpecReadingPlugin, checkLocalDirectionalModelLanguagePair, classifyStoreCliResult, clearCache, cliProjectionStates, closeAllProjectWatchers, closeAllWatchers, compareAndWriteAtomicPhysicalReactiveFile, computeEnvUri, constantTimeEqual, contextStorage, createApplyInstructionProgress, createCleanCliEnv, createCliProjectionStateSchema, createDocumentChecklistSummary, createFileChangeObservable, createMarkdownReadingDocument, createMarkdownReadingDocumentFromFacts, createOpenSpecReadingPlugin, createPhysicalReactiveDirectory, createStaticSpecCatalogOwnedProjection, createStaticSpecCatalogReferenceProjection, createStaticSpecCatalogReferenceSource, createToolInitStateProjection, createTrackedTaskProgress, createTranslationEngineLifecycleStatus, customHashFromSoundId, deriveTrackedTaskPhase, detectRuntimePackageManager, generateAccessGateCredential, getActiveWatcherCount, getAllToolIds, getAllTools, getAvailableToolIds, getAvailableTools, getBuiltinSoundUrl, getCacheSize, getConfiguredTools, getDefaultCliCommand, getDefaultCliCommandString, getDefaultGlobalSettingsPath, getDetectedProjectTools, getExternalAgentSkillsObservationRoots, getExternalCodexCommandObservationRoot, getManagedLocalTranslationEngineManifest, getMarkdownAnnotation, getMarkdownAnnotationsForFact, getMarkdownFactSpan, getMarkdownHeadingEnd, getMarkdownHeadingFacts, getNotificationGroupKey, getNotificationGroupLabel, getOpenSpecAnnotation, getOpenSpecAnnotationsForFact, getOpenSpecProjectionAnnotation, getOpenSpecReadingSections, getOpsxEntityMetadataPath, getOpsxEntityRootRelativePath, getProjectWatcher, getRootContextCliSelector, getSpecCatalogEntry, getTerminalCommandDefaultValues, getToolById, getToolInitStates, getTranslationEngineLifecycleMessage, getTranslationEngineManifest, getWatcherRuntimeStatus, groupNotifications, hasCapability, inferFileMime, inferFilePreviewKind, inferLocalDirectionalModelLanguagePair, inspectActiveRootOfficialConfig, inspectEnvironmentDefaultStore, inspectProjectBinding, isBackendHealthRuntimeMetadata, isBatchTranslationAbort, isDirectionalManagedLocalTranslationEngineId, isGlobPattern, isHostedBackendHealthResponse, isManagedLocalTranslationEngineId, isMarkdownTaskSourcePath, isOpsxCoreWorkflowSelection, isOpsxGlobPattern, isPreviewableFile, isReferencedSpecIdentity, isSupportedEmbeddedUiUrl, isTerminalMutationStatus, isTerminalRendererEngine, isTextLikeFile, isTextLikeMime, isToolConfigured, isTranslationEngineDependencyReady, isTranslationEngineRuntimeReady, isWatcherPoolInitialized, loadOpenSpecAgentCommandContents, mergeSpecCatalog, normalizeAccessGatePassword, normalizeAgentDeliveryPolicy, normalizeBatchTranslationError, normalizeEmbeddedUiUrl, normalizeHostedAppBaseUrl, normalizeLegacySoundId, normalizeOpsxEntityPath, openSpecAnnotationRules, opsxGlobToRegex, opsxPathMatchesPattern, parseCliCommand, parseCliCommandResult, parseMarkdownFacts, parseMarkdownTasks, parseOpenSpecMarkdownToSpec, parseOpsxEntityMetadata, parseOpsxSchemaDetail, patchActiveRootOfficialFields, projectAnnotatedOpenSpecToSpec, projectOpenSpecMarkdown, projectTaskProjectionsFromMarkdownFiles, quoteTerminalShellArg, reactiveExists, reactiveReadDir, reactiveReadFile, reactiveStat, redactSnapshotForPublication, removePhysicalReactivePath, renderTerminalCommandArgs, renderTerminalSpawnCommandLine, replaceFileAtomically, requireCanonicalOpenSpecEntityId, requireCanonicalOpenSpecSpecId, requireOpenSpecEntityRelativePath, resolveCommandInvocation, resolveGlobalSkillsInventoryDir, resolveHostedAppBaseUrl, resolveOpenSpecDataScope, resolveOpenSpecSpawnMode, resolveRootContext, resolveRuntimePackageInstallStrategy, resolveTerminalShellDefaults, resolveToolSkillsScope, resolveWindowsCommandInvocation, runControlledTranslationTask, runPhysicalReactivePathMutation, selectAgentDeliveryRegistry, selectLocalDownloadGroup, shouldShowTranslationEngineInstallGate, snapshotHasAbsolutePath, sniffGlobalCli, sortMarkdownReadingPlugins, soundIdFromCustomHash, spawnSafe, specDocumentDisplayPath, specIdentityFromRoute, specIdentityKey, specRoutePath, subscribeWatcherRuntimeStatus, terminalNotificationEventToPublishInput, terminateChildProcessTree, terminateWindowsProcessTreeByIdentity, toCliProjectionCommandEvidence, toCliProjectionFailure, toCliProjectionNotice, toMarkdownFactKind, toOpsxDisplayPath, toPersistedGlobalSettings, toStoreFeatureResult, toggleMarkdownTask, trimMarkdownSlice, updateProjectBindingContent, updateReactiveFileCache, validateActiveRootRawYaml, writeAtomicPhysicalReactiveFile, writePhysicalReactiveFile };
|
|
8928
|
+
export { ACCESS_GATE_CREDENTIAL_BYTES, AI_TOOLS, ActiveRootMutationSchema, ActiveRootOfficialConfigSchema, ActiveRootRevisionSchema, ActiveRootStructuredUpdateSchema, AgentDeliveryModeSchema, AgentDeliveryPolicyUpdateSchema, AgentDeliveryProfileSchema, AgentDeliveryWorkflowSchema, ApplyInstructionsContextFilesSchema, ApplyInstructionsProjectionSchema, ApplyInstructionsSchema, ApplyTaskSchema, ArchiveInstructionsSchema, ArtifactInstructionsSchema, ArtifactStatusSchema, BUILTIN_SOUND_IDS, BUILTIN_SOUND_OPTIONS, BUILTIN_TERMINAL_SPAWN_COMMANDS, BatchTranslateEventSchema, BatchTranslateInputSchema, BuiltinSoundIdSchema, CODE_EDITOR_THEME_VALUES, CUSTOM_SOUND_ADD_VALUE, ChangeFileSchema, ChangeSchema, ChangeStatusSchema, CliApplyInstructionsSchema, CliArchiveInstructionsSchema, CliArchiveSchema, CliArtifactInstructionsSchema, CliChangeListSchema, CliCommandTransportSchema, CliContextSchema, CliDiagnosticFailureSchema, CliDiagnosticSchema, CliDoctorReferenceEntrySchema, CliDoctorSchema, CliExecutor, CliJsonValueSchema, CliProjectionCommandError, CliProjectionCommandEvidenceSchema, CliProjectionFailureSchema, CliProjectionInvalidationCauseSchema, CliProjectionNoticeSchema, CliProjectionStateNameSchema, CliReferenceIndexEntrySchema, CliRootSchema, CliRootSourceSchema, CliShowSpecDocumentSchema, CliShowSpecSchema, CliSpecListSchema, CliStoreCleanupSchema, CliStoreDoctorEntrySchema, CliStoreDoctorSchema, CliStoreListSchema, CliStoreMutationSchema, CliStoreSchema, CliStreamTerminationError, CliValidateReportSchema, CliValidateSchema, CliWorkflowStatusSchema, CodeEditorThemeSchema, ConfigManager, CustomSoundHashSchema, CustomSoundIdSchema, CustomSoundMetadataFileSchema, CustomSoundMetadataSchema, DASHBOARD_METRIC_KEYS, DEFAULT_BELL_SOUND_ID, DEFAULT_CONFIG, DEFAULT_GIT_DIFF_EAGER_LINE_BUDGET, DEFAULT_GLOBAL_SETTINGS, DEFAULT_NOTIFICATION_SOUND_ID, DEFAULT_TERMINAL_DARK_THEME, DEFAULT_TERMINAL_LIGHT_THEME, DEFAULT_TERMINAL_THEME_MODE, DEFAULT_TRANSLATION_CACHE_ENTRY_LIMIT, DEFAULT_TRANSLATION_ENGINE_ID, DOCUMENT_TRANSLATION_DISPLAY_MODES, DashboardConfigSchema, DashboardGitSnapshotSchema, DashboardOverviewSchema, DashboardSummaryIdentitySchema, DashboardSummaryInvalidationCauseSchema, DashboardSummaryInvalidationSchema, DashboardSummaryProjectionSchema, DashboardSummaryProjectionStateSchema, DashboardTrendsProjectionSchema, DeltaOperationType, DeltaSchema, DeltaSpecSchema, DependencyInfoSchema, DocumentTranslationConfigSchema, DocumentTranslationConfigUpdateSchema, DocumentTranslationDisplayModeSchema, DocumentTranslationGlobalSettingsUpdateSchema, EnvironmentDefaultStoreUpdateSchema, EnvironmentGlobalConfigValueSchema, EnvironmentGlobalFileProjectionDataSchema, EnvironmentGlobalFileProjectionStateSchema, EnvironmentGlobalProjectionDataSchema, EnvironmentGlobalProjectionStateSchema, FILE_PREVIEW_KINDS, GitConfigSchema, GlobalSettingsManager, HOSTED_SHELL_PROTOCOL_VERSION, LEGACY_SOUND_ID_MAP, LOCAL_MODEL_PROFILE_DEFINITIONS, LocalModelAssetLogSchema, LocalModelAssetPlanSnapshotSchema, LocalModelAssetStateSchema, LocalModelDownloadStatusSchema, LocalModelLifecycleFileStateSchema, LocalModelLifecycleGroupStateSchema, LocalModelProfileLoadStateSchema, LocalModelProfileManifestFileSchema, LocalModelProfileManifestGroupSchema, LocalModelProfileManifestSchema, LocalModelProfileStatusSchema, MAX_ACTIVE_ROOT_CONTEXT_BYTES, MAX_TRANSLATION_CACHE_ENTRY_LIMIT, MIN_TRANSLATION_CACHE_ENTRY_LIMIT, ManagedLocalCatalogSourceSchema, MarkdownParser, MarkdownReadingPluginRegistry, NOTIFICATION_SOUND_OPTIONS, NOTIFICATION_SOUND_VALUES, NotificationActionSchema, NotificationGroupKeySchema, NotificationPublishInputSchema, NotificationRecordSchema, NotificationSettingsSchema, NotificationSoundSchema, NotificationSourceSchema, OFFICIAL_APP_BASE_URL, OPENCODE_PROVIDED_ARGUMENTS_LINE, OPENSPECUI_DOCUMENT_HOOK_VERSION, OPENSPECUI_RUNTIME_CAPABILITIES, OPENSPECUI_WORKFLOW_HOOK_VERSION, OPENSPEC_SPAWN_MODE_ENV, OPEN_SPEC_DATA_DIRECTORY_NAME, OPEN_SPEC_DATA_HOME_OBSERVATION_TARGETS, OPEN_SPEC_READING_SECTIONS_PROJECTION_ID, OPEN_SPEC_SPEC_PROJECTION_ID, OPSX_AGENT_INVOCATION_MODE_VALUES, OPSX_ALL_WORKFLOWS, OPSX_ARTIFACT_INPUT_ACTIONS, OPSX_CHANGE_INPUT_ACTIONS, OPSX_COMMAND_CAPABLE_WORKFLOWS, OPSX_CORE_PROFILE_WORKFLOWS, OPSX_TEXT_INPUT_ACTIONS, OPSX_WORKFLOW_LABELS, OPSX_WORKFLOW_TO_SKILL_DIR, OPSX_WORKFLOW_TO_SKILL_DIR as TOOL_WORKFLOW_TO_SKILL_DIR, OpenSpecAdapter, OpenSpecCliContractExecutor, OpenSpecDataHomeObserver, OpenSpecUIConfigSchema, OpenSpecUIGlobalSettingsSchema, OpenSpecUIGlobalSettingsUpdateSchema, OpenSpecWatcher, OpsxAgentInvocationModeSchema, OpsxCliEvidenceSchema, OpsxConfigBundleSchema, OpsxConfigSchema, OpsxKernel, OpsxStatusEvidenceSchema, OwnedSpecIdentitySchema, PINNED_AGENT_GENERATOR_VERSION, PlanningCliProjectionDataSchema, PlanningCliProjectionSelectorSchema, PlanningCliProjectionStateSchema, PlanningConfigJsonValueSchema, PlanningConfigReferenceSchema, ProjectBindingUpdateSchema, ProjectWatcher, PtyAttachMessageSchema, PtyBellResponseSchema, PtyBufferResponseSchema, PtyClientMessageSchema, PtyCloseMessageSchema, PtyCreateMessageSchema, PtyCreatedResponseSchema, PtyErrorCodeSchema, PtyErrorResponseSchema, PtyExitResponseSchema, PtyInputMessageSchema, PtyListMessageSchema, PtyListResponseSchema, PtyOutputResponseSchema, PtyPlatformSchema, PtyProcessTitleResponseSchema, PtyResizeMessageSchema, PtyServerMessageSchema, PtyTitleResponseSchema, RUNTIME_INVALIDATION_FACETS, ReactiveContext, ReactiveObservationEnvironment, ReactiveState, ReferencedSpecIdentitySchema, RequirementSchema, RuntimeInvalidationIndex, RuntimeRootInvalidationRegistry, SERVE_PRESENTATION_MODES, SERVICE_TRANSLATION_ENGINE_IDS, SHARED_AGENTS_SKILLS_OWNER_CANDIDATES, SHARED_AGENTS_SKILLS_ROOT, SHARED_SKILLS_TARGET_MARKER, SILENT_SOUND_ID, ScenarioStepKeywordSchema, ScenarioStepSchema, SchemaArtifactSchema, SchemaDetailSchema, SchemaInfoSchema, SchemaResolutionSchema, ServePresentationModeSchema, ServiceTranslationEngineIdSchema, SoundConfigIdSchema, SoundIdSchema, SpecCatalogSchema, SpecCommandEvidenceSchema, SpecDocumentProjectionSchema, SpecIdentitySchema, SpecSchema, StoreDoctorResultSchema, StoreListResultSchema, StoreMutationLifecycleEventSchema, StoreMutationResultSchema, StoreMutationSchema, StoreMutationStartResponseSchema, TERMINAL_BELL_SOUND_OPTIONS, TERMINAL_BELL_SOUND_VALUES, TERMINAL_COMMAND_FIELD_TYPE_VALUES, TERMINAL_SHELL_QUOTE_STYLE_VALUES, TERMINAL_THEME_MODE_VALUES, TERMINAL_THEME_VALUES, TRANSLATION_CACHE_POLICY_VERSION, TRANSLATION_ENGINE_IDS, TRANSLATION_ENGINE_MANIFESTS, TRANSLATOR_CONTRACT_VERSION, TaskSchema, TemplateContentMapSchema, TemplateContentSchema, TemplatesSchema, TerminalBellSoundSchema, TerminalCommandFieldSchema, TerminalConfigSchema, TerminalControlParser, TerminalCwdTargetSchema, TerminalInvocationSettingsSchema, TerminalNotificationParser, TerminalRendererEngineSchema, TerminalShellProfileSchema, TerminalShellQuoteStyleSchema, TerminalSpawnCommandSchema, TerminalThemeModeSchema, TerminalThemeSchema, TrackedTaskProgressSchema, TranslationCacheEntrySchema, TranslationCacheReadInputSchema, TranslationCacheSettingsSchema, TranslationCacheSettingsUpdateSchema, TranslationCacheStatsSchema, TranslationCacheWriteInputSchema, TranslationDownloadFilePlanSchema, TranslationDownloadGroupPlanSchema, TranslationEngineAssetStateSchema, TranslationEngineAssetStatusSchema, TranslationEngineDependencyStateSchema, TranslationEngineDependencyStatusSchema, TranslationEngineGlobalSettingsSchema, TranslationEngineGlobalSettingsUpdateSchema, TranslationEngineIdSchema, TranslationEngineInstallLogEventSchema, TranslationEngineInstallLogStreamSchema, TranslationEngineLifecycleEventSchema, TranslationEngineLifecycleStatusSchema, TranslationEngineProjectSettingsSchema, TranslationEngineProjectSettingsUpdateSchema, TranslationEngineRuntimeStateSchema, TranslationEngineRuntimeStatusSchema, TranslationLocalCt2SettingsSchema, TranslationLocalCt2SettingsUpdateSchema, TranslationLocalLlamaSettingsSchema, TranslationLocalLlamaSettingsUpdateSchema, TranslationLocalSettingsSchema, TranslationLocalSettingsUpdateSchema, TranslationOpenAISettingsSchema, TranslationOpenAISettingsUpdateSchema, VIRTUAL_PROJECT_DIRNAME, Validator, accessGateFingerprint, acquireWatcher, acquireWatcherRoot, annotateOpenSpecFacts, annotateOpenSpecMarkdown, applyAgentDeliveryPolicy, asEnvUri, buildBackendHealthPayload, buildCliRunnerCandidates, buildEmbeddedUiLaunchUrl, buildHostedLaunchUrl, buildLocalDownloadPlanFromRepositoryFiles, buildLocalDownloadPlanFromRuntimeProfileFiles, buildMarkdownParentMap, buildOpsxEntityDetail, buildRuntimePackageInstallCommand, buildSpecCatalog, builtinOpenSpecReadingPlugin, checkLocalDirectionalModelLanguagePair, classifyStoreCliResult, clearCache, cliProjectionStates, closeAllProjectWatchers, closeAllWatchers, compareAndWriteAtomicPhysicalReactiveFile, computeEnvUri, constantTimeEqual, contextStorage, createApplyInstructionProgress, createCleanCliEnv, createCliProjectionStateSchema, createDocumentChecklistSummary, createFileChangeObservable, createMarkdownReadingDocument, createMarkdownReadingDocumentFromFacts, createOpenSpecReadingPlugin, createPhysicalReactiveDirectory, createStaticSpecCatalogOwnedProjection, createStaticSpecCatalogReferenceProjection, createStaticSpecCatalogReferenceSource, createToolInitStateProjection, createTrackedTaskProgress, createTranslationEngineLifecycleStatus, customHashFromSoundId, deriveTrackedTaskPhase, detectRuntimePackageManager, generateAccessGateCredential, getActiveWatcherCount, getAllToolIds, getAllTools, getAvailableToolIds, getAvailableTools, getBuiltinSoundUrl, getCacheSize, getConfiguredTools, getDefaultCliCommand, getDefaultCliCommandString, getDefaultGlobalSettingsPath, getDetectedProjectTools, getExternalAgentSkillsObservationRoots, getExternalCodexCommandObservationRoot, getManagedLocalTranslationEngineManifest, getMarkdownAnnotation, getMarkdownAnnotationsForFact, getMarkdownFactSpan, getMarkdownHeadingEnd, getMarkdownHeadingFacts, getNotificationGroupKey, getNotificationGroupLabel, getOpenSpecAnnotation, getOpenSpecAnnotationsForFact, getOpenSpecProjectionAnnotation, getOpenSpecReadingSections, getOpsxEntityMetadataPath, getOpsxEntityRootRelativePath, getProjectWatcher, getRootContextCliSelector, getSpecCatalogEntry, getTerminalCommandDefaultValues, getToolById, getToolInitStates, getTranslationEngineLifecycleMessage, getTranslationEngineManifest, getWatcherRuntimeStatus, groupNotifications, hasCapability, inferFileMime, inferFilePreviewKind, inferLocalDirectionalModelLanguagePair, inspectActiveRootOfficialConfig, inspectEnvironmentDefaultStore, inspectProjectBinding, isBackendHealthRuntimeMetadata, isBatchTranslationAbort, isDirectionalManagedLocalTranslationEngineId, isEquivalentAgentCommandContent, isGlobPattern, isHostedBackendHealthResponse, isManagedLocalTranslationEngineId, isMarkdownTaskSourcePath, isOpsxCoreWorkflowSelection, isOpsxGlobPattern, isPreviewableFile, isReferencedSpecIdentity, isSupportedEmbeddedUiUrl, isTerminalMutationStatus, isTerminalRendererEngine, isTextLikeFile, isTextLikeMime, isToolConfigured, isTranslationEngineDependencyReady, isTranslationEngineRuntimeReady, isWatcherPoolInitialized, loadOpenSpecAgentCommandContents, mergeSpecCatalog, normalizeAccessGatePassword, normalizeAgentDeliveryPolicy, normalizeBatchTranslationError, normalizeEmbeddedUiUrl, normalizeHostedAppBaseUrl, normalizeLegacySoundId, normalizeOpsxEntityPath, openSpecAnnotationRules, opsxGlobToRegex, opsxPathMatchesPattern, parseCliCommand, parseCliCommandResult, parseMarkdownFacts, parseMarkdownTasks, parseOpenSpecCliSeries, parseOpenSpecMarkdownToSpec, parseOpsxEntityMetadata, parseOpsxSchemaDetail, patchActiveRootOfficialFields, projectAnnotatedOpenSpecToSpec, projectOpenSpecMarkdown, projectTaskProjectionsFromMarkdownFiles, quoteTerminalShellArg, reactiveExists, reactiveReadDir, reactiveReadFile, reactiveStat, redactSnapshotForPublication, removePhysicalReactivePath, renderTerminalCommandArgs, renderTerminalSpawnCommandLine, replaceFileAtomically, requireCanonicalOpenSpecEntityId, requireCanonicalOpenSpecSpecId, requireOpenSpecEntityRelativePath, resolveCommandInvocation, resolveGlobalSkillsInventoryDir, resolveHostedAppBaseUrl, resolveOpenSpecDataScope, resolveOpenSpecSpawnMode, resolveRootContext, resolveRuntimePackageInstallStrategy, resolveTerminalShellDefaults, resolveToolSkillsScope, resolveWindowsCommandInvocation, runControlledTranslationTask, runPhysicalReactivePathMutation, selectAgentDeliveryRegistry, selectLocalDownloadGroup, shouldShowTranslationEngineInstallGate, snapshotHasAbsolutePath, sniffGlobalCli, sortMarkdownReadingPlugins, soundIdFromCustomHash, spawnSafe, specDocumentDisplayPath, specIdentityFromRoute, specIdentityKey, specRoutePath, subscribeWatcherRuntimeStatus, terminalNotificationEventToPublishInput, terminateChildProcessTree, terminateWindowsProcessTreeByIdentity, toCliProjectionCommandEvidence, toCliProjectionFailure, toCliProjectionNotice, toMarkdownFactKind, toOpsxDisplayPath, toPersistedGlobalSettings, toStoreFeatureResult, toggleMarkdownTask, trimMarkdownSlice, updateProjectBindingContent, updateReactiveFileCache, validateActiveRootRawYaml, writeAtomicPhysicalReactiveFile, writePhysicalReactiveFile };
|