@openspecui/core 6.0.1 → 6.1.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/app-daemon-control.d.mts +362 -0
- package/dist/app-daemon-control.mjs +81 -0
- package/dist/{cli-projection-vO3-FJg5.mjs → cli-projection-BHfqvlpA.mjs} +1 -1
- package/dist/{cli-projection-w3LzenG5.d.mts → cli-projection-DVpaxd82.d.mts} +9 -9
- package/dist/cli-projection.d.mts +5 -5
- package/dist/cli-projection.mjs +2 -2
- package/dist/{command-result-CjnZNtGL.d.mts → command-result-BRYzlmg1.d.mts} +71 -60
- package/dist/{dashboard-summary-transport-CYBuU4iT.mjs → dashboard-summary-transport-BMtZ0q12.mjs} +2 -2
- package/dist/{dashboard-summary-transport-DAFz2ZQe.d.mts → dashboard-summary-transport-DEjdVWdn.d.mts} +4080 -2642
- package/dist/dashboard-summary-transport.d.mts +25 -24
- package/dist/dashboard-summary-transport.mjs +4 -4
- package/dist/{document-translation-CeJFGMoy.mjs → document-translation-CUkkxnYV.mjs} +1 -1
- package/dist/{document-translation-DyEj4JKj.d.mts → document-translation-J_NddeDy.d.mts} +100 -100
- package/dist/document-translation.d.mts +1 -1
- package/dist/document-translation.mjs +2 -2
- package/dist/{hosted-app-Y7yqlPBG.mjs → hosted-app-C3gBSvov.mjs} +3 -2
- package/dist/hosted-app.d.mts +26 -25
- package/dist/hosted-app.mjs +8 -7
- package/dist/{hosted-contract-BuhF_tuQ.mjs → hosted-contract-CaN2aw54.mjs} +31 -7
- package/dist/hosted-contract.d.mts +26 -25
- package/dist/hosted-contract.mjs +7 -6
- package/dist/index.d.mts +26 -25
- package/dist/index.mjs +953 -102
- package/dist/{local-download-profiles-BokmRLew.d.mts → local-download-profiles-CI66p2NW.d.mts} +1 -1
- package/dist/local-download-profiles.d.mts +2 -2
- package/dist/local-download-profiles.mjs +1 -1
- package/dist/markdown-facts.d.mts +1 -1
- package/dist/markdown-facts.mjs +1 -1
- package/dist/{markdown-reading-mG4OAbDO.mjs → markdown-reading-0L-mVBJp.mjs} +1 -1
- package/dist/{markdown-reading-LUdqfbxH.d.mts → markdown-reading-w686Obnl.d.mts} +1 -1
- package/dist/markdown-reading.d.mts +2 -2
- package/dist/markdown-reading.mjs +2 -2
- package/dist/{notifications-CgJlLgLO.d.mts → notifications-DaDB-ZBM.d.mts} +1 -1
- package/dist/{notifications-C2bxAzX_.mjs → notifications-E6_WBjQO.mjs} +2 -2
- package/dist/notifications.d.mts +2 -2
- package/dist/notifications.mjs +3 -3
- package/dist/{openspec-annotations-C58Aoi-V.d.mts → openspec-annotations-BXAqKLXc.d.mts} +2 -2
- package/dist/{openspec-annotations-DCfqBMal.mjs → openspec-annotations-DiHje5HD.mjs} +2 -2
- package/dist/openspec-annotations.d.mts +3 -3
- package/dist/openspec-annotations.mjs +3 -3
- package/dist/openspec-compat.d.mts +12 -10
- package/dist/openspec-compat.mjs +19 -23
- package/dist/{openspec-projection-DnB0EalA.d.mts → openspec-projection-DrrLI_ub.d.mts} +3 -3
- package/dist/{openspec-projection-DCgToo0Q.mjs → openspec-projection-DvJnsxLZ.mjs} +2 -2
- package/dist/openspec-projection.d.mts +5 -5
- package/dist/openspec-projection.mjs +4 -4
- package/dist/opsx-display-path.d.mts +1 -1
- package/dist/opsx-display-path.mjs +1 -1
- package/dist/{opsx-entity-CQGXOj_a.d.mts → opsx-entity-BhMqFWGT.d.mts} +2 -2
- package/dist/opsx-entity.d.mts +7 -7
- package/dist/opsx-entity.mjs +1 -1
- package/dist/{opsx-schema-detail-DTWBhlbh.d.mts → opsx-schema-detail-DvkJvwg_.d.mts} +2 -2
- package/dist/opsx-schema-detail.d.mts +8 -8
- package/dist/opsx-schema-detail.mjs +1 -1
- package/dist/{opsx-types-BKGpvDDe.d.mts → opsx-types-DRg1Yo2Y.d.mts} +213 -213
- package/dist/opsx-workflows.d.mts +1 -1
- package/dist/opsx-workflows.mjs +1 -1
- package/dist/{planning-cli-projection-DIRxeq2H.mjs → planning-cli-projection-DrkT18EI.mjs} +4 -4
- package/dist/planning-cli-projection.d.mts +25 -24
- package/dist/planning-cli-projection.mjs +7 -7
- package/dist/{schemas-C-BZiH0m.d.mts → schemas-Bafi7L8Y.d.mts} +190 -190
- package/dist/{sounds-qhRgCy0F.d.mts → sounds-B6SBMmGR.d.mts} +8 -8
- package/dist/sounds.d.mts +1 -1
- package/dist/sounds.mjs +1 -1
- package/dist/{spec-catalog-ZGuiZ4CE.mjs → spec-catalog-Dv2qolxy.mjs} +3 -3
- package/dist/spec-catalog.d.mts +25 -24
- package/dist/spec-catalog.mjs +4 -4
- package/dist/store-content-projection-BPDCma8v.d.mts +463 -0
- package/dist/store-content-projection-CiMcGZnG.mjs +82 -0
- package/dist/store-content-projection.d.mts +2 -0
- package/dist/store-content-projection.mjs +4 -0
- package/dist/{store-mutation-protocol-CSwD-xPO.mjs → store-mutation-protocol-CLtYUSwC.mjs} +1 -1
- package/dist/{store-mutation-protocol-3TzQ6ete.d.mts → store-mutation-protocol-Ckcv2-zs.d.mts} +48 -48
- package/dist/store-mutation-protocol.d.mts +1 -1
- package/dist/store-mutation-protocol.mjs +2 -2
- package/dist/{store-types-QeY5nWlF.d.mts → store-types-B0Qx8UPs.d.mts} +1 -1
- package/dist/store-types.d.mts +5 -5
- package/dist/store-types.mjs +1 -1
- package/dist/{task-progress-B_IWVXjA.mjs → task-progress-DpZak5xA.mjs} +1 -1
- package/dist/task-progress.d.mts +6 -6
- package/dist/task-progress.mjs +2 -2
- package/dist/{terminal-audio-tXDm_EDe.d.mts → terminal-audio-BoIZa5SP.d.mts} +1 -1
- package/dist/{terminal-audio-d6KItUeJ.mjs → terminal-audio-punFQHXI.mjs} +1 -1
- package/dist/terminal-audio.d.mts +2 -2
- package/dist/terminal-audio.mjs +2 -2
- package/dist/terminal-control.d.mts +2 -2
- package/dist/terminal-control.mjs +1 -1
- package/dist/{terminal-invocation-rKDNnsUS.d.mts → terminal-invocation-ChWI_i72.d.mts} +86 -86
- package/dist/terminal-invocation.d.mts +1 -1
- package/dist/terminal-invocation.mjs +1 -1
- package/dist/terminal-theme.d.mts +1 -1
- package/dist/terminal-theme.mjs +1 -1
- package/dist/translation-language-pair.d.mts +1 -1
- package/dist/translation-language-pair.mjs +1 -1
- package/dist/{translator-BEiXnLjR.d.mts → translator-C7d_Bkbo.d.mts} +204 -204
- package/dist/translator.d.mts +1 -1
- package/dist/translator.mjs +1 -1
- package/dist/workspace-directory-catalog.d.mts +172 -0
- package/dist/workspace-directory-catalog.mjs +111 -0
- package/package.json +28 -5
- /package/dist/{common-D8YUK9dA.mjs → common-BpgNUOOT.mjs} +0 -0
- /package/dist/{local-download-profiles-odzOdf96.mjs → local-download-profiles-DK4g6FRe.mjs} +0 -0
- /package/dist/{markdown-facts-CCw3QdbM.d.mts → markdown-facts-C9yWB2I9.d.mts} +0 -0
- /package/dist/{markdown-facts-BUqLvFRf.mjs → markdown-facts-Dve6IAJP.mjs} +0 -0
- /package/dist/{opsx-display-path-D13XV20v.mjs → opsx-display-path-DuPEvPV0.mjs} +0 -0
- /package/dist/{opsx-display-path-RXS5JTbV.d.mts → opsx-display-path-eWJ4ve-O.d.mts} +0 -0
- /package/dist/{opsx-entity-Cn_Zu1J3.mjs → opsx-entity-Br5S5N0o.mjs} +0 -0
- /package/dist/{opsx-schema-detail-Beis4Ba2.mjs → opsx-schema-detail-CckZIEVr.mjs} +0 -0
- /package/dist/{opsx-workflows-BvnJqjfL.d.mts → opsx-workflows-Bhh_bI-e.d.mts} +0 -0
- /package/dist/{opsx-workflows-Ccc6U7IR.mjs → opsx-workflows-GPZSe1C_.mjs} +0 -0
- /package/dist/{schemas-BFroDdOC.mjs → schemas-BrS9qSB3.mjs} +0 -0
- /package/dist/{sounds-NXwveBqq.mjs → sounds-na4c8j0c.mjs} +0 -0
- /package/dist/{store-types-DlX1REBg.mjs → store-types-Cs40yohL.mjs} +0 -0
- /package/dist/{terminal-control-BSAlOTs8.mjs → terminal-control-BvoxwQ6m.mjs} +0 -0
- /package/dist/{terminal-invocation-0p-j2eSP.mjs → terminal-invocation-BexVY5E2.mjs} +0 -0
- /package/dist/{terminal-theme-m3MSGJ7U.d.mts → terminal-theme-BzARb2Do.d.mts} +0 -0
- /package/dist/{terminal-theme-B8iRttTR.mjs → terminal-theme-DIhzj5Si.mjs} +0 -0
- /package/dist/{translation-language-pair-Bbhk-LAC.mjs → translation-language-pair-BV2cGjfv.mjs} +0 -0
- /package/dist/{translation-language-pair-C18GPATW.d.mts → translation-language-pair-DeAiww3_.d.mts} +0 -0
- /package/dist/{translator-Cjtv4tya.mjs → translator-DCCZeHt1.mjs} +0 -0
package/dist/index.mjs
CHANGED
|
@@ -1,36 +1,37 @@
|
|
|
1
|
-
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-
|
|
2
|
-
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-
|
|
3
|
-
import { t as parseOpsxSchemaDetail } from "./opsx-schema-detail-
|
|
4
|
-
import { n as toMarkdownFactKind, t as parseMarkdownFacts } from "./markdown-facts-
|
|
5
|
-
import { a as getMarkdownAnnotation, c as getMarkdownHeadingEnd, d as trimMarkdownSlice, i as createMarkdownReadingDocumentFromFacts, l as getMarkdownHeadingFacts, n as buildMarkdownParentMap, o as getMarkdownAnnotationsForFact, r as createMarkdownReadingDocument, s as getMarkdownFactSpan, t as MarkdownReadingPluginRegistry, u as sortMarkdownReadingPlugins } from "./markdown-reading-
|
|
6
|
-
import { a as getOpenSpecAnnotationsForFact, i as getOpenSpecAnnotation, n as annotateOpenSpecMarkdown, o as openSpecAnnotationRules, r as builtinOpenSpecReadingPlugin, t as annotateOpenSpecFacts } from "./openspec-annotations-
|
|
7
|
-
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-
|
|
8
|
-
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-
|
|
9
|
-
import { a as CliRootSchema, i as CliReferenceIndexEntrySchema, n as CliDiagnosticSchema, o as CliRootSourceSchema, r as CliDoctorReferenceEntrySchema, t as CliDiagnosticFailureSchema } from "./common-
|
|
10
|
-
import { A as CliSchemasSchema, B as CliStoreCleanupSchema, C as CliArtifactInstructionsSuccessSchema, F as CliValidateSchema, G as CliStoreSchema, H as CliStoreDoctorSchema, I as CliWorkflowStatusSchema, K as parseCliCommandResult, L as CliWorkflowStatusSuccessSchema, M as CliShowSpecSchema, N as CliSpecListSchema, R as CliContextSchema, S as CliArtifactInstructionsSchema, T as CliChangeListSchema, U as CliStoreListSchema, V as CliStoreDoctorEntrySchema, W as CliStoreMutationSchema, _ as OpenSpecCliContractExecutor, a as SpecDocumentProjectionSchema, b as CliApplyInstructionsSuccessSchema, c as createStaticSpecCatalogOwnedProjection, d as getSpecCatalogEntry, f as isReferencedSpecIdentity, g as specRoutePath, h as specIdentityKey, i as SpecCommandEvidenceSchema, j as CliShowSpecDocumentSchema, l as createStaticSpecCatalogReferenceProjection, m as specIdentityFromRoute, n as ReferencedSpecIdentitySchema, o as SpecIdentitySchema, p as mergeSpecCatalog, r as SpecCatalogSchema, s as buildSpecCatalog, t as OwnedSpecIdentitySchema, u as createStaticSpecCatalogReferenceSource, x as CliArchiveSchema, y as CliApplyInstructionsSchema, z as CliDoctorSchema } from "./spec-catalog-
|
|
11
|
-
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-
|
|
12
|
-
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-
|
|
13
|
-
import { a as DocumentTranslationDisplayModeSchema, c as TRANSLATION_CACHE_POLICY_VERSION, d as TranslationCacheSettingsSchema, f as TranslationCacheSettingsUpdateSchema, g as TranslationEngineProjectSettingsUpdateSchema, h as TranslationEngineProjectSettingsSchema, i as DocumentTranslationConfigUpdateSchema, l as TranslationCacheEntrySchema, m as TranslationCacheWriteInputSchema, n as DOCUMENT_TRANSLATION_DISPLAY_MODES, o as MAX_TRANSLATION_CACHE_ENTRY_LIMIT, p as TranslationCacheStatsSchema, r as DocumentTranslationConfigSchema, s as MIN_TRANSLATION_CACHE_ENTRY_LIMIT, t as DEFAULT_TRANSLATION_CACHE_ENTRY_LIMIT, u as TranslationCacheReadInputSchema } from "./document-translation-
|
|
14
|
-
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-
|
|
15
|
-
import { n as terminalNotificationEventToPublishInput, t as TerminalControlParser } from "./terminal-control-
|
|
16
|
-
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-
|
|
17
|
-
import { n as TERMINAL_BELL_SOUND_VALUES, r as TerminalBellSoundSchema, t as TERMINAL_BELL_SOUND_OPTIONS } from "./terminal-audio-
|
|
18
|
-
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-
|
|
19
|
-
import { i as selectLocalDownloadGroup, n as buildLocalDownloadPlanFromRepositoryFiles, r as buildLocalDownloadPlanFromRuntimeProfileFiles, t as LOCAL_MODEL_PROFILE_DEFINITIONS } from "./local-download-profiles-
|
|
20
|
-
import { n as inferLocalDirectionalModelLanguagePair, t as checkLocalDirectionalModelLanguagePair } from "./translation-language-pair-
|
|
21
|
-
import { C as TemplateContentMapSchema, E as isGlobPattern, S as SchemaResolutionSchema, T as TemplatesSchema, _ as OpsxConfigBundleSchema, a as PlanningCliProjectionDataSchema, b as SchemaDetailSchema, c as ApplyInstructionsContextFilesSchema, d as ApplyTaskSchema, f as ArtifactInstructionsSchema, g as OpsxCliEvidenceSchema, h as DependencyInfoSchema, i as EnvironmentGlobalProjectionStateSchema, l as ApplyInstructionsProjectionSchema, m as ChangeStatusSchema, n as EnvironmentGlobalFileProjectionStateSchema, o as PlanningCliProjectionSelectorSchema, p as ArtifactStatusSchema, r as EnvironmentGlobalProjectionDataSchema, s as PlanningCliProjectionStateSchema, t as EnvironmentGlobalFileProjectionDataSchema, u as ApplyInstructionsSchema, v as OpsxStatusEvidenceSchema, w as TemplateContentSchema, x as SchemaInfoSchema, y as SchemaArtifactSchema } from "./planning-cli-projection-
|
|
22
|
-
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-
|
|
23
|
-
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-
|
|
24
|
-
import {
|
|
25
|
-
import
|
|
26
|
-
import {
|
|
27
|
-
import {
|
|
28
|
-
import { n as
|
|
29
|
-
import {
|
|
1
|
+
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-BrS9qSB3.mjs";
|
|
2
|
+
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-Br5S5N0o.mjs";
|
|
3
|
+
import { t as parseOpsxSchemaDetail } from "./opsx-schema-detail-CckZIEVr.mjs";
|
|
4
|
+
import { n as toMarkdownFactKind, t as parseMarkdownFacts } from "./markdown-facts-Dve6IAJP.mjs";
|
|
5
|
+
import { a as getMarkdownAnnotation, c as getMarkdownHeadingEnd, d as trimMarkdownSlice, i as createMarkdownReadingDocumentFromFacts, l as getMarkdownHeadingFacts, n as buildMarkdownParentMap, o as getMarkdownAnnotationsForFact, r as createMarkdownReadingDocument, s as getMarkdownFactSpan, t as MarkdownReadingPluginRegistry, u as sortMarkdownReadingPlugins } from "./markdown-reading-0L-mVBJp.mjs";
|
|
6
|
+
import { a as getOpenSpecAnnotationsForFact, i as getOpenSpecAnnotation, n as annotateOpenSpecMarkdown, o as openSpecAnnotationRules, r as builtinOpenSpecReadingPlugin, t as annotateOpenSpecFacts } from "./openspec-annotations-DiHje5HD.mjs";
|
|
7
|
+
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-DvJnsxLZ.mjs";
|
|
8
|
+
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-DpZak5xA.mjs";
|
|
9
|
+
import { a as CliRootSchema, i as CliReferenceIndexEntrySchema, n as CliDiagnosticSchema, o as CliRootSourceSchema, r as CliDoctorReferenceEntrySchema, t as CliDiagnosticFailureSchema } from "./common-BpgNUOOT.mjs";
|
|
10
|
+
import { A as CliSchemasSchema, B as CliStoreCleanupSchema, C as CliArtifactInstructionsSuccessSchema, F as CliValidateSchema, G as CliStoreSchema, H as CliStoreDoctorSchema, I as CliWorkflowStatusSchema, K as parseCliCommandResult, L as CliWorkflowStatusSuccessSchema, M as CliShowSpecSchema, N as CliSpecListSchema, R as CliContextSchema, S as CliArtifactInstructionsSchema, T as CliChangeListSchema, U as CliStoreListSchema, V as CliStoreDoctorEntrySchema, W as CliStoreMutationSchema, _ as OpenSpecCliContractExecutor, a as SpecDocumentProjectionSchema, b as CliApplyInstructionsSuccessSchema, c as createStaticSpecCatalogOwnedProjection, d as getSpecCatalogEntry, f as isReferencedSpecIdentity, g as specRoutePath, h as specIdentityKey, i as SpecCommandEvidenceSchema, j as CliShowSpecDocumentSchema, l as createStaticSpecCatalogReferenceProjection, m as specIdentityFromRoute, n as ReferencedSpecIdentitySchema, o as SpecIdentitySchema, p as mergeSpecCatalog, r as SpecCatalogSchema, s as buildSpecCatalog, t as OwnedSpecIdentitySchema, u as createStaticSpecCatalogReferenceSource, x as CliArchiveSchema, y as CliApplyInstructionsSchema, z as CliDoctorSchema } from "./spec-catalog-Dv2qolxy.mjs";
|
|
11
|
+
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-BHfqvlpA.mjs";
|
|
12
|
+
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-DCCZeHt1.mjs";
|
|
13
|
+
import { a as DocumentTranslationDisplayModeSchema, c as TRANSLATION_CACHE_POLICY_VERSION, d as TranslationCacheSettingsSchema, f as TranslationCacheSettingsUpdateSchema, g as TranslationEngineProjectSettingsUpdateSchema, h as TranslationEngineProjectSettingsSchema, i as DocumentTranslationConfigUpdateSchema, l as TranslationCacheEntrySchema, m as TranslationCacheWriteInputSchema, n as DOCUMENT_TRANSLATION_DISPLAY_MODES, o as MAX_TRANSLATION_CACHE_ENTRY_LIMIT, p as TranslationCacheStatsSchema, r as DocumentTranslationConfigSchema, s as MIN_TRANSLATION_CACHE_ENTRY_LIMIT, t as DEFAULT_TRANSLATION_CACHE_ENTRY_LIMIT, u as TranslationCacheReadInputSchema } from "./document-translation-CUkkxnYV.mjs";
|
|
14
|
+
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-na4c8j0c.mjs";
|
|
15
|
+
import { n as terminalNotificationEventToPublishInput, t as TerminalControlParser } from "./terminal-control-BvoxwQ6m.mjs";
|
|
16
|
+
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-E6_WBjQO.mjs";
|
|
17
|
+
import { n as TERMINAL_BELL_SOUND_VALUES, r as TerminalBellSoundSchema, t as TERMINAL_BELL_SOUND_OPTIONS } from "./terminal-audio-punFQHXI.mjs";
|
|
18
|
+
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-DIhzj5Si.mjs";
|
|
19
|
+
import { i as selectLocalDownloadGroup, n as buildLocalDownloadPlanFromRepositoryFiles, r as buildLocalDownloadPlanFromRuntimeProfileFiles, t as LOCAL_MODEL_PROFILE_DEFINITIONS } from "./local-download-profiles-DK4g6FRe.mjs";
|
|
20
|
+
import { n as inferLocalDirectionalModelLanguagePair, t as checkLocalDirectionalModelLanguagePair } from "./translation-language-pair-BV2cGjfv.mjs";
|
|
21
|
+
import { C as TemplateContentMapSchema, E as isGlobPattern, S as SchemaResolutionSchema, T as TemplatesSchema, _ as OpsxConfigBundleSchema, a as PlanningCliProjectionDataSchema, b as SchemaDetailSchema, c as ApplyInstructionsContextFilesSchema, d as ApplyTaskSchema, f as ArtifactInstructionsSchema, g as OpsxCliEvidenceSchema, h as DependencyInfoSchema, i as EnvironmentGlobalProjectionStateSchema, l as ApplyInstructionsProjectionSchema, m as ChangeStatusSchema, n as EnvironmentGlobalFileProjectionStateSchema, o as PlanningCliProjectionSelectorSchema, p as ArtifactStatusSchema, r as EnvironmentGlobalProjectionDataSchema, s as PlanningCliProjectionStateSchema, t as EnvironmentGlobalFileProjectionDataSchema, u as ApplyInstructionsSchema, v as OpsxStatusEvidenceSchema, w as TemplateContentSchema, x as SchemaInfoSchema, y as SchemaArtifactSchema } from "./planning-cli-projection-DrkT18EI.mjs";
|
|
22
|
+
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-GPZSe1C_.mjs";
|
|
23
|
+
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-BMtZ0q12.mjs";
|
|
24
|
+
import { a as StoreListResultSchema, n as StoreDoctorResultSchema, o as classifyStoreCliResult, s as toStoreFeatureResult } from "./store-types-Cs40yohL.mjs";
|
|
25
|
+
import "./store-content-projection-CiMcGZnG.mjs";
|
|
26
|
+
import { i as StoreMutationStartResponseSchema, n as StoreMutationResultSchema, r as StoreMutationSchema, t as StoreMutationLifecycleEventSchema } from "./store-mutation-protocol-CLtYUSwC.mjs";
|
|
27
|
+
import { C as OPENSPECUI_RUNTIME_CAPABILITIES, D as isTerminalMutationStatus, E as hasCapability, T as asEnvUri, t as HOSTED_SHELL_PROTOCOL_VERSION } from "./hosted-contract-CaN2aw54.mjs";
|
|
28
|
+
import { a as buildHostedLaunchUrl, c as isSupportedEmbeddedUiUrl, d as resolveHostedAppBaseUrl, i as buildEmbeddedUiLaunchUrl, l as normalizeEmbeddedUiUrl, n as OFFICIAL_APP_BASE_URL, o as isBackendHealthRuntimeMetadata, r as buildBackendHealthPayload, s as isHostedBackendHealthResponse, u as normalizeHostedAppBaseUrl } from "./hosted-app-C3gBSvov.mjs";
|
|
29
|
+
import { n as toOpsxDisplayPath, t as VIRTUAL_PROJECT_DIRNAME } from "./opsx-display-path-DuPEvPV0.mjs";
|
|
30
|
+
import { a as TerminalInvocationSettingsSchema, c as TerminalSpawnCommandSchema, f as quoteTerminalShellArg, g as resolveTerminalShellDefaults, h as renderTerminalSpawnCommandLine, i as TerminalCommandFieldSchema, n as TERMINAL_COMMAND_FIELD_TYPE_VALUES, o as TerminalShellProfileSchema, p as renderTerminalCommandArgs, r as TERMINAL_SHELL_QUOTE_STYLE_VALUES, s as TerminalShellQuoteStyleSchema, t as BUILTIN_TERMINAL_SPAWN_COMMANDS, u as getTerminalCommandDefaultValues } from "./terminal-invocation-BexVY5E2.mjs";
|
|
30
31
|
import { mkdir, writeFile } from "fs/promises";
|
|
31
32
|
import { dirname, join } from "path";
|
|
32
33
|
import { isMap, parseDocument } from "yaml";
|
|
33
|
-
import { lstat, mkdir as mkdir$1, readFile, readdir, realpath, rm, stat, writeFile as writeFile$1 } from "node:fs/promises";
|
|
34
|
+
import { access, lstat, mkdir as mkdir$1, readFile, readdir, realpath, rm, stat, writeFile as writeFile$1 } from "node:fs/promises";
|
|
34
35
|
import { basename, dirname as dirname$1, isAbsolute, join as join$1, matchesGlob, posix, relative, resolve, sep, win32 } from "node:path";
|
|
35
36
|
import { existsSync, lstatSync, readFileSync, realpathSync } from "node:fs";
|
|
36
37
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
@@ -40,7 +41,10 @@ import { watch } from "fs";
|
|
|
40
41
|
import { exec, execFile } from "child_process";
|
|
41
42
|
import { promisify } from "util";
|
|
42
43
|
import crossSpawn from "cross-spawn";
|
|
43
|
-
import { homedir, platform } from "node:os";
|
|
44
|
+
import { homedir, loadavg, platform } from "node:os";
|
|
45
|
+
import { context, trace } from "@opentelemetry/api";
|
|
46
|
+
import { performance as performance$1 } from "node:perf_hooks";
|
|
47
|
+
import { Worker } from "node:worker_threads";
|
|
44
48
|
import { createHash, randomBytes } from "node:crypto";
|
|
45
49
|
|
|
46
50
|
//#region src/entity-id.ts
|
|
@@ -1127,10 +1131,10 @@ var ReactiveState = class {
|
|
|
1127
1131
|
* 如果在 ReactiveContext 中调用,会自动注册依赖
|
|
1128
1132
|
*/
|
|
1129
1133
|
get() {
|
|
1130
|
-
const context = contextStorage.getStore();
|
|
1131
|
-
if (context) {
|
|
1132
|
-
context.track(this);
|
|
1133
|
-
this.subscribers.add(context);
|
|
1134
|
+
const context$1 = contextStorage.getStore();
|
|
1135
|
+
if (context$1) {
|
|
1136
|
+
context$1.track(this);
|
|
1137
|
+
this.subscribers.add(context$1);
|
|
1134
1138
|
}
|
|
1135
1139
|
return this.currentValue;
|
|
1136
1140
|
}
|
|
@@ -1142,15 +1146,15 @@ var ReactiveState = class {
|
|
|
1142
1146
|
set(newValue) {
|
|
1143
1147
|
if (this.equals(this.currentValue, newValue)) return false;
|
|
1144
1148
|
this.currentValue = newValue;
|
|
1145
|
-
for (const context of this.subscribers) context.notifyChange();
|
|
1149
|
+
for (const context$1 of this.subscribers) context$1.notifyChange();
|
|
1146
1150
|
return true;
|
|
1147
1151
|
}
|
|
1148
1152
|
/**
|
|
1149
1153
|
* 取消订阅
|
|
1150
1154
|
* 当 Context 销毁时调用
|
|
1151
1155
|
*/
|
|
1152
|
-
unsubscribe(context) {
|
|
1153
|
-
this.subscribers.delete(context);
|
|
1156
|
+
unsubscribe(context$1) {
|
|
1157
|
+
this.subscribers.delete(context$1);
|
|
1154
1158
|
}
|
|
1155
1159
|
/**
|
|
1156
1160
|
* 获取当前订阅者数量(用于调试)
|
|
@@ -2600,55 +2604,164 @@ function spawnSafe(command, args, options) {
|
|
|
2600
2604
|
};
|
|
2601
2605
|
}
|
|
2602
2606
|
}
|
|
2603
|
-
function killChild(child) {
|
|
2607
|
+
function killChild(child, signal = "SIGTERM") {
|
|
2604
2608
|
try {
|
|
2605
|
-
child.kill();
|
|
2609
|
+
child.kill(signal);
|
|
2606
2610
|
} catch {}
|
|
2607
2611
|
}
|
|
2612
|
+
const EAGER_JSON_EXIT_GRACE_MS = 25;
|
|
2613
|
+
const BUFFERED_FORCE_KILL_DELAY_MS = 1e3;
|
|
2608
2614
|
function runBufferedCommand(options) {
|
|
2609
2615
|
return new Promise((resolve$1) => {
|
|
2616
|
+
const phases = {
|
|
2617
|
+
spawnCalledAt: performance.now(),
|
|
2618
|
+
spawnReturnedAt: 0,
|
|
2619
|
+
spawnObservedAt: 0,
|
|
2620
|
+
firstStdoutAt: 0,
|
|
2621
|
+
firstStderrAt: 0,
|
|
2622
|
+
jsonCompleteAt: 0,
|
|
2623
|
+
terminationRequestedAt: 0,
|
|
2624
|
+
resultResolvedAt: 0,
|
|
2625
|
+
exitAt: 0,
|
|
2626
|
+
closeAt: 0,
|
|
2627
|
+
eagerResolved: false,
|
|
2628
|
+
resultReason: null
|
|
2629
|
+
};
|
|
2630
|
+
const observe = (phase, evidence = {}) => {
|
|
2631
|
+
options.onPhase?.({
|
|
2632
|
+
phase,
|
|
2633
|
+
at: performance.now(),
|
|
2634
|
+
...evidence
|
|
2635
|
+
});
|
|
2636
|
+
};
|
|
2637
|
+
observe("spawn-called");
|
|
2610
2638
|
const started = spawnSafe(options.command, options.args, {
|
|
2611
2639
|
cwd: options.cwd,
|
|
2612
2640
|
shell: false,
|
|
2613
2641
|
env: options.env
|
|
2614
2642
|
});
|
|
2615
2643
|
if (!started.ok) {
|
|
2644
|
+
observe("spawn-error", { reason: "spawn-error" });
|
|
2645
|
+
phases.resultResolvedAt = performance.now();
|
|
2646
|
+
phases.resultReason = "spawn-error";
|
|
2647
|
+
observe("result-resolved", { reason: "spawn-error" });
|
|
2616
2648
|
resolve$1({
|
|
2617
2649
|
stdout: "",
|
|
2618
2650
|
stderr: "",
|
|
2619
2651
|
exitCode: null,
|
|
2620
2652
|
timedOut: false,
|
|
2621
|
-
spawnError: started.error
|
|
2653
|
+
spawnError: started.error,
|
|
2654
|
+
phases
|
|
2622
2655
|
});
|
|
2623
2656
|
return;
|
|
2624
2657
|
}
|
|
2625
2658
|
const { child } = started;
|
|
2659
|
+
phases.spawnReturnedAt = performance.now();
|
|
2660
|
+
observe("spawn-returned", { pid: child.pid });
|
|
2626
2661
|
let stdout = "";
|
|
2627
2662
|
let stderr = "";
|
|
2628
2663
|
let timedOut = false;
|
|
2629
2664
|
let settled = false;
|
|
2665
|
+
let eagerJsonTimer = null;
|
|
2666
|
+
let forceKillTimer = null;
|
|
2667
|
+
const clearEagerJsonTimer = () => {
|
|
2668
|
+
if (!eagerJsonTimer) return;
|
|
2669
|
+
clearTimeout(eagerJsonTimer);
|
|
2670
|
+
eagerJsonTimer = null;
|
|
2671
|
+
};
|
|
2672
|
+
const clearForceKillTimer = () => {
|
|
2673
|
+
if (!forceKillTimer) return;
|
|
2674
|
+
clearTimeout(forceKillTimer);
|
|
2675
|
+
forceKillTimer = null;
|
|
2676
|
+
};
|
|
2677
|
+
const requestTermination = (reason) => {
|
|
2678
|
+
if (!phases.terminationRequestedAt) {
|
|
2679
|
+
phases.terminationRequestedAt = performance.now();
|
|
2680
|
+
observe("termination-requested", { reason });
|
|
2681
|
+
}
|
|
2682
|
+
killChild(child);
|
|
2683
|
+
if (forceKillTimer) return;
|
|
2684
|
+
forceKillTimer = setTimeout(() => {
|
|
2685
|
+
forceKillTimer = null;
|
|
2686
|
+
if (!phases.exitAt && !phases.closeAt) killChild(child, "SIGKILL");
|
|
2687
|
+
}, BUFFERED_FORCE_KILL_DELAY_MS);
|
|
2688
|
+
};
|
|
2630
2689
|
let clearTimer = () => {};
|
|
2631
2690
|
if (options.timeoutMs !== void 0) {
|
|
2632
2691
|
const timer = setTimeout(() => {
|
|
2633
2692
|
timedOut = true;
|
|
2634
|
-
|
|
2693
|
+
requestTermination("timeout");
|
|
2635
2694
|
}, options.timeoutMs);
|
|
2636
2695
|
clearTimer = () => clearTimeout(timer);
|
|
2637
2696
|
}
|
|
2638
|
-
|
|
2697
|
+
if (options.signal) {
|
|
2698
|
+
const onAbort = () => {
|
|
2699
|
+
requestTermination("abort");
|
|
2700
|
+
};
|
|
2701
|
+
if (options.signal.aborted) onAbort();
|
|
2702
|
+
else options.signal.addEventListener("abort", onAbort, { once: true });
|
|
2703
|
+
}
|
|
2704
|
+
const finish = (reason, result) => {
|
|
2639
2705
|
if (settled) return;
|
|
2640
2706
|
settled = true;
|
|
2641
2707
|
clearTimer();
|
|
2708
|
+
clearEagerJsonTimer();
|
|
2709
|
+
if (reason !== "eager-json") clearForceKillTimer();
|
|
2710
|
+
phases.resultResolvedAt = performance.now();
|
|
2711
|
+
phases.resultReason = reason;
|
|
2712
|
+
result.phases = phases;
|
|
2713
|
+
observe("result-resolved", { reason });
|
|
2642
2714
|
resolve$1(result);
|
|
2643
2715
|
};
|
|
2716
|
+
child.once("spawn", () => {
|
|
2717
|
+
phases.spawnObservedAt = performance.now();
|
|
2718
|
+
observe("spawn-observed", { pid: child.pid });
|
|
2719
|
+
});
|
|
2644
2720
|
child.stdout?.on("data", (data) => {
|
|
2721
|
+
if (!phases.firstStdoutAt) {
|
|
2722
|
+
phases.firstStdoutAt = performance.now();
|
|
2723
|
+
observe("first-stdout-observed");
|
|
2724
|
+
}
|
|
2645
2725
|
stdout += data.toString();
|
|
2726
|
+
if (options.eagerResolveJson && !phases.jsonCompleteAt && stdout.trimStart().startsWith("{")) try {
|
|
2727
|
+
JSON.parse(stdout);
|
|
2728
|
+
phases.jsonCompleteAt = performance.now();
|
|
2729
|
+
observe("json-complete-observed");
|
|
2730
|
+
eagerJsonTimer = setTimeout(() => {
|
|
2731
|
+
eagerJsonTimer = null;
|
|
2732
|
+
if (settled || phases.exitAt) return;
|
|
2733
|
+
phases.eagerResolved = true;
|
|
2734
|
+
requestTermination("eager-json");
|
|
2735
|
+
finish("eager-json", {
|
|
2736
|
+
stdout,
|
|
2737
|
+
stderr,
|
|
2738
|
+
exitCode: 0,
|
|
2739
|
+
timedOut
|
|
2740
|
+
});
|
|
2741
|
+
}, EAGER_JSON_EXIT_GRACE_MS);
|
|
2742
|
+
} catch {}
|
|
2646
2743
|
});
|
|
2647
2744
|
child.stderr?.on("data", (data) => {
|
|
2745
|
+
if (!phases.firstStderrAt) {
|
|
2746
|
+
phases.firstStderrAt = performance.now();
|
|
2747
|
+
observe("first-stderr-observed");
|
|
2748
|
+
}
|
|
2648
2749
|
stderr += data.toString();
|
|
2649
2750
|
});
|
|
2751
|
+
child.on("exit", (exitCode, signal) => {
|
|
2752
|
+
clearEagerJsonTimer();
|
|
2753
|
+
clearForceKillTimer();
|
|
2754
|
+
if (!phases.exitAt) {
|
|
2755
|
+
phases.exitAt = performance.now();
|
|
2756
|
+
observe("exit-observed", {
|
|
2757
|
+
exitCode,
|
|
2758
|
+
signal
|
|
2759
|
+
});
|
|
2760
|
+
}
|
|
2761
|
+
});
|
|
2650
2762
|
child.on("error", (err) => {
|
|
2651
|
-
|
|
2763
|
+
observe("spawn-error", { reason: "spawn-error" });
|
|
2764
|
+
finish("spawn-error", {
|
|
2652
2765
|
stdout,
|
|
2653
2766
|
stderr,
|
|
2654
2767
|
exitCode: null,
|
|
@@ -2656,8 +2769,14 @@ function runBufferedCommand(options) {
|
|
|
2656
2769
|
spawnError: formatSpawnError(err)
|
|
2657
2770
|
});
|
|
2658
2771
|
});
|
|
2659
|
-
child.on("close", (exitCode) => {
|
|
2660
|
-
|
|
2772
|
+
child.on("close", (exitCode, signal) => {
|
|
2773
|
+
clearForceKillTimer();
|
|
2774
|
+
phases.closeAt = performance.now();
|
|
2775
|
+
observe("close-observed", {
|
|
2776
|
+
exitCode,
|
|
2777
|
+
signal
|
|
2778
|
+
});
|
|
2779
|
+
finish("close", {
|
|
2661
2780
|
stdout,
|
|
2662
2781
|
stderr,
|
|
2663
2782
|
exitCode,
|
|
@@ -4113,6 +4232,82 @@ function buildRuntimePackageInstallCommand(input) {
|
|
|
4113
4232
|
}) ?? null;
|
|
4114
4233
|
}
|
|
4115
4234
|
|
|
4235
|
+
//#endregion
|
|
4236
|
+
//#region src/cli-buffered-admission.ts
|
|
4237
|
+
/**
|
|
4238
|
+
* Orthogonal intents (updated 2026-07-31 Asia/Shanghai):
|
|
4239
|
+
* 1. Own the process-local FIFO admission boundary for buffered CLI child processes.
|
|
4240
|
+
* 2. Expose queue/running observations without owning command semantics or subprocess lifecycle.
|
|
4241
|
+
* 3. Retire queued admissions when the owning CliExecutor is disposed.
|
|
4242
|
+
*
|
|
4243
|
+
* Original request (2026-07-31): "系统性地进行修复,因为List页面也有类似的问题。所有可能其它页面都有类似的问题。"
|
|
4244
|
+
* Owner evidence (2026-07-31): a spawned `openspec doctor --json` emitted no stdout for 12.95s
|
|
4245
|
+
* while other Dashboard-originated CLI projection work was active.
|
|
4246
|
+
*/
|
|
4247
|
+
/** One CliExecutor-wide buffered subprocess slot. Streaming terminal commands remain independent. */
|
|
4248
|
+
var CliBufferedAdmission = class {
|
|
4249
|
+
limit = 1;
|
|
4250
|
+
active = 0;
|
|
4251
|
+
queue = [];
|
|
4252
|
+
acquire(signal) {
|
|
4253
|
+
if (signal.aborted) return Promise.resolve(null);
|
|
4254
|
+
return new Promise((resolve$1) => {
|
|
4255
|
+
const waiter = {
|
|
4256
|
+
enqueuedAt: performance$1.now(),
|
|
4257
|
+
activeAtEnqueue: this.active,
|
|
4258
|
+
waitingAtEnqueue: this.queue.length,
|
|
4259
|
+
resolve: resolve$1,
|
|
4260
|
+
detachAbort: () => {},
|
|
4261
|
+
settled: false
|
|
4262
|
+
};
|
|
4263
|
+
const abort = () => {
|
|
4264
|
+
if (waiter.settled) return;
|
|
4265
|
+
waiter.settled = true;
|
|
4266
|
+
waiter.detachAbort();
|
|
4267
|
+
const index = this.queue.indexOf(waiter);
|
|
4268
|
+
if (index >= 0) this.queue.splice(index, 1);
|
|
4269
|
+
resolve$1(null);
|
|
4270
|
+
};
|
|
4271
|
+
signal.addEventListener("abort", abort, { once: true });
|
|
4272
|
+
waiter.detachAbort = () => signal.removeEventListener("abort", abort);
|
|
4273
|
+
this.queue.push(waiter);
|
|
4274
|
+
this.drain();
|
|
4275
|
+
});
|
|
4276
|
+
}
|
|
4277
|
+
stats() {
|
|
4278
|
+
return {
|
|
4279
|
+
active: this.active,
|
|
4280
|
+
waiting: this.queue.length
|
|
4281
|
+
};
|
|
4282
|
+
}
|
|
4283
|
+
drain() {
|
|
4284
|
+
if (this.active >= this.limit) return;
|
|
4285
|
+
const waiter = this.queue.shift();
|
|
4286
|
+
if (!waiter) return;
|
|
4287
|
+
if (waiter.settled) {
|
|
4288
|
+
this.drain();
|
|
4289
|
+
return;
|
|
4290
|
+
}
|
|
4291
|
+
waiter.settled = true;
|
|
4292
|
+
waiter.detachAbort();
|
|
4293
|
+
this.active += 1;
|
|
4294
|
+
let released = false;
|
|
4295
|
+
waiter.resolve({
|
|
4296
|
+
evidence: {
|
|
4297
|
+
activeAtEnqueue: waiter.activeAtEnqueue,
|
|
4298
|
+
waitingAtEnqueue: waiter.waitingAtEnqueue,
|
|
4299
|
+
waitMs: performance$1.now() - waiter.enqueuedAt
|
|
4300
|
+
},
|
|
4301
|
+
release: () => {
|
|
4302
|
+
if (released) return;
|
|
4303
|
+
released = true;
|
|
4304
|
+
this.active -= 1;
|
|
4305
|
+
this.drain();
|
|
4306
|
+
}
|
|
4307
|
+
});
|
|
4308
|
+
}
|
|
4309
|
+
};
|
|
4310
|
+
|
|
4116
4311
|
//#endregion
|
|
4117
4312
|
//#region src/cli-stream-child-owner.ts
|
|
4118
4313
|
/** Internal owner for the direct child of one CLI stream. */
|
|
@@ -4145,8 +4340,292 @@ var CliStreamChildOwner = class {
|
|
|
4145
4340
|
};
|
|
4146
4341
|
const ownersByChild = /* @__PURE__ */ new WeakMap();
|
|
4147
4342
|
|
|
4343
|
+
//#endregion
|
|
4344
|
+
//#region src/openspec-cli-worker.ts
|
|
4345
|
+
/**
|
|
4346
|
+
* Orthogonal intents (updated 2026-07-31 Asia/Shanghai):
|
|
4347
|
+
* 1. Resolve an installed OpenSpec package's importable CLI module from its configured runner and
|
|
4348
|
+
* distinguish objective module absence from Worker startup/execution failure.
|
|
4349
|
+
* 2. Execute one buffered OpenSpec command inside an isolated Node Worker with project cwd semantics.
|
|
4350
|
+
* 3. Project Worker stdout, stderr, cancellation, and settlement through the buffered spawn contract.
|
|
4351
|
+
*
|
|
4352
|
+
* Original request (2026-07-31): "直接寻址到本地 openspec 背后的 js,直接用 worker_thread 来运行它。"
|
|
4353
|
+
* Original request (2026-07-31): "通过 OPENSPEC_SPAWN_MODE=process|worker 来进行区分两种模式。"
|
|
4354
|
+
*/
|
|
4355
|
+
const OPENSPEC_SPAWN_MODE_ENV = "OPENSPEC_SPAWN_MODE";
|
|
4356
|
+
/** Objective signal that no importable OpenSpec CLI JavaScript module exists behind the runner. */
|
|
4357
|
+
var OpenSpecCliModuleNotFoundError = class extends Error {
|
|
4358
|
+
constructor(message) {
|
|
4359
|
+
super(message);
|
|
4360
|
+
this.name = "OpenSpecCliModuleNotFoundError";
|
|
4361
|
+
}
|
|
4362
|
+
};
|
|
4363
|
+
const WORKER_BOOTSTRAP = String.raw`
|
|
4364
|
+
const { parentPort, workerData } = require('node:worker_threads')
|
|
4365
|
+
const { pathToFileURL } = require('node:url')
|
|
4366
|
+
|
|
4367
|
+
process.argv.splice(0, process.argv.length, process.execPath, 'openspec', ...workerData.args)
|
|
4368
|
+
process.cwd = () => workerData.cwd
|
|
4369
|
+
|
|
4370
|
+
void (async () => {
|
|
4371
|
+
const cli = await import(pathToFileURL(workerData.modulePath).href)
|
|
4372
|
+
if (!cli.program || typeof cli.program.parseAsync !== 'function') {
|
|
4373
|
+
throw new TypeError('OpenSpec CLI module does not export program.parseAsync().')
|
|
4374
|
+
}
|
|
4375
|
+
await cli.program.parseAsync(process.argv)
|
|
4376
|
+
parentPort.postMessage({ type: 'completed', exitCode: process.exitCode ?? 0 })
|
|
4377
|
+
parentPort.close()
|
|
4378
|
+
})().catch((error) => {
|
|
4379
|
+
const message = error instanceof Error ? (error.stack ?? error.message) : String(error)
|
|
4380
|
+
process.stderr.write(message + '\n')
|
|
4381
|
+
process.exitCode = 1
|
|
4382
|
+
parentPort.close()
|
|
4383
|
+
})
|
|
4384
|
+
`;
|
|
4385
|
+
function createPhases() {
|
|
4386
|
+
return {
|
|
4387
|
+
spawnCalledAt: performance$1.now(),
|
|
4388
|
+
spawnReturnedAt: 0,
|
|
4389
|
+
spawnObservedAt: 0,
|
|
4390
|
+
firstStdoutAt: 0,
|
|
4391
|
+
firstStderrAt: 0,
|
|
4392
|
+
jsonCompleteAt: 0,
|
|
4393
|
+
terminationRequestedAt: 0,
|
|
4394
|
+
resultResolvedAt: 0,
|
|
4395
|
+
exitAt: 0,
|
|
4396
|
+
closeAt: 0,
|
|
4397
|
+
eagerResolved: false,
|
|
4398
|
+
resultReason: null
|
|
4399
|
+
};
|
|
4400
|
+
}
|
|
4401
|
+
function isOpenSpecWorkerMessage(value) {
|
|
4402
|
+
if (typeof value !== "object" || value === null) return false;
|
|
4403
|
+
const candidate = value;
|
|
4404
|
+
return candidate.type === "completed" && typeof candidate.exitCode === "number";
|
|
4405
|
+
}
|
|
4406
|
+
function cleanWorkerEnv(env) {
|
|
4407
|
+
return Object.fromEntries(Object.entries(env).filter((entry) => entry[1] !== void 0));
|
|
4408
|
+
}
|
|
4409
|
+
function isNodeExecutable(command) {
|
|
4410
|
+
const executable = basename(command).toLowerCase();
|
|
4411
|
+
return executable === "node" || executable === "node.exe" || resolve(command) === resolve(process.execPath);
|
|
4412
|
+
}
|
|
4413
|
+
function isMissingPathError(error) {
|
|
4414
|
+
if (typeof error !== "object" || error === null || !("code" in error)) return false;
|
|
4415
|
+
const code = error.code;
|
|
4416
|
+
return code === "ENOENT" || code === "ENOTDIR";
|
|
4417
|
+
}
|
|
4418
|
+
async function existingFile(path) {
|
|
4419
|
+
try {
|
|
4420
|
+
await access(path);
|
|
4421
|
+
return path;
|
|
4422
|
+
} catch (error) {
|
|
4423
|
+
if (isMissingPathError(error)) return null;
|
|
4424
|
+
throw error;
|
|
4425
|
+
}
|
|
4426
|
+
}
|
|
4427
|
+
async function moduleFromBin(binPath) {
|
|
4428
|
+
let physicalBin;
|
|
4429
|
+
try {
|
|
4430
|
+
physicalBin = await realpath(binPath);
|
|
4431
|
+
} catch (error) {
|
|
4432
|
+
if (isMissingPathError(error)) return null;
|
|
4433
|
+
throw error;
|
|
4434
|
+
}
|
|
4435
|
+
if (physicalBin.endsWith(join$1("dist", "cli", "index.js"))) return existingFile(physicalBin);
|
|
4436
|
+
if (basename(physicalBin) !== "openspec.js" || basename(dirname$1(physicalBin)) !== "bin") return null;
|
|
4437
|
+
return existingFile(join$1(dirname$1(dirname$1(physicalBin)), "dist", "cli", "index.js"));
|
|
4438
|
+
}
|
|
4439
|
+
async function moduleFromVitePlusShim(command) {
|
|
4440
|
+
if (basename(command) !== "openspec" || basename(dirname$1(command)) !== "bin") return null;
|
|
4441
|
+
const vitePlusRoot = dirname$1(dirname$1(command));
|
|
4442
|
+
if (basename(vitePlusRoot) !== ".vite-plus") return null;
|
|
4443
|
+
return existingFile(join$1(vitePlusRoot, "packages", "@fission-ai", "openspec", "lib", "node_modules", "@fission-ai", "openspec", "dist", "cli", "index.js"));
|
|
4444
|
+
}
|
|
4445
|
+
async function resolveOpenSpecWorkerInvocation(fullCommand) {
|
|
4446
|
+
const [command, ...commandArgs] = fullCommand;
|
|
4447
|
+
if (!command) throw new Error("OpenSpec CLI command is empty.");
|
|
4448
|
+
if (isNodeExecutable(command)) {
|
|
4449
|
+
const [binPath, ...args] = commandArgs;
|
|
4450
|
+
if (!binPath) throw new Error("Node OpenSpec runner does not include its bin entry.");
|
|
4451
|
+
const modulePath$1 = await moduleFromBin(binPath);
|
|
4452
|
+
if (!modulePath$1) throw new OpenSpecCliModuleNotFoundError(`Cannot resolve the OpenSpec CLI module from Node entry: ${binPath}`);
|
|
4453
|
+
return {
|
|
4454
|
+
modulePath: modulePath$1,
|
|
4455
|
+
args
|
|
4456
|
+
};
|
|
4457
|
+
}
|
|
4458
|
+
const modulePath = await moduleFromBin(command) ?? await moduleFromVitePlusShim(resolve(command)) ?? await moduleFromVitePlusShim(command);
|
|
4459
|
+
if (!modulePath) throw new OpenSpecCliModuleNotFoundError(`Cannot resolve the OpenSpec CLI module from runner: ${command}`);
|
|
4460
|
+
return {
|
|
4461
|
+
modulePath,
|
|
4462
|
+
args: commandArgs
|
|
4463
|
+
};
|
|
4464
|
+
}
|
|
4465
|
+
/** Resolve the main-thread buffered OpenSpec execution mode. */
|
|
4466
|
+
function resolveOpenSpecSpawnMode(value = process.env[OPENSPEC_SPAWN_MODE_ENV]) {
|
|
4467
|
+
if (value === void 0 || value === "" || value === "worker") return "worker";
|
|
4468
|
+
if (value === "process") return "process";
|
|
4469
|
+
throw new RangeError(`OPENSPEC_SPAWN_MODE must be "process" or "worker"; received "${value}".`);
|
|
4470
|
+
}
|
|
4471
|
+
/** Execute one importable OpenSpec CLI command in a dedicated Worker. */
|
|
4472
|
+
function runOpenSpecCliWorker(options) {
|
|
4473
|
+
return new Promise((resolveResult) => {
|
|
4474
|
+
const phases = createPhases();
|
|
4475
|
+
let stderr = "";
|
|
4476
|
+
let stdout = "";
|
|
4477
|
+
let settled = false;
|
|
4478
|
+
let worker = null;
|
|
4479
|
+
let completedExitCode = null;
|
|
4480
|
+
let workerError;
|
|
4481
|
+
let aborted = false;
|
|
4482
|
+
const observe = (phase, evidence = {}) => options.onPhase?.({
|
|
4483
|
+
phase,
|
|
4484
|
+
at: performance$1.now(),
|
|
4485
|
+
...evidence
|
|
4486
|
+
});
|
|
4487
|
+
const finish = (reason, exitCode) => {
|
|
4488
|
+
if (settled) return;
|
|
4489
|
+
settled = true;
|
|
4490
|
+
phases.resultResolvedAt = performance$1.now();
|
|
4491
|
+
phases.resultReason = reason;
|
|
4492
|
+
observe("result-resolved", { reason });
|
|
4493
|
+
resolveResult({
|
|
4494
|
+
stdout,
|
|
4495
|
+
stderr,
|
|
4496
|
+
exitCode,
|
|
4497
|
+
timedOut: false,
|
|
4498
|
+
...workerError ? { spawnError: workerError } : {},
|
|
4499
|
+
phases
|
|
4500
|
+
});
|
|
4501
|
+
};
|
|
4502
|
+
const requestTermination = (reason) => {
|
|
4503
|
+
if (!worker || phases.terminationRequestedAt) return;
|
|
4504
|
+
phases.terminationRequestedAt = performance$1.now();
|
|
4505
|
+
observe("termination-requested", { reason });
|
|
4506
|
+
worker.terminate();
|
|
4507
|
+
};
|
|
4508
|
+
const onAbort = () => {
|
|
4509
|
+
aborted = true;
|
|
4510
|
+
requestTermination("abort");
|
|
4511
|
+
};
|
|
4512
|
+
if (options.signal?.aborted) {
|
|
4513
|
+
phases.resultResolvedAt = performance$1.now();
|
|
4514
|
+
phases.resultReason = "close";
|
|
4515
|
+
observe("result-resolved", { reason: "close" });
|
|
4516
|
+
resolveResult({
|
|
4517
|
+
stdout,
|
|
4518
|
+
stderr,
|
|
4519
|
+
exitCode: null,
|
|
4520
|
+
timedOut: false,
|
|
4521
|
+
phases
|
|
4522
|
+
});
|
|
4523
|
+
return;
|
|
4524
|
+
}
|
|
4525
|
+
options.signal?.addEventListener("abort", onAbort, { once: true });
|
|
4526
|
+
observe("spawn-called");
|
|
4527
|
+
Promise.all([Promise.resolve(options.invocation), realpath(options.cwd).catch(() => resolve(options.cwd))]).then(([invocation, physicalCwd]) => {
|
|
4528
|
+
if (options.signal?.aborted) {
|
|
4529
|
+
onAbort();
|
|
4530
|
+
finish("close", null);
|
|
4531
|
+
return;
|
|
4532
|
+
}
|
|
4533
|
+
options.onModuleResolved?.(invocation.modulePath);
|
|
4534
|
+
try {
|
|
4535
|
+
worker = new Worker(WORKER_BOOTSTRAP, {
|
|
4536
|
+
env: cleanWorkerEnv(options.env),
|
|
4537
|
+
eval: true,
|
|
4538
|
+
execArgv: [],
|
|
4539
|
+
stderr: true,
|
|
4540
|
+
stdout: true,
|
|
4541
|
+
workerData: {
|
|
4542
|
+
args: invocation.args,
|
|
4543
|
+
cwd: physicalCwd,
|
|
4544
|
+
modulePath: invocation.modulePath
|
|
4545
|
+
}
|
|
4546
|
+
});
|
|
4547
|
+
} catch (error) {
|
|
4548
|
+
workerError = formatSpawnError(error);
|
|
4549
|
+
observe("spawn-error", { reason: "spawn-error" });
|
|
4550
|
+
finish("spawn-error", null);
|
|
4551
|
+
return;
|
|
4552
|
+
}
|
|
4553
|
+
phases.spawnReturnedAt = performance$1.now();
|
|
4554
|
+
observe("spawn-returned");
|
|
4555
|
+
worker.once("online", () => {
|
|
4556
|
+
phases.spawnObservedAt = performance$1.now();
|
|
4557
|
+
observe("spawn-observed");
|
|
4558
|
+
});
|
|
4559
|
+
worker.stdout.on("data", (data) => {
|
|
4560
|
+
if (!phases.firstStdoutAt) {
|
|
4561
|
+
phases.firstStdoutAt = performance$1.now();
|
|
4562
|
+
observe("first-stdout-observed");
|
|
4563
|
+
}
|
|
4564
|
+
stdout += data.toString();
|
|
4565
|
+
if (options.eagerResolveJson && !phases.eagerResolved && stdout.trimStart().startsWith("{")) try {
|
|
4566
|
+
JSON.parse(stdout);
|
|
4567
|
+
phases.eagerResolved = true;
|
|
4568
|
+
phases.jsonCompleteAt = performance$1.now();
|
|
4569
|
+
observe("json-complete-observed");
|
|
4570
|
+
requestTermination("eager-json");
|
|
4571
|
+
} catch {}
|
|
4572
|
+
});
|
|
4573
|
+
worker.stderr.on("data", (data) => {
|
|
4574
|
+
if (!phases.firstStderrAt) {
|
|
4575
|
+
phases.firstStderrAt = performance$1.now();
|
|
4576
|
+
observe("first-stderr-observed");
|
|
4577
|
+
}
|
|
4578
|
+
stderr += data.toString();
|
|
4579
|
+
});
|
|
4580
|
+
worker.on("message", (message) => {
|
|
4581
|
+
if (isOpenSpecWorkerMessage(message)) completedExitCode = message.exitCode;
|
|
4582
|
+
});
|
|
4583
|
+
worker.once("error", (error) => {
|
|
4584
|
+
workerError = formatSpawnError(error);
|
|
4585
|
+
observe("spawn-error", { reason: "spawn-error" });
|
|
4586
|
+
});
|
|
4587
|
+
worker.once("exit", (workerExitCode) => {
|
|
4588
|
+
options.signal?.removeEventListener("abort", onAbort);
|
|
4589
|
+
phases.exitAt = performance$1.now();
|
|
4590
|
+
const exitCode = aborted ? null : phases.eagerResolved ? 0 : completedExitCode ?? workerExitCode;
|
|
4591
|
+
observe("exit-observed", { exitCode });
|
|
4592
|
+
phases.closeAt = performance$1.now();
|
|
4593
|
+
observe("close-observed", { exitCode });
|
|
4594
|
+
if (workerError) finish("spawn-error", null);
|
|
4595
|
+
else finish(phases.eagerResolved ? "eager-json" : "close", exitCode);
|
|
4596
|
+
});
|
|
4597
|
+
}, (error) => {
|
|
4598
|
+
options.signal?.removeEventListener("abort", onAbort);
|
|
4599
|
+
workerError = formatSpawnError(error);
|
|
4600
|
+
observe("spawn-error", { reason: "spawn-error" });
|
|
4601
|
+
finish("spawn-error", null);
|
|
4602
|
+
});
|
|
4603
|
+
});
|
|
4604
|
+
}
|
|
4605
|
+
|
|
4148
4606
|
//#endregion
|
|
4149
4607
|
//#region src/cli-executor.ts
|
|
4608
|
+
/**
|
|
4609
|
+
* Orthogonal intents (updated 2026-07-31 Asia/Shanghai):
|
|
4610
|
+
* 1. Execute buffered CLI work through process/Worker backends with runner recovery,
|
|
4611
|
+
* observer-explicit OTel phase evidence, bounded probes, and owner-scoped disposal.
|
|
4612
|
+
* 2. Own streaming CLI processes through cancellation request, escalation, and confirmed settlement.
|
|
4613
|
+
* 3. Retain established init/schema/template and human validate/archive helpers.
|
|
4614
|
+
* 4. Expose the physically separated OpenSpec 1.6 typed command facade.
|
|
4615
|
+
* 5. Clear the Core-owned direct-child slot independently from stream settlement, and keep
|
|
4616
|
+
* response-Span delivery physically separate from late child-process settlement evidence.
|
|
4617
|
+
*
|
|
4618
|
+
* Original request (2026-07-15): "你先负责后端(内核)的开发。"
|
|
4619
|
+
* Original request (2026-07-17): "A stream cancellation request is not child-process settlement."
|
|
4620
|
+
* Built-runtime correction (2026-07-30): foreground Server shutdown must retire buffered projection children and settled probe timers.
|
|
4621
|
+
* Tracing (2026-07-31): each CLI subprocess call is wrapped in an OpenTelemetry span so the Server
|
|
4622
|
+
* `planningRoot.runOperation` breakdown can attribute latency to specific CLI invocations
|
|
4623
|
+
* (doctor / context / list ...). Uses `@opentelemetry/api` only — a no-op tracer is returned when
|
|
4624
|
+
* no SDK is registered, so standalone Core use incurs zero overhead.
|
|
4625
|
+
* Original request (2026-07-31): "这些命令的执行,时间绝对不是七八秒那么久...请看一下代码,看能不能让trace更精确"
|
|
4626
|
+
* Original request (2026-07-31): "终端大量报错,比如: Cannot execute the operation on ended Span"
|
|
4627
|
+
* Original request (2026-07-31): "在主线程,通过 OPENSPEC_SPAWN_MODE=process|worker 来进行区分两种模式。"
|
|
4628
|
+
*/
|
|
4150
4629
|
/** Failure raised when even forced termination cannot confirm child-process close. */
|
|
4151
4630
|
var CliStreamTerminationError = class extends Error {
|
|
4152
4631
|
constructor(command) {
|
|
@@ -4156,6 +4635,52 @@ var CliStreamTerminationError = class extends Error {
|
|
|
4156
4635
|
};
|
|
4157
4636
|
const STREAM_TERMINATION_GRACE_MS = 1e3;
|
|
4158
4637
|
const STREAM_FORCE_CLOSE_TIMEOUT_MS = 1e3;
|
|
4638
|
+
const CLI_PHASE_EVENT_SUFFIXES = {
|
|
4639
|
+
"spawn-called": "spawn.called",
|
|
4640
|
+
"spawn-returned": "spawn.returned",
|
|
4641
|
+
"spawn-observed": "spawn.observed",
|
|
4642
|
+
"first-stdout-observed": "stdout.first.observed",
|
|
4643
|
+
"first-stderr-observed": "stderr.first.observed",
|
|
4644
|
+
"json-complete-observed": "json.complete.observed",
|
|
4645
|
+
"termination-requested": "termination.requested",
|
|
4646
|
+
"exit-observed": "exit.observed",
|
|
4647
|
+
"close-observed": "close.observed",
|
|
4648
|
+
"result-resolved": "result.resolved",
|
|
4649
|
+
"spawn-error": "spawn.error"
|
|
4650
|
+
};
|
|
4651
|
+
function roundedMs(value) {
|
|
4652
|
+
return Math.round(value * 1e3) / 1e3;
|
|
4653
|
+
}
|
|
4654
|
+
function phaseEventAttributes(event, spawnCalledAt, attempt) {
|
|
4655
|
+
const attributes = {
|
|
4656
|
+
"cli.attempt": attempt,
|
|
4657
|
+
"cli.phase.elapsed_ms": roundedMs(event.at - spawnCalledAt)
|
|
4658
|
+
};
|
|
4659
|
+
if (event.pid !== void 0) attributes["process.pid"] = event.pid;
|
|
4660
|
+
if (event.exitCode !== void 0 && event.exitCode !== null) attributes["process.exit.code"] = event.exitCode;
|
|
4661
|
+
if (event.signal) attributes["process.exit.signal"] = event.signal;
|
|
4662
|
+
if (event.reason) attributes["cli.phase.reason"] = event.reason;
|
|
4663
|
+
return attributes;
|
|
4664
|
+
}
|
|
4665
|
+
function setObservedDuration(span, key, base, observedAt) {
|
|
4666
|
+
if (observedAt > 0) span.setAttribute(key, roundedMs(observedAt - base));
|
|
4667
|
+
}
|
|
4668
|
+
function executableRealpath(command) {
|
|
4669
|
+
if (!isAbsolute(command)) return null;
|
|
4670
|
+
try {
|
|
4671
|
+
return realpathSync.native(command);
|
|
4672
|
+
} catch {
|
|
4673
|
+
return null;
|
|
4674
|
+
}
|
|
4675
|
+
}
|
|
4676
|
+
function systemLoadAttributes(suffix) {
|
|
4677
|
+
const [oneMinute, fiveMinutes, fifteenMinutes] = loadavg();
|
|
4678
|
+
return {
|
|
4679
|
+
[`system.load.1m.${suffix}`]: oneMinute,
|
|
4680
|
+
[`system.load.5m.${suffix}`]: fiveMinutes,
|
|
4681
|
+
[`system.load.15m.${suffix}`]: fifteenMinutes
|
|
4682
|
+
};
|
|
4683
|
+
}
|
|
4159
4684
|
function createDeferred() {
|
|
4160
4685
|
let resolve$1;
|
|
4161
4686
|
let reject;
|
|
@@ -4168,6 +4693,15 @@ function createDeferred() {
|
|
|
4168
4693
|
reject
|
|
4169
4694
|
};
|
|
4170
4695
|
}
|
|
4696
|
+
function settleWithin(operation, timeout, message) {
|
|
4697
|
+
let timer = null;
|
|
4698
|
+
const timeoutFailure = new Promise((_, reject) => {
|
|
4699
|
+
timer = setTimeout(() => reject(new Error(message)), timeout);
|
|
4700
|
+
});
|
|
4701
|
+
return Promise.race([operation, timeoutFailure]).finally(() => {
|
|
4702
|
+
if (timer) clearTimeout(timer);
|
|
4703
|
+
});
|
|
4704
|
+
}
|
|
4171
4705
|
/**
|
|
4172
4706
|
* CLI 执行器
|
|
4173
4707
|
*
|
|
@@ -4176,6 +4710,13 @@ function createDeferred() {
|
|
|
4176
4710
|
*/
|
|
4177
4711
|
var CliExecutor = class {
|
|
4178
4712
|
contracts;
|
|
4713
|
+
bufferedAdmission = new CliBufferedAdmission();
|
|
4714
|
+
bufferedAbortController = new AbortController();
|
|
4715
|
+
activeBufferedCommands = /* @__PURE__ */ new Set();
|
|
4716
|
+
activeBufferedChildren = 0;
|
|
4717
|
+
peakBufferedChildren = 0;
|
|
4718
|
+
disposePromise = null;
|
|
4719
|
+
disposed = false;
|
|
4179
4720
|
constructor(configManager, projectDir) {
|
|
4180
4721
|
this.configManager = configManager;
|
|
4181
4722
|
this.projectDir = projectDir;
|
|
@@ -4184,50 +4725,296 @@ var CliExecutor = class {
|
|
|
4184
4725
|
async buildCommandArray(args) {
|
|
4185
4726
|
return [...await this.configManager.getCliCommand(), ...args];
|
|
4186
4727
|
}
|
|
4187
|
-
async runCommandOnce(fullCommand) {
|
|
4728
|
+
async runCommandOnce(fullCommand, traceContext) {
|
|
4729
|
+
if (this.disposed) return {
|
|
4730
|
+
success: false,
|
|
4731
|
+
stdout: "",
|
|
4732
|
+
stderr: "CLI executor is disposed.",
|
|
4733
|
+
exitCode: null,
|
|
4734
|
+
errorCode: "ABORT_ERR"
|
|
4735
|
+
};
|
|
4188
4736
|
const [cmd, ...cmdArgs] = fullCommand;
|
|
4189
|
-
const
|
|
4737
|
+
const isJsonCommand = cmdArgs.includes("--json");
|
|
4738
|
+
const requestedSpawnMode = resolveOpenSpecSpawnMode();
|
|
4739
|
+
let spawnMode = requestedSpawnMode;
|
|
4740
|
+
let workerInvocation = null;
|
|
4741
|
+
let workerFallbackReason = null;
|
|
4742
|
+
if (requestedSpawnMode === "worker") try {
|
|
4743
|
+
workerInvocation = await resolveOpenSpecWorkerInvocation(fullCommand);
|
|
4744
|
+
} catch (error) {
|
|
4745
|
+
if (!(error instanceof OpenSpecCliModuleNotFoundError)) throw error;
|
|
4746
|
+
spawnMode = "process";
|
|
4747
|
+
workerFallbackReason = "module-not-found";
|
|
4748
|
+
traceContext.span.addEvent("cli.worker.fallback", {
|
|
4749
|
+
"cli.worker.fallback.reason": workerFallbackReason,
|
|
4750
|
+
"cli.worker.fallback.message": error.message
|
|
4751
|
+
});
|
|
4752
|
+
}
|
|
4753
|
+
const queuedStats = this.bufferedAdmission.stats();
|
|
4754
|
+
traceContext.span.addEvent("cli.admission.queued", {
|
|
4755
|
+
"cli.concurrent.active": queuedStats.active,
|
|
4756
|
+
"cli.concurrent.waiting": queuedStats.waiting,
|
|
4757
|
+
"cli.concurrent.limit": this.bufferedAdmission.limit
|
|
4758
|
+
});
|
|
4759
|
+
const admission = await this.bufferedAdmission.acquire(this.bufferedAbortController.signal);
|
|
4760
|
+
if (!admission || this.disposed) {
|
|
4761
|
+
admission?.release();
|
|
4762
|
+
traceContext.span.addEvent("cli.admission.cancelled");
|
|
4763
|
+
return {
|
|
4764
|
+
success: false,
|
|
4765
|
+
stdout: "",
|
|
4766
|
+
stderr: "CLI executor is disposed.",
|
|
4767
|
+
exitCode: null,
|
|
4768
|
+
errorCode: "ABORT_ERR"
|
|
4769
|
+
};
|
|
4770
|
+
}
|
|
4771
|
+
this.recordAdmissionEvidence(traceContext.span, admission);
|
|
4772
|
+
traceContext.span.addEvent("cli.admission.acquired", {
|
|
4773
|
+
"cli.concurrent.wait_ms": roundedMs(admission.evidence.waitMs),
|
|
4774
|
+
"cli.concurrent.active_at_enqueue": admission.evidence.activeAtEnqueue,
|
|
4775
|
+
"cli.concurrent.waiting_at_enqueue": admission.evidence.waitingAtEnqueue
|
|
4776
|
+
});
|
|
4777
|
+
traceContext.span.setAttribute("cli.spawn_mode", spawnMode);
|
|
4778
|
+
traceContext.span.setAttribute("cli.spawn_mode.requested", requestedSpawnMode);
|
|
4779
|
+
if (workerFallbackReason) traceContext.span.setAttribute("cli.worker.fallback.reason", workerFallbackReason);
|
|
4780
|
+
const processSpan = trace.getTracer("openspecui-core").startSpan(`cli.${spawnMode} ${traceContext.subcommand}`, { attributes: {
|
|
4781
|
+
"cli.attempt": traceContext.attempt,
|
|
4782
|
+
"cli.cwd": this.projectDir,
|
|
4783
|
+
"cli.executable": cmd,
|
|
4784
|
+
"cli.json": isJsonCommand,
|
|
4785
|
+
"cli.spawn_mode": spawnMode,
|
|
4786
|
+
"cli.spawn_mode.requested": requestedSpawnMode,
|
|
4787
|
+
...workerFallbackReason ? { "cli.worker.fallback.reason": workerFallbackReason } : {},
|
|
4788
|
+
"cli.concurrent.limit": this.bufferedAdmission.limit,
|
|
4789
|
+
"cli.concurrent.active_at_enqueue": admission.evidence.activeAtEnqueue,
|
|
4790
|
+
"cli.concurrent.waiting_at_enqueue": admission.evidence.waitingAtEnqueue,
|
|
4791
|
+
"cli.concurrent.wait_ms": roundedMs(admission.evidence.waitMs),
|
|
4792
|
+
"process.parent.pid": process.pid,
|
|
4793
|
+
...systemLoadAttributes("admitted")
|
|
4794
|
+
} }, context.active());
|
|
4795
|
+
const resolvedExecutable = executableRealpath(cmd);
|
|
4796
|
+
if (resolvedExecutable) {
|
|
4797
|
+
processSpan.setAttribute("cli.runner.realpath", resolvedExecutable);
|
|
4798
|
+
traceContext.span.setAttribute("cli.runner.realpath", resolvedExecutable);
|
|
4799
|
+
}
|
|
4800
|
+
let spawnCalledAt = performance$1.now();
|
|
4801
|
+
let childHandleReturned = false;
|
|
4802
|
+
let processCloseObserved = false;
|
|
4803
|
+
let responseDelivered = false;
|
|
4804
|
+
let processSpanEnded = false;
|
|
4805
|
+
let childCounted = false;
|
|
4806
|
+
const executionKind = spawnMode === "process" ? "processes" : "workers";
|
|
4807
|
+
const endProcessSpan = () => {
|
|
4808
|
+
if (processSpanEnded) return;
|
|
4809
|
+
processSpanEnded = true;
|
|
4810
|
+
processSpan.end();
|
|
4811
|
+
};
|
|
4812
|
+
const observePhase = (event) => {
|
|
4813
|
+
if (event.phase === "spawn-called") spawnCalledAt = event.at;
|
|
4814
|
+
if (event.phase === "spawn-returned") {
|
|
4815
|
+
childHandleReturned = true;
|
|
4816
|
+
if (!childCounted) {
|
|
4817
|
+
childCounted = true;
|
|
4818
|
+
this.activeBufferedChildren += 1;
|
|
4819
|
+
this.peakBufferedChildren = Math.max(this.peakBufferedChildren, this.activeBufferedChildren);
|
|
4820
|
+
}
|
|
4821
|
+
}
|
|
4822
|
+
const eventName = `cli.${spawnMode}.${CLI_PHASE_EVENT_SUFFIXES[event.phase]}`;
|
|
4823
|
+
const admissionStats = this.bufferedAdmission.stats();
|
|
4824
|
+
const attributes = {
|
|
4825
|
+
...phaseEventAttributes(event, spawnCalledAt, traceContext.attempt),
|
|
4826
|
+
"cli.concurrent.active": admissionStats.active,
|
|
4827
|
+
"cli.concurrent.waiting": admissionStats.waiting,
|
|
4828
|
+
"cli.executions.active": this.activeBufferedChildren,
|
|
4829
|
+
"cli.executions.peak": this.peakBufferedChildren,
|
|
4830
|
+
[`cli.${executionKind}.active`]: this.activeBufferedChildren,
|
|
4831
|
+
[`cli.${executionKind}.peak`]: this.peakBufferedChildren
|
|
4832
|
+
};
|
|
4833
|
+
if (event.phase === "spawn-called") Object.assign(attributes, systemLoadAttributes("spawn"));
|
|
4834
|
+
if (event.phase === "first-stdout-observed") Object.assign(attributes, systemLoadAttributes("first_stdout"));
|
|
4835
|
+
if (!responseDelivered) traceContext.span.addEvent(eventName, attributes);
|
|
4836
|
+
processSpan.addEvent(eventName, attributes);
|
|
4837
|
+
if (event.phase === "spawn-returned") {
|
|
4838
|
+
traceContext.span.setAttribute(`cli.${executionKind}.active_at_spawn`, this.activeBufferedChildren);
|
|
4839
|
+
processSpan.setAttribute(`cli.${executionKind}.active_at_spawn`, this.activeBufferedChildren);
|
|
4840
|
+
}
|
|
4841
|
+
if (event.phase === "first-stdout-observed") {
|
|
4842
|
+
traceContext.span.setAttribute(`cli.${executionKind}.active_at_first_stdout`, this.activeBufferedChildren);
|
|
4843
|
+
processSpan.setAttribute(`cli.${executionKind}.active_at_first_stdout`, this.activeBufferedChildren);
|
|
4844
|
+
}
|
|
4845
|
+
if (event.pid !== void 0) processSpan.setAttribute("process.pid", event.pid);
|
|
4846
|
+
if (event.phase === "exit-observed" && event.exitCode !== void 0) processSpan.setAttribute("process.exit.code", event.exitCode ?? -1);
|
|
4847
|
+
if (event.phase === "result-resolved") {
|
|
4848
|
+
responseDelivered = true;
|
|
4849
|
+
processSpan.setAttribute("cli.result.reason", event.reason ?? "unknown");
|
|
4850
|
+
if (!(childHandleReturned && !processCloseObserved && (event.reason === "eager-json" || event.reason === "spawn-error"))) endProcessSpan();
|
|
4851
|
+
}
|
|
4852
|
+
if (event.phase === "close-observed") {
|
|
4853
|
+
processCloseObserved = true;
|
|
4854
|
+
if (childCounted) {
|
|
4855
|
+
childCounted = false;
|
|
4856
|
+
this.activeBufferedChildren -= 1;
|
|
4857
|
+
processSpan.setAttribute(`cli.${executionKind}.active_after_close`, this.activeBufferedChildren);
|
|
4858
|
+
}
|
|
4859
|
+
if (responseDelivered) endProcessSpan();
|
|
4860
|
+
}
|
|
4861
|
+
};
|
|
4862
|
+
const cliEnv = createCleanCliEnv();
|
|
4863
|
+
const command = spawnMode === "worker" && workerInvocation ? runOpenSpecCliWorker({
|
|
4864
|
+
cwd: this.projectDir,
|
|
4865
|
+
env: cliEnv,
|
|
4866
|
+
signal: this.bufferedAbortController.signal,
|
|
4867
|
+
eagerResolveJson: isJsonCommand,
|
|
4868
|
+
invocation: workerInvocation,
|
|
4869
|
+
onModuleResolved: (modulePath) => {
|
|
4870
|
+
processSpan.setAttribute("cli.worker.module", modulePath);
|
|
4871
|
+
traceContext.span.setAttribute("cli.worker.module", modulePath);
|
|
4872
|
+
},
|
|
4873
|
+
onPhase: observePhase
|
|
4874
|
+
}) : runBufferedCommand({
|
|
4190
4875
|
command: cmd,
|
|
4191
4876
|
args: cmdArgs,
|
|
4192
4877
|
cwd: this.projectDir,
|
|
4193
|
-
env:
|
|
4878
|
+
env: cliEnv,
|
|
4879
|
+
signal: this.bufferedAbortController.signal,
|
|
4880
|
+
eagerResolveJson: isJsonCommand,
|
|
4881
|
+
onPhase: observePhase
|
|
4882
|
+
});
|
|
4883
|
+
this.activeBufferedCommands.add(command);
|
|
4884
|
+
const result = await command.finally(() => {
|
|
4885
|
+
this.activeBufferedCommands.delete(command);
|
|
4886
|
+
admission.release();
|
|
4194
4887
|
});
|
|
4195
4888
|
if (result.spawnError) return {
|
|
4196
4889
|
success: false,
|
|
4197
4890
|
stdout: result.stdout,
|
|
4198
4891
|
stderr: result.stderr ? `${result.stderr}\n${result.spawnError.message}` : result.spawnError.message,
|
|
4199
4892
|
exitCode: null,
|
|
4200
|
-
errorCode: result.spawnError.code
|
|
4893
|
+
errorCode: result.spawnError.code,
|
|
4894
|
+
phases: result.phases,
|
|
4895
|
+
spawnMode
|
|
4201
4896
|
};
|
|
4202
4897
|
return {
|
|
4203
4898
|
success: result.exitCode === 0,
|
|
4204
4899
|
stdout: result.stdout,
|
|
4205
4900
|
stderr: result.stderr,
|
|
4206
|
-
exitCode: result.exitCode
|
|
4901
|
+
exitCode: result.exitCode,
|
|
4902
|
+
phases: result.phases,
|
|
4903
|
+
spawnMode
|
|
4207
4904
|
};
|
|
4208
4905
|
}
|
|
4906
|
+
recordAdmissionEvidence(span, admission) {
|
|
4907
|
+
span.setAttributes({
|
|
4908
|
+
"cli.cwd": this.projectDir,
|
|
4909
|
+
"cli.concurrent.limit": this.bufferedAdmission.limit,
|
|
4910
|
+
"cli.concurrent.active_at_enqueue": admission.evidence.activeAtEnqueue,
|
|
4911
|
+
"cli.concurrent.waiting_at_enqueue": admission.evidence.waitingAtEnqueue,
|
|
4912
|
+
"cli.concurrent.wait_ms": roundedMs(admission.evidence.waitMs),
|
|
4913
|
+
"process.parent.pid": process.pid,
|
|
4914
|
+
...systemLoadAttributes("admitted")
|
|
4915
|
+
});
|
|
4916
|
+
}
|
|
4209
4917
|
async executeInternal(args, allowRetry) {
|
|
4918
|
+
const tracer = trace.getTracer("openspecui-core");
|
|
4919
|
+
const subcommand = args[0] ?? "cli";
|
|
4920
|
+
return tracer.startActiveSpan(`cli.execute ${subcommand}`, async (span) => {
|
|
4921
|
+
const executionStartedAt = performance$1.now();
|
|
4922
|
+
const eventLoopStartedAt = performance$1.eventLoopUtilization();
|
|
4923
|
+
span.setAttribute("cli.args", args.join(" "));
|
|
4924
|
+
try {
|
|
4925
|
+
const result = await this.executeInternalCore(args, allowRetry, span, subcommand);
|
|
4926
|
+
span.setAttribute("cli.exitCode", result.exitCode ?? -1);
|
|
4927
|
+
span.setAttribute("cli.attempts", result.attempts ?? 1);
|
|
4928
|
+
const phases = result.phases;
|
|
4929
|
+
if (phases) {
|
|
4930
|
+
const base = phases.spawnCalledAt;
|
|
4931
|
+
span.setAttribute("cli.eagerResolved", phases.eagerResolved);
|
|
4932
|
+
span.setAttribute("cli.result.reason", phases.resultReason ?? "unknown");
|
|
4933
|
+
setObservedDuration(span, "cli.ms.spawnCall", base, phases.spawnReturnedAt);
|
|
4934
|
+
setObservedDuration(span, "cli.ms.spawnObserved", base, phases.spawnObservedAt);
|
|
4935
|
+
setObservedDuration(span, "cli.ms.firstStdoutObserved", base, phases.firstStdoutAt);
|
|
4936
|
+
setObservedDuration(span, "cli.ms.firstStderrObserved", base, phases.firstStderrAt);
|
|
4937
|
+
setObservedDuration(span, "cli.ms.jsonCompleteObserved", base, phases.jsonCompleteAt);
|
|
4938
|
+
setObservedDuration(span, "cli.ms.terminationRequested", base, phases.terminationRequestedAt);
|
|
4939
|
+
setObservedDuration(span, "cli.ms.resultResolved", base, phases.resultResolvedAt);
|
|
4940
|
+
setObservedDuration(span, "cli.ms.exitObserved", base, phases.exitAt);
|
|
4941
|
+
setObservedDuration(span, "cli.ms.closeObserved", base, phases.closeAt);
|
|
4942
|
+
const spawnMode = result.spawnMode ?? resolveOpenSpecSpawnMode();
|
|
4943
|
+
span.setAttribute(`cli.${spawnMode}.exitObservedBeforeResult`, phases.exitAt > 0 && phases.exitAt <= phases.resultResolvedAt);
|
|
4944
|
+
span.setAttribute(`cli.${spawnMode}.closeObservedBeforeResult`, phases.closeAt > 0 && phases.closeAt <= phases.resultResolvedAt);
|
|
4945
|
+
if (phases.exitAt && phases.closeAt) span.setAttribute("cli.ms.exitToCloseObserved", roundedMs(phases.closeAt - phases.exitAt));
|
|
4946
|
+
}
|
|
4947
|
+
if (!result.success) span.setStatus({
|
|
4948
|
+
code: 2,
|
|
4949
|
+
message: result.stderr || `exit ${result.exitCode}`
|
|
4950
|
+
});
|
|
4951
|
+
return result;
|
|
4952
|
+
} catch (err) {
|
|
4953
|
+
span.recordException(err instanceof Error ? err : String(err));
|
|
4954
|
+
span.setStatus({
|
|
4955
|
+
code: 2,
|
|
4956
|
+
message: err instanceof Error ? err.message : String(err)
|
|
4957
|
+
});
|
|
4958
|
+
throw err;
|
|
4959
|
+
} finally {
|
|
4960
|
+
const eventLoop = performance$1.eventLoopUtilization(eventLoopStartedAt);
|
|
4961
|
+
span.setAttributes({
|
|
4962
|
+
"cli.ms.response": roundedMs(performance$1.now() - executionStartedAt),
|
|
4963
|
+
"cli.event_loop.utilization": eventLoop.utilization,
|
|
4964
|
+
"cli.ms.event_loop_active": roundedMs(eventLoop.active),
|
|
4965
|
+
"cli.ms.event_loop_idle": roundedMs(eventLoop.idle)
|
|
4966
|
+
});
|
|
4967
|
+
span.end();
|
|
4968
|
+
}
|
|
4969
|
+
});
|
|
4970
|
+
}
|
|
4971
|
+
async executeInternalCore(args, allowRetry, span, subcommand, attempt = 1) {
|
|
4210
4972
|
let fullCommand;
|
|
4973
|
+
const runnerResolveStartedAt = performance$1.now();
|
|
4211
4974
|
try {
|
|
4212
4975
|
fullCommand = await this.buildCommandArray(args);
|
|
4213
4976
|
} catch (err) {
|
|
4977
|
+
span.addEvent("cli.runner.resolve.error", {
|
|
4978
|
+
"cli.attempt": attempt,
|
|
4979
|
+
"cli.ms.runnerResolve": roundedMs(performance$1.now() - runnerResolveStartedAt)
|
|
4980
|
+
});
|
|
4214
4981
|
return {
|
|
4215
4982
|
success: false,
|
|
4216
4983
|
stdout: "",
|
|
4217
4984
|
stderr: err instanceof Error ? err.message : String(err),
|
|
4218
|
-
exitCode: null
|
|
4985
|
+
exitCode: null,
|
|
4986
|
+
attempts: attempt
|
|
4219
4987
|
};
|
|
4220
4988
|
}
|
|
4221
|
-
const
|
|
4989
|
+
const runnerResolveMs = roundedMs(performance$1.now() - runnerResolveStartedAt);
|
|
4990
|
+
span.setAttribute("cli.ms.runnerResolve", runnerResolveMs);
|
|
4991
|
+
span.setAttribute("cli.executable", fullCommand[0] ?? "");
|
|
4992
|
+
span.addEvent("cli.runner.resolved", {
|
|
4993
|
+
"cli.attempt": attempt,
|
|
4994
|
+
"cli.ms.runnerResolve": runnerResolveMs,
|
|
4995
|
+
"cli.executable": fullCommand[0] ?? ""
|
|
4996
|
+
});
|
|
4997
|
+
const result = await this.runCommandOnce(fullCommand, {
|
|
4998
|
+
span,
|
|
4999
|
+
attempt,
|
|
5000
|
+
subcommand
|
|
5001
|
+
});
|
|
4222
5002
|
if (allowRetry && result.errorCode === "ENOENT") {
|
|
5003
|
+
span.addEvent("cli.runner.retry", {
|
|
5004
|
+
"cli.attempt": attempt,
|
|
5005
|
+
"cli.retry.reason": "ENOENT"
|
|
5006
|
+
});
|
|
4223
5007
|
this.configManager.invalidateResolvedCliRunner();
|
|
4224
|
-
return this.
|
|
5008
|
+
return this.executeInternalCore(args, false, span, subcommand, attempt + 1);
|
|
4225
5009
|
}
|
|
4226
5010
|
return {
|
|
4227
5011
|
success: result.success,
|
|
4228
5012
|
stdout: result.stdout,
|
|
4229
5013
|
stderr: result.stderr,
|
|
4230
|
-
exitCode: result.exitCode
|
|
5014
|
+
exitCode: result.exitCode,
|
|
5015
|
+
phases: result.phases,
|
|
5016
|
+
spawnMode: result.spawnMode,
|
|
5017
|
+
attempts: attempt
|
|
4231
5018
|
};
|
|
4232
5019
|
}
|
|
4233
5020
|
/**
|
|
@@ -4236,6 +5023,15 @@ var CliExecutor = class {
|
|
|
4236
5023
|
async execute(args) {
|
|
4237
5024
|
return this.executeInternal(args, true);
|
|
4238
5025
|
}
|
|
5026
|
+
/** Cancel and await every buffered CLI child owned by this executor. */
|
|
5027
|
+
dispose() {
|
|
5028
|
+
if (this.disposePromise) return this.disposePromise;
|
|
5029
|
+
this.disposed = true;
|
|
5030
|
+
this.bufferedAbortController.abort();
|
|
5031
|
+
const activeCommands = [...this.activeBufferedCommands];
|
|
5032
|
+
this.disposePromise = Promise.allSettled(activeCommands).then(() => void 0);
|
|
5033
|
+
return this.disposePromise;
|
|
5034
|
+
}
|
|
4239
5035
|
/**
|
|
4240
5036
|
* 执行 openspec init(非交互式)
|
|
4241
5037
|
*/
|
|
@@ -4311,27 +5107,56 @@ var CliExecutor = class {
|
|
|
4311
5107
|
* 检查 CLI 是否可用
|
|
4312
5108
|
*/
|
|
4313
5109
|
async checkAvailability(timeout = 1e4) {
|
|
4314
|
-
|
|
4315
|
-
const
|
|
4316
|
-
const
|
|
4317
|
-
|
|
4318
|
-
|
|
4319
|
-
|
|
4320
|
-
|
|
4321
|
-
|
|
4322
|
-
|
|
4323
|
-
|
|
4324
|
-
|
|
4325
|
-
|
|
4326
|
-
|
|
4327
|
-
|
|
4328
|
-
|
|
4329
|
-
|
|
4330
|
-
|
|
4331
|
-
|
|
4332
|
-
|
|
4333
|
-
|
|
4334
|
-
|
|
5110
|
+
return trace.getTracer("openspecui-core").startActiveSpan("cli.checkAvailability", async (span) => {
|
|
5111
|
+
const checkStartedAt = performance$1.now();
|
|
5112
|
+
const eventLoopStartedAt = performance$1.eventLoopUtilization();
|
|
5113
|
+
try {
|
|
5114
|
+
const runnerResolveStartedAt = performance$1.now();
|
|
5115
|
+
const resolved = await settleWithin(this.configManager.getResolvedCliRunner(), timeout, "CLI runner resolve timed out");
|
|
5116
|
+
const runnerResolveMs = roundedMs(performance$1.now() - runnerResolveStartedAt);
|
|
5117
|
+
span.setAttribute("cli.triedCount", resolved.attempts.length);
|
|
5118
|
+
span.setAttribute("cli.ms.runnerResolve", runnerResolveMs);
|
|
5119
|
+
span.setAttribute("cli.executable", resolved.commandParts[0] ?? "");
|
|
5120
|
+
span.addEvent("cli.runner.resolved", {
|
|
5121
|
+
"cli.ms.runnerResolve": runnerResolveMs,
|
|
5122
|
+
"cli.executable": resolved.commandParts[0] ?? "",
|
|
5123
|
+
"cli.runner.attempts": resolved.attempts.length
|
|
5124
|
+
});
|
|
5125
|
+
const versionResult = await settleWithin(this.runCommandOnce([...resolved.commandParts, "--version"], {
|
|
5126
|
+
span,
|
|
5127
|
+
attempt: 1,
|
|
5128
|
+
subcommand: "check-availability"
|
|
5129
|
+
}), timeout, "CLI check timed out");
|
|
5130
|
+
span.setAttribute("cli.available", versionResult.success);
|
|
5131
|
+
if (versionResult.success) return {
|
|
5132
|
+
available: true,
|
|
5133
|
+
version: versionResult.stdout.trim() || resolved.version,
|
|
5134
|
+
effectiveCommand: resolved.command,
|
|
5135
|
+
tried: resolved.attempts.map((attempt) => attempt.command)
|
|
5136
|
+
};
|
|
5137
|
+
return {
|
|
5138
|
+
available: false,
|
|
5139
|
+
error: versionResult.stderr || "Unknown error",
|
|
5140
|
+
effectiveCommand: resolved.command,
|
|
5141
|
+
tried: resolved.attempts.map((attempt) => attempt.command)
|
|
5142
|
+
};
|
|
5143
|
+
} catch (err) {
|
|
5144
|
+
span.setAttribute("cli.available", false);
|
|
5145
|
+
return {
|
|
5146
|
+
available: false,
|
|
5147
|
+
error: err instanceof Error ? err.message : String(err)
|
|
5148
|
+
};
|
|
5149
|
+
} finally {
|
|
5150
|
+
const eventLoop = performance$1.eventLoopUtilization(eventLoopStartedAt);
|
|
5151
|
+
span.setAttributes({
|
|
5152
|
+
"cli.ms.response": roundedMs(performance$1.now() - checkStartedAt),
|
|
5153
|
+
"cli.event_loop.utilization": eventLoop.utilization,
|
|
5154
|
+
"cli.ms.event_loop_active": roundedMs(eventLoop.active),
|
|
5155
|
+
"cli.ms.event_loop_idle": roundedMs(eventLoop.idle)
|
|
5156
|
+
});
|
|
5157
|
+
span.end();
|
|
5158
|
+
}
|
|
5159
|
+
});
|
|
4335
5160
|
}
|
|
4336
5161
|
/**
|
|
4337
5162
|
* 流式执行 CLI 命令
|
|
@@ -4798,9 +5623,9 @@ function publicCommandEvidence(evidence) {
|
|
|
4798
5623
|
...evidence.contractError ? { contractError: evidence.contractError } : {}
|
|
4799
5624
|
};
|
|
4800
5625
|
}
|
|
4801
|
-
function createRootContext(options, cli, doctor, context, observedAt) {
|
|
5626
|
+
function createRootContext(options, cli, doctor, context$1, observedAt) {
|
|
4802
5627
|
const doctorData = doctor?.data ?? null;
|
|
4803
|
-
const contextData = context?.data ?? null;
|
|
5628
|
+
const contextData = context$1?.data ?? null;
|
|
4804
5629
|
const planningRoot = doctorData?.root ?? null;
|
|
4805
5630
|
return {
|
|
4806
5631
|
launchProject: {
|
|
@@ -4816,11 +5641,11 @@ function createRootContext(options, cli, doctor, context, observedAt) {
|
|
|
4816
5641
|
diagnostics: {
|
|
4817
5642
|
root: planningRoot?.status ?? [],
|
|
4818
5643
|
doctor: doctorData?.status ?? doctor?.diagnostics ?? [],
|
|
4819
|
-
context: contextData?.status ?? context?.diagnostics ?? []
|
|
5644
|
+
context: contextData?.status ?? context$1?.diagnostics ?? []
|
|
4820
5645
|
},
|
|
4821
5646
|
evidence: {
|
|
4822
5647
|
doctor: publicCommandEvidence(doctor),
|
|
4823
|
-
context: publicCommandEvidence(context)
|
|
5648
|
+
context: publicCommandEvidence(context$1)
|
|
4824
5649
|
},
|
|
4825
5650
|
observedAt
|
|
4826
5651
|
};
|
|
@@ -4837,10 +5662,10 @@ function errorState(attempt, code, message) {
|
|
|
4837
5662
|
observedAt: attempt.observedAt
|
|
4838
5663
|
};
|
|
4839
5664
|
}
|
|
4840
|
-
function rootsMatch(doctor, context) {
|
|
4841
|
-
return doctor.path === context.path && doctor.source === context.source && (doctor.store_id === void 0 || context.store_id === void 0 || doctor.store_id === context.store_id);
|
|
5665
|
+
function rootsMatch(doctor, context$1) {
|
|
5666
|
+
return doctor.path === context$1.path && doctor.source === context$1.source && (doctor.store_id === void 0 || context$1.store_id === void 0 || doctor.store_id === context$1.store_id);
|
|
4842
5667
|
}
|
|
4843
|
-
function classifyRootContext(attempt, doctor, context) {
|
|
5668
|
+
function classifyRootContext(attempt, doctor, context$1) {
|
|
4844
5669
|
const { cli, planningRoot, references } = attempt;
|
|
4845
5670
|
if (!cli.available) return errorState(attempt, "cli-unavailable", cli.error ?? "OpenSpec CLI is unavailable.");
|
|
4846
5671
|
if (!doctor) return errorState(attempt, "resolver-failed", "OpenSpec Doctor did not return command evidence.");
|
|
@@ -4848,10 +5673,10 @@ function classifyRootContext(attempt, doctor, context) {
|
|
|
4848
5673
|
if (!doctor.success) return errorState(attempt, "doctor-command-failed", commandMessage(doctor, "OpenSpec Doctor failed."));
|
|
4849
5674
|
if (!planningRoot) return errorState(attempt, "root-unresolved", "OpenSpec Doctor did not resolve a planning root.");
|
|
4850
5675
|
if (!planningRoot.healthy) return errorState(attempt, "root-unhealthy", planningRoot.status.map((diagnostic) => diagnostic.message).join("\n") || "OpenSpec Doctor reported an unhealthy planning root.");
|
|
4851
|
-
if (!context) return errorState(attempt, "resolver-failed", "OpenSpec Context did not return command evidence.");
|
|
4852
|
-
if (context.contractError) return errorState(attempt, "context-contract-drift", commandMessage(context, "OpenSpec Context returned an incompatible payload."));
|
|
4853
|
-
if (!context.success) return errorState(attempt, "context-command-failed", commandMessage(context, "OpenSpec Context failed."));
|
|
4854
|
-
if (!context.data?.root || !rootsMatch(planningRoot, context.data.root)) return errorState(attempt, "context-root-mismatch", "OpenSpec Doctor and Context did not report the same planning root.");
|
|
5676
|
+
if (!context$1) return errorState(attempt, "resolver-failed", "OpenSpec Context did not return command evidence.");
|
|
5677
|
+
if (context$1.contractError) return errorState(attempt, "context-contract-drift", commandMessage(context$1, "OpenSpec Context returned an incompatible payload."));
|
|
5678
|
+
if (!context$1.success) return errorState(attempt, "context-command-failed", commandMessage(context$1, "OpenSpec Context failed."));
|
|
5679
|
+
if (!context$1.data?.root || !rootsMatch(planningRoot, context$1.data.root)) return errorState(attempt, "context-root-mismatch", "OpenSpec Doctor and Context did not report the same planning root.");
|
|
4855
5680
|
const failedReference = references.flatMap((reference) => reference.status).find((diagnostic) => diagnostic.severity === "error");
|
|
4856
5681
|
if (failedReference) return errorState(attempt, "references-unresolved", failedReference.message);
|
|
4857
5682
|
return {
|
|
@@ -4881,15 +5706,15 @@ async function resolveRootContext(options) {
|
|
|
4881
5706
|
const selector = {};
|
|
4882
5707
|
const [doctorSettled, contextSettled] = await Promise.allSettled([options.cliExecutor.contracts.doctorRoot(selector), options.cliExecutor.contracts.context(selector)]);
|
|
4883
5708
|
const doctor = doctorSettled.status === "fulfilled" ? doctorSettled.value : null;
|
|
4884
|
-
const context = contextSettled.status === "fulfilled" ? contextSettled.value : null;
|
|
4885
|
-
const attempt = createRootContext(options, cli, doctor, context, observedAt);
|
|
5709
|
+
const context$1 = contextSettled.status === "fulfilled" ? contextSettled.value : null;
|
|
5710
|
+
const attempt = createRootContext(options, cli, doctor, context$1, observedAt);
|
|
4886
5711
|
if (doctorSettled.status === "rejected" || contextSettled.status === "rejected") {
|
|
4887
5712
|
let failure;
|
|
4888
5713
|
if (doctorSettled.status === "rejected") failure = doctorSettled.reason;
|
|
4889
5714
|
else if (contextSettled.status === "rejected") failure = contextSettled.reason;
|
|
4890
5715
|
return errorState(attempt, "resolver-failed", failure instanceof Error ? failure.message : String(failure));
|
|
4891
5716
|
}
|
|
4892
|
-
return classifyRootContext(attempt, doctor, context);
|
|
5717
|
+
return classifyRootContext(attempt, doctor, context$1);
|
|
4893
5718
|
}
|
|
4894
5719
|
|
|
4895
5720
|
//#endregion
|
|
@@ -5649,10 +6474,26 @@ function snapshotHasAbsolutePath(snapshot) {
|
|
|
5649
6474
|
return /\b(?:\/[\w.\-@]+){2,}/.test(text) || /[A-Za-z]:\//.test(text);
|
|
5650
6475
|
}
|
|
5651
6476
|
|
|
6477
|
+
//#endregion
|
|
6478
|
+
//#region src/cli-projection-sequence.ts
|
|
6479
|
+
/**
|
|
6480
|
+
* Orthogonal intents (created 2026-07-31 Asia/Shanghai):
|
|
6481
|
+
* 1. Submit aggregate CLI projection entities lazily while preserving source order.
|
|
6482
|
+
* 2. Prevent one aggregate read from pre-filling the shared buffered CLI admission queue.
|
|
6483
|
+
*
|
|
6484
|
+
* Original request (2026-07-31): "系统性地进行修复,因为List页面也有类似的问题。所有可能其它页面都有类似的问题。"
|
|
6485
|
+
*/
|
|
6486
|
+
/** Map CLI-backed projection entities in order, admitting only the current entity. */
|
|
6487
|
+
async function mapCliProjectionSeries(inputs, project) {
|
|
6488
|
+
const outputs = [];
|
|
6489
|
+
for (const [index, input] of inputs.entries()) outputs.push(await project(input, index));
|
|
6490
|
+
return outputs;
|
|
6491
|
+
}
|
|
6492
|
+
|
|
5652
6493
|
//#endregion
|
|
5653
6494
|
//#region src/opsx-kernel.ts
|
|
5654
6495
|
/**
|
|
5655
|
-
* Orthogonal intents (updated 2026-07-
|
|
6496
|
+
* Orthogonal intents (updated 2026-07-31 Asia/Shanghai):
|
|
5656
6497
|
* 1. Maintain reactive CLI-backed projections and their direct typed Projection Work readers.
|
|
5657
6498
|
* 2. Share and release per-entity streams through one planning-root kernel lifecycle.
|
|
5658
6499
|
* 3. Keep OpenSpec configuration ownership outside the workflow projection cache.
|
|
@@ -5662,6 +6503,7 @@ function snapshotHasAbsolutePath(snapshot) {
|
|
|
5662
6503
|
* Original request (2026-07-15): "Planning-root adapters and services consume the CLI-resolved root."
|
|
5663
6504
|
* Original request (2026-07-23): "OPSX Status 不应等待完整 Kernel warmup,且必须保留 CLI evidence。"
|
|
5664
6505
|
* Original request (2026-07-26): "展开全面的接口升级和内核升级和测试升级。"
|
|
6506
|
+
* Original request (2026-07-31): "系统性地进行修复,因为List页面也有类似的问题。所有可能其它页面都有类似的问题。"
|
|
5665
6507
|
*/
|
|
5666
6508
|
function toRelativePath(root, absolutePath) {
|
|
5667
6509
|
return relative(root, absolutePath).split(sep).join("/");
|
|
@@ -5935,6 +6777,15 @@ var OpsxKernel = class {
|
|
|
5935
6777
|
if (!state) throw new Error(`Schema yaml not found for "${name}"`);
|
|
5936
6778
|
return state.get();
|
|
5937
6779
|
}
|
|
6780
|
+
/** Non-throwing schema detail read; returns null when the schema is not yet loaded. */
|
|
6781
|
+
tryGetSchemaDetail(name) {
|
|
6782
|
+
return this.peekSchemaDetail(name);
|
|
6783
|
+
}
|
|
6784
|
+
/** Non-throwing schema yaml read; returns null when the schema is not yet loaded. */
|
|
6785
|
+
tryGetSchemaYaml(name) {
|
|
6786
|
+
const state = this._schemaYamls.get(name);
|
|
6787
|
+
return state ? state.get() : null;
|
|
6788
|
+
}
|
|
5938
6789
|
getChangeMetadata(changeId) {
|
|
5939
6790
|
const state = this._changeMetadata.get(changeId);
|
|
5940
6791
|
if (!state) return null;
|
|
@@ -5954,11 +6805,11 @@ var OpsxKernel = class {
|
|
|
5954
6805
|
}
|
|
5955
6806
|
startStream(state, task, signal) {
|
|
5956
6807
|
return new Promise((resolve$1, reject) => {
|
|
5957
|
-
const context = new ReactiveContext();
|
|
6808
|
+
const context$1 = new ReactiveContext();
|
|
5958
6809
|
let first = true;
|
|
5959
6810
|
(async () => {
|
|
5960
6811
|
try {
|
|
5961
|
-
for await (const data of context.stream(task, signal)) {
|
|
6812
|
+
for await (const data of context$1.stream(task, signal)) {
|
|
5962
6813
|
state.set(data);
|
|
5963
6814
|
if (first) {
|
|
5964
6815
|
first = false;
|
|
@@ -6040,11 +6891,11 @@ var OpsxKernel = class {
|
|
|
6040
6891
|
}));
|
|
6041
6892
|
}
|
|
6042
6893
|
watchSchemaChanges(signal) {
|
|
6043
|
-
const context = new ReactiveContext();
|
|
6894
|
+
const context$1 = new ReactiveContext();
|
|
6044
6895
|
(async () => {
|
|
6045
6896
|
let prevNames = new Set(this._schemas.get().map((s) => s.name));
|
|
6046
6897
|
try {
|
|
6047
|
-
for await (const schemas of context.stream(() => Promise.resolve(this._schemas.get()), signal)) {
|
|
6898
|
+
for await (const schemas of context$1.stream(() => Promise.resolve(this._schemas.get()), signal)) {
|
|
6048
6899
|
const newNames = new Set(schemas.map((s) => s.name));
|
|
6049
6900
|
for (const name of newNames) if (!prevNames.has(name)) this.warmupSchema(name, signal).catch(() => {});
|
|
6050
6901
|
for (const name of prevNames) if (!newNames.has(name)) {
|
|
@@ -6063,11 +6914,11 @@ var OpsxKernel = class {
|
|
|
6063
6914
|
})();
|
|
6064
6915
|
}
|
|
6065
6916
|
watchChangeIdChanges(signal) {
|
|
6066
|
-
const context = new ReactiveContext();
|
|
6917
|
+
const context$1 = new ReactiveContext();
|
|
6067
6918
|
(async () => {
|
|
6068
6919
|
let prevIds = new Set(this._changeIds.get());
|
|
6069
6920
|
try {
|
|
6070
|
-
for await (const ids of context.stream(() => Promise.resolve(this._changeIds.get()), signal)) {
|
|
6921
|
+
for await (const ids of context$1.stream(() => Promise.resolve(this._changeIds.get()), signal)) {
|
|
6071
6922
|
const newIds = new Set(ids);
|
|
6072
6923
|
for (const id of newIds) if (!prevIds.has(id)) this.warmupChange(id, signal).catch(() => {});
|
|
6073
6924
|
for (const id of prevIds) if (!newIds.has(id)) {
|
|
@@ -6175,7 +7026,7 @@ var OpsxKernel = class {
|
|
|
6175
7026
|
async fetchStatusList() {
|
|
6176
7027
|
await this.ensureChangeIds();
|
|
6177
7028
|
const changeIds = this._changeIds.get();
|
|
6178
|
-
await
|
|
7029
|
+
await mapCliProjectionSeries(changeIds, (id) => this.ensureStatus(id));
|
|
6179
7030
|
return changeIds.map((id) => this.getStatus(id));
|
|
6180
7031
|
}
|
|
6181
7032
|
async fetchInstructions(changeId, artifact, schema) {
|
|
@@ -6316,7 +7167,7 @@ var OpsxKernel = class {
|
|
|
6316
7167
|
async readStatusListProjection() {
|
|
6317
7168
|
const changeList = await this.fetchChangeListProjection();
|
|
6318
7169
|
return {
|
|
6319
|
-
value: await
|
|
7170
|
+
value: await mapCliProjectionSeries(changeList.value, (changeId) => this.fetchStatus(changeId)),
|
|
6320
7171
|
evidence: changeList.evidence
|
|
6321
7172
|
};
|
|
6322
7173
|
}
|
|
@@ -6331,14 +7182,14 @@ var OpsxKernel = class {
|
|
|
6331
7182
|
/** Execute the aggregate Schema bundle while retaining exact resolved-file dependencies. */
|
|
6332
7183
|
async readConfigBundleProjection() {
|
|
6333
7184
|
const schemasProjection = await this.fetchSchemasProjection();
|
|
6334
|
-
const details = await
|
|
7185
|
+
const details = await mapCliProjectionSeries(schemasProjection.value, async ({ name }) => {
|
|
6335
7186
|
const resolution = await this.fetchSchemaResolutionProjection(name);
|
|
6336
7187
|
return {
|
|
6337
7188
|
name,
|
|
6338
7189
|
detail: await this.fetchSchemaDetailAtResolution(name, resolution.value).catch(() => null),
|
|
6339
7190
|
resolution
|
|
6340
7191
|
};
|
|
6341
|
-
})
|
|
7192
|
+
});
|
|
6342
7193
|
return {
|
|
6343
7194
|
value: {
|
|
6344
7195
|
schemas: schemasProjection.value,
|
|
@@ -6650,4 +7501,4 @@ const PtyServerMessageSchema = z.discriminatedUnion("type", [
|
|
|
6650
7501
|
]);
|
|
6651
7502
|
|
|
6652
7503
|
//#endregion
|
|
6653
|
-
export { ACCESS_GATE_CREDENTIAL_BYTES, AI_TOOLS, ApplyInstructionsContextFilesSchema, ApplyInstructionsProjectionSchema, ApplyInstructionsSchema, ApplyTaskSchema, 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, CliArchiveSchema, CliArtifactInstructionsSchema, CliChangeListSchema, 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, 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, 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_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, 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, 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, SERVICE_TRANSLATION_ENGINE_IDS, SILENT_SOUND_ID, ScenarioStepKeywordSchema, ScenarioStepSchema, SchemaArtifactSchema, SchemaDetailSchema, SchemaInfoSchema, SchemaResolutionSchema, 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, asEnvUri, buildBackendHealthPayload, buildCliRunnerCandidates, buildEmbeddedUiLaunchUrl, buildHostedLaunchUrl, buildLocalDownloadPlanFromRepositoryFiles, buildLocalDownloadPlanFromRuntimeProfileFiles, buildMarkdownParentMap, buildOpsxEntityDetail, buildRuntimePackageInstallCommand, buildSpecCatalog, builtinOpenSpecReadingPlugin, checkLocalDirectionalModelLanguagePair, classifyStoreCliResult, clearCache, cliProjectionStates, closeAllProjectWatchers, closeAllWatchers, 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, 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, inspectProjectBinding, isBackendHealthRuntimeMetadata, isBatchTranslationAbort, isDirectionalManagedLocalTranslationEngineId, isGlobPattern, isHostedBackendHealthResponse, isManagedLocalTranslationEngineId, isMarkdownTaskSourcePath, isOpsxCoreWorkflowSelection, isOpsxGlobPattern, isPreviewableFile, isReferencedSpecIdentity, isSupportedEmbeddedUiUrl, isTerminalMutationStatus, isTerminalRendererEngine, isTextLikeFile, isTextLikeMime, isToolConfigured, isTranslationEngineDependencyReady, isTranslationEngineRuntimeReady, isWatcherPoolInitialized, mergeSpecCatalog, normalizeAccessGatePassword, normalizeBatchTranslationError, normalizeEmbeddedUiUrl, normalizeHostedAppBaseUrl, normalizeLegacySoundId, normalizeOpsxEntityPath, openSpecAnnotationRules, opsxGlobToRegex, opsxPathMatchesPattern, parseCliCommand, parseCliCommandResult, parseMarkdownFacts, parseMarkdownTasks, parseOpenSpecMarkdownToSpec, parseOpsxEntityMetadata, parseOpsxSchemaDetail, projectAnnotatedOpenSpecToSpec, projectOpenSpecMarkdown, projectTaskProjectionsFromMarkdownFiles, quoteTerminalShellArg, reactiveExists, reactiveReadDir, reactiveReadFile, reactiveStat, redactSnapshotForPublication, removePhysicalReactivePath, renderTerminalCommandArgs, renderTerminalSpawnCommandLine, requireCanonicalOpenSpecEntityId, requireOpenSpecEntityRelativePath, resolveHostedAppBaseUrl, resolveOpenSpecDataScope, resolveRootContext, resolveRuntimePackageInstallStrategy, resolveTerminalShellDefaults, runControlledTranslationTask, runPhysicalReactivePathMutation, selectLocalDownloadGroup, shouldShowTranslationEngineInstallGate, snapshotHasAbsolutePath, sniffGlobalCli, sortMarkdownReadingPlugins, soundIdFromCustomHash, specIdentityFromRoute, specIdentityKey, specRoutePath, subscribeWatcherRuntimeStatus, terminalNotificationEventToPublishInput, toCliProjectionCommandEvidence, toCliProjectionFailure, toCliProjectionNotice, toMarkdownFactKind, toOpsxDisplayPath, toPersistedGlobalSettings, toStoreFeatureResult, toggleMarkdownTask, trimMarkdownSlice, updateProjectBindingContent, updateReactiveFileCache, writePhysicalReactiveFile };
|
|
7504
|
+
export { ACCESS_GATE_CREDENTIAL_BYTES, AI_TOOLS, ApplyInstructionsContextFilesSchema, ApplyInstructionsProjectionSchema, ApplyInstructionsSchema, ApplyTaskSchema, 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, CliArchiveSchema, CliArtifactInstructionsSchema, CliChangeListSchema, 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, 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, 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_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, 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, SERVICE_TRANSLATION_ENGINE_IDS, SILENT_SOUND_ID, ScenarioStepKeywordSchema, ScenarioStepSchema, SchemaArtifactSchema, SchemaDetailSchema, SchemaInfoSchema, SchemaResolutionSchema, 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, asEnvUri, buildBackendHealthPayload, buildCliRunnerCandidates, buildEmbeddedUiLaunchUrl, buildHostedLaunchUrl, buildLocalDownloadPlanFromRepositoryFiles, buildLocalDownloadPlanFromRuntimeProfileFiles, buildMarkdownParentMap, buildOpsxEntityDetail, buildRuntimePackageInstallCommand, buildSpecCatalog, builtinOpenSpecReadingPlugin, checkLocalDirectionalModelLanguagePair, classifyStoreCliResult, clearCache, cliProjectionStates, closeAllProjectWatchers, closeAllWatchers, 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, 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, inspectProjectBinding, isBackendHealthRuntimeMetadata, isBatchTranslationAbort, isDirectionalManagedLocalTranslationEngineId, isGlobPattern, isHostedBackendHealthResponse, isManagedLocalTranslationEngineId, isMarkdownTaskSourcePath, isOpsxCoreWorkflowSelection, isOpsxGlobPattern, isPreviewableFile, isReferencedSpecIdentity, isSupportedEmbeddedUiUrl, isTerminalMutationStatus, isTerminalRendererEngine, isTextLikeFile, isTextLikeMime, isToolConfigured, isTranslationEngineDependencyReady, isTranslationEngineRuntimeReady, isWatcherPoolInitialized, mergeSpecCatalog, normalizeAccessGatePassword, normalizeBatchTranslationError, normalizeEmbeddedUiUrl, normalizeHostedAppBaseUrl, normalizeLegacySoundId, normalizeOpsxEntityPath, openSpecAnnotationRules, opsxGlobToRegex, opsxPathMatchesPattern, parseCliCommand, parseCliCommandResult, parseMarkdownFacts, parseMarkdownTasks, parseOpenSpecMarkdownToSpec, parseOpsxEntityMetadata, parseOpsxSchemaDetail, projectAnnotatedOpenSpecToSpec, projectOpenSpecMarkdown, projectTaskProjectionsFromMarkdownFiles, quoteTerminalShellArg, reactiveExists, reactiveReadDir, reactiveReadFile, reactiveStat, redactSnapshotForPublication, removePhysicalReactivePath, renderTerminalCommandArgs, renderTerminalSpawnCommandLine, requireCanonicalOpenSpecEntityId, requireOpenSpecEntityRelativePath, resolveHostedAppBaseUrl, resolveOpenSpecDataScope, resolveOpenSpecSpawnMode, resolveRootContext, resolveRuntimePackageInstallStrategy, resolveTerminalShellDefaults, runControlledTranslationTask, runPhysicalReactivePathMutation, selectLocalDownloadGroup, shouldShowTranslationEngineInstallGate, snapshotHasAbsolutePath, sniffGlobalCli, sortMarkdownReadingPlugins, soundIdFromCustomHash, specIdentityFromRoute, specIdentityKey, specRoutePath, subscribeWatcherRuntimeStatus, terminalNotificationEventToPublishInput, toCliProjectionCommandEvidence, toCliProjectionFailure, toCliProjectionNotice, toMarkdownFactKind, toOpsxDisplayPath, toPersistedGlobalSettings, toStoreFeatureResult, toggleMarkdownTask, trimMarkdownSlice, updateProjectBindingContent, updateReactiveFileCache, writePhysicalReactiveFile };
|