@openspecui/server 12.0.0 → 13.0.1
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/index.mjs +67 -32
- package/package.json +3 -3
package/dist/index.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { a as resolveCt2ModelDownloadPlanFromRepositoryFiles } from "./src-Dh_UAz5C.mjs";
|
|
2
2
|
import { t as resolveGgufModelDownloadPlanFromRepositoryFiles } from "./src-CZfiVL_-.mjs";
|
|
3
|
-
import { ActiveRootMutationSchema, ActiveRootRevisionSchema, AgentDeliveryPolicyUpdateSchema, BatchTranslateInputSchema, CliExecutor, CliProjectionCommandError, CliProjectionNoticeSchema, CodeEditorThemeSchema, ConfigManager, CustomSoundHashSchema, DASHBOARD_METRIC_KEYS, DashboardConfigSchema, DashboardGitSnapshotSchema, DashboardSummaryInvalidationSchema, DashboardSummaryProjectionStateSchema, DashboardTrendsProjectionSchema, DocumentTranslationConfigUpdateSchema, EnvironmentDefaultStoreUpdateSchema, EnvironmentGlobalConfigValueSchema, EnvironmentGlobalFileProjectionDataSchema, EnvironmentGlobalFileProjectionStateSchema, EnvironmentGlobalProjectionDataSchema, EnvironmentGlobalProjectionStateSchema, GitConfigSchema, GlobalSettingsManager, LocalModelAssetStateSchema, LocalModelLifecycleFileStateSchema, LocalModelLifecycleGroupStateSchema, LocalModelProfileManifestSchema, MarkdownParser, NotificationPublishInputSchema, NotificationSettingsSchema, OPENSPECUI_DOCUMENT_HOOK_VERSION, OPENSPECUI_WORKFLOW_HOOK_VERSION, OPSX_ARTIFACT_INPUT_ACTIONS, OPSX_CHANGE_INPUT_ACTIONS, OPSX_COMMAND_CAPABLE_WORKFLOWS, OPSX_CORE_PROFILE_WORKFLOWS, OPSX_TEXT_INPUT_ACTIONS, OpenSpecAdapter, OpenSpecDataHomeObserver, OpenSpecUIGlobalSettingsUpdateSchema, OpenSpecWatcher, OpsxConfigSchema, OpsxKernel, OwnedSpecIdentitySchema, PlanningCliProjectionDataSchema, PlanningCliProjectionSelectorSchema, PlanningCliProjectionStateSchema, ProjectBindingUpdateSchema, ProjectWatcher, PtyClientMessageSchema, RUNTIME_INVALIDATION_FACETS, ReactiveContext, ReactiveObservationEnvironment, ReactiveState, RuntimeInvalidationIndex, RuntimeRootInvalidationRegistry, ServiceTranslationEngineIdSchema, SpecIdentitySchema, StoreDoctorResultSchema, StoreListResultSchema, StoreMutationLifecycleEventSchema, StoreMutationStartResponseSchema, TRANSLATION_ENGINE_MANIFESTS, TerminalConfigSchema, TerminalControlParser, TerminalRendererEngineSchema, TranslationCacheReadInputSchema, TranslationCacheWriteInputSchema, TranslationEngineIdSchema, TranslationEngineLifecycleStatusSchema, acquireWatcher, applyAgentDeliveryPolicy, buildBackendHealthPayload, buildLocalDownloadPlanFromRepositoryFiles, buildRuntimePackageInstallCommand, checkLocalDirectionalModelLanguagePair, classifyStoreCliResult, clearCache, compareAndWriteAtomicPhysicalReactiveFile, computeEnvUri, constantTimeEqual, createCleanCliEnv, createPhysicalReactiveDirectory, createToolInitStateProjection, createTranslationEngineLifecycleStatus, detectRuntimePackageManager, getAllTools, getAvailableTools, getConfiguredTools, getDefaultCliCommandString, getDetectedProjectTools, getExternalAgentSkillsObservationRoots, getExternalCodexCommandObservationRoot, getManagedLocalTranslationEngineManifest, getOpsxEntityRootRelativePath, getRootContextCliSelector, getToolInitStates, getTranslationEngineLifecycleMessage, getWatcherRuntimeStatus, inferFileMime, inferFilePreviewKind, inspectActiveRootOfficialConfig, inspectEnvironmentDefaultStore, inspectProjectBinding, isDirectionalManagedLocalTranslationEngineId, isManagedLocalTranslationEngineId, isTerminalMutationStatus, isTranslationEngineDependencyReady, isTranslationEngineRuntimeReady, loadOpenSpecAgentCommandContents, normalizeAgentDeliveryPolicy, normalizeBatchTranslationError, parseCliCommandResult, parseOpsxEntityMetadata, parseOpsxSchemaDetail, patchActiveRootOfficialFields, reactiveReadFile, reactiveStat, removePhysicalReactivePath, replaceFileAtomically, requireCanonicalOpenSpecEntityId, requireCanonicalOpenSpecSpecId, requireOpenSpecEntityRelativePath, resolveCommandInvocation, resolveOpenSpecDataScope, resolveRootContext, resolveRuntimePackageInstallStrategy, resolveTerminalShellDefaults, runPhysicalReactivePathMutation, selectAgentDeliveryRegistry, selectLocalDownloadGroup, shouldShowTranslationEngineInstallGate, sniffGlobalCli, spawnSafe, subscribeWatcherRuntimeStatus, terminalNotificationEventToPublishInput, terminateChildProcessTree, toCliProjectionCommandEvidence, toCliProjectionFailure, toCliProjectionNotice, toStoreFeatureResult, toggleMarkdownTask, updateProjectBindingContent, updateReactiveFileCache, validateActiveRootRawYaml, writePhysicalReactiveFile } from "@openspecui/core";
|
|
3
|
+
import { ActiveRootMutationSchema, ActiveRootRevisionSchema, AgentDeliveryPolicyUpdateSchema, BatchTranslateInputSchema, CliExecutor, CliProjectionCommandError, CliProjectionNoticeSchema, CodeEditorThemeSchema, ConfigManager, CustomSoundHashSchema, DASHBOARD_METRIC_KEYS, DashboardConfigSchema, DashboardGitSnapshotSchema, DashboardSummaryInvalidationSchema, DashboardSummaryProjectionStateSchema, DashboardTrendsProjectionSchema, DocumentTranslationConfigUpdateSchema, EnvironmentDefaultStoreUpdateSchema, EnvironmentGlobalConfigValueSchema, EnvironmentGlobalFileProjectionDataSchema, EnvironmentGlobalFileProjectionStateSchema, EnvironmentGlobalProjectionDataSchema, EnvironmentGlobalProjectionStateSchema, GitConfigSchema, GlobalSettingsManager, LocalModelAssetStateSchema, LocalModelLifecycleFileStateSchema, LocalModelLifecycleGroupStateSchema, LocalModelProfileManifestSchema, MarkdownParser, NotificationPublishInputSchema, NotificationSettingsSchema, OPENSPECUI_DOCUMENT_HOOK_VERSION, OPENSPECUI_WORKFLOW_HOOK_VERSION, OPSX_ARTIFACT_INPUT_ACTIONS, OPSX_CHANGE_INPUT_ACTIONS, OPSX_COMMAND_CAPABLE_WORKFLOWS, OPSX_CORE_PROFILE_WORKFLOWS, OPSX_TEXT_INPUT_ACTIONS, OpenSpecAdapter, OpenSpecDataHomeObserver, OpenSpecUIGlobalSettingsUpdateSchema, OpenSpecWatcher, OpsxConfigSchema, OpsxKernel, OwnedSpecIdentitySchema, PlanningCliProjectionDataSchema, PlanningCliProjectionSelectorSchema, PlanningCliProjectionStateSchema, ProjectBindingUpdateSchema, ProjectWatcher, PtyClientMessageSchema, RUNTIME_INVALIDATION_FACETS, ReactiveContext, ReactiveObservationEnvironment, ReactiveState, RuntimeInvalidationIndex, RuntimeRootInvalidationRegistry, ServiceTranslationEngineIdSchema, SpecIdentitySchema, StoreDoctorResultSchema, StoreListResultSchema, StoreMutationLifecycleEventSchema, StoreMutationStartResponseSchema, TRANSLATION_ENGINE_MANIFESTS, TerminalConfigSchema, TerminalControlParser, TerminalRendererEngineSchema, TranslationCacheReadInputSchema, TranslationCacheWriteInputSchema, TranslationEngineIdSchema, TranslationEngineLifecycleStatusSchema, acquireWatcher, applyAgentDeliveryPolicy, buildBackendHealthPayload, buildLocalDownloadPlanFromRepositoryFiles, buildRuntimePackageInstallCommand, checkLocalDirectionalModelLanguagePair, classifyStoreCliResult, clearCache, compareAndWriteAtomicPhysicalReactiveFile, computeEnvUri, constantTimeEqual, createCleanCliEnv, createPhysicalReactiveDirectory, createToolInitStateProjection, createTranslationEngineLifecycleStatus, deriveCliChangeListFacts, detectRuntimePackageManager, getAllTools, getAvailableTools, getConfiguredTools, getDefaultCliCommandString, getDetectedProjectTools, getExternalAgentSkillsObservationRoots, getExternalCodexCommandObservationRoot, getManagedLocalTranslationEngineManifest, getOpsxEntityRootRelativePath, getRootContextCliSelector, getToolInitStates, getTranslationEngineLifecycleMessage, getWatcherRuntimeStatus, inferFileMime, inferFilePreviewKind, inspectActiveRootOfficialConfig, inspectEnvironmentDefaultStore, inspectProjectBinding, isDirectionalManagedLocalTranslationEngineId, isManagedLocalTranslationEngineId, isTerminalMutationStatus, isTranslationEngineDependencyReady, isTranslationEngineRuntimeReady, loadOpenSpecAgentCommandContents, normalizeAgentDeliveryPolicy, normalizeBatchTranslationError, parseCliCommandResult, parseOpsxEntityMetadata, parseOpsxSchemaDetail, patchActiveRootOfficialFields, reactiveReadFile, reactiveStat, removePhysicalReactivePath, replaceFileAtomically, requireCanonicalOpenSpecEntityId, requireCanonicalOpenSpecSpecId, requireOpenSpecEntityRelativePath, resolveCommandInvocation, resolveOpenSpecDataScope, resolveRootContext, resolveRuntimePackageInstallStrategy, resolveTerminalShellDefaults, runPhysicalReactivePathMutation, selectAgentDeliveryRegistry, selectLocalDownloadGroup, shouldShowTranslationEngineInstallGate, sniffGlobalCli, spawnSafe, subscribeWatcherRuntimeStatus, terminalNotificationEventToPublishInput, terminateChildProcessTree, toCliProjectionCommandEvidence, toCliProjectionFailure, toCliProjectionNotice, toStoreFeatureResult, toggleMarkdownTask, updateProjectBindingContent, updateReactiveFileCache, validateActiveRootRawYaml, writePhysicalReactiveFile } from "@openspecui/core";
|
|
4
4
|
import { basename, dirname, extname, isAbsolute, join, matchesGlob, relative, resolve, sep } from "node:path";
|
|
5
5
|
import { access, copyFile, link, lstat, mkdir, open, readFile, readlink, realpath, rename, rm, stat, symlink, unlink, writeFile } from "node:fs/promises";
|
|
6
6
|
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
@@ -4127,15 +4127,19 @@ var ChangesProjectionService = class {
|
|
|
4127
4127
|
load: async (context) => {
|
|
4128
4128
|
context.reportStage("root-ready");
|
|
4129
4129
|
const ids = await this.options.adapter.listChanges();
|
|
4130
|
-
const
|
|
4130
|
+
const cliFacts = await this.options.adapter.readCliChangeListFacts?.() ?? {
|
|
4131
|
+
entries: /* @__PURE__ */ new Map(),
|
|
4132
|
+
namespaceNames: /* @__PURE__ */ new Set()
|
|
4133
|
+
};
|
|
4134
|
+
const rowIds = ids.filter((id) => !cliFacts.namespaceNames.has(id));
|
|
4131
4135
|
const rows = [];
|
|
4132
4136
|
const errors = [];
|
|
4133
|
-
const total =
|
|
4134
|
-
for (const [index, id] of
|
|
4137
|
+
const total = rowIds.length;
|
|
4138
|
+
for (const [index, id] of rowIds.entries()) {
|
|
4135
4139
|
if (context.signal.aborted) throw new DOMException("Change projection was cancelled.", "AbortError");
|
|
4136
4140
|
try {
|
|
4137
4141
|
const meta = await this.options.adapter.readChangeMeta(id);
|
|
4138
|
-
const entry =
|
|
4142
|
+
const entry = cliFacts.entries.get(id);
|
|
4139
4143
|
const row = entry ? {
|
|
4140
4144
|
...meta,
|
|
4141
4145
|
cliTaskSummary: {
|
|
@@ -9362,16 +9366,20 @@ function selectRecentDashboardArchives(items, limit = DASHBOARD_RECENT_LIST_LIMI
|
|
|
9362
9366
|
|
|
9363
9367
|
//#endregion
|
|
9364
9368
|
//#region src/dashboard-summary.ts
|
|
9369
|
+
const emptyCliChangeListFacts$1 = () => ({
|
|
9370
|
+
entries: /* @__PURE__ */ new Map(),
|
|
9371
|
+
namespaceNames: /* @__PURE__ */ new Set()
|
|
9372
|
+
});
|
|
9365
9373
|
/** Read the objective files behind Dashboard Summary without invoking Git or workflow commands. */
|
|
9366
9374
|
async function loadDashboardPlanningFacts(ctx) {
|
|
9367
|
-
const [specMetas, changeMetas, archiveMetas,
|
|
9375
|
+
const [specMetas, changeMetas, archiveMetas, cliFacts] = await Promise.all([
|
|
9368
9376
|
ctx.adapter.listSpecsWithMeta(),
|
|
9369
9377
|
ctx.adapter.listChangesWithMeta(),
|
|
9370
9378
|
ctx.adapter.listArchivedChangesWithMeta(),
|
|
9371
|
-
ctx.
|
|
9379
|
+
ctx.readCliChangeListFacts?.().catch(emptyCliChangeListFacts$1) ?? Promise.resolve(emptyCliChangeListFacts$1())
|
|
9372
9380
|
]);
|
|
9373
|
-
const allActiveChanges = changeMetas.map((changeMeta) => {
|
|
9374
|
-
const entry =
|
|
9381
|
+
const allActiveChanges = changeMetas.filter((changeMeta) => !cliFacts.namespaceNames.has(changeMeta.id)).map((changeMeta) => {
|
|
9382
|
+
const entry = cliFacts.entries.get(changeMeta.id);
|
|
9375
9383
|
return {
|
|
9376
9384
|
id: changeMeta.id,
|
|
9377
9385
|
name: changeMeta.name ?? changeMeta.id,
|
|
@@ -10361,7 +10369,7 @@ function joinParts(parts) {
|
|
|
10361
10369
|
return parts.map((part) => part?.trim() ?? "").filter((part) => part.length > 0).join("\n\n");
|
|
10362
10370
|
}
|
|
10363
10371
|
/** Collect the complete search index projection owned by one Planning-root service record. */
|
|
10364
|
-
async function collectSearchDocuments(adapter, documentService, resolveEntityReadOptions, referencedSpecs = []) {
|
|
10372
|
+
async function collectSearchDocuments(adapter, documentService, resolveEntityReadOptions, referencedSpecs = [], options = {}) {
|
|
10365
10373
|
const docs = [];
|
|
10366
10374
|
const specs = await adapter.listSpecsWithMeta();
|
|
10367
10375
|
for (const spec of specs) {
|
|
@@ -10394,6 +10402,7 @@ async function collectSearchDocuments(adapter, documentService, resolveEntityRea
|
|
|
10394
10402
|
});
|
|
10395
10403
|
const changes = await adapter.listChangesWithMeta();
|
|
10396
10404
|
for (const change of changes) {
|
|
10405
|
+
if (options.namespaceNames?.has(change.id)) continue;
|
|
10397
10406
|
const raw = documentService ? await documentService.readChangeRaw(change.id, "search", "processed") : await adapter.readChangeRaw(change.id);
|
|
10398
10407
|
if (!raw) continue;
|
|
10399
10408
|
docs.push({
|
|
@@ -10446,11 +10455,12 @@ var SearchService = class {
|
|
|
10446
10455
|
disposePromise = null;
|
|
10447
10456
|
watcher;
|
|
10448
10457
|
handleWatcherChange = () => this.scheduleRebuild();
|
|
10449
|
-
constructor(adapter, watcher, provider = new NodeWorkerSearchProvider(), documentService, resolveEntityReadOptions, getReferencedSpecs = () => []) {
|
|
10458
|
+
constructor(adapter, watcher, provider = new NodeWorkerSearchProvider(), documentService, resolveEntityReadOptions, getReferencedSpecs = () => [], getNamespaceNames = () => []) {
|
|
10450
10459
|
this.adapter = adapter;
|
|
10451
10460
|
this.documentService = documentService;
|
|
10452
10461
|
this.resolveEntityReadOptions = resolveEntityReadOptions;
|
|
10453
10462
|
this.getReferencedSpecs = getReferencedSpecs;
|
|
10463
|
+
this.getNamespaceNames = getNamespaceNames;
|
|
10454
10464
|
this.provider = provider;
|
|
10455
10465
|
this.watcher = watcher;
|
|
10456
10466
|
watcher?.on("change", this.handleWatcherChange);
|
|
@@ -10531,8 +10541,8 @@ var SearchService = class {
|
|
|
10531
10541
|
});
|
|
10532
10542
|
}
|
|
10533
10543
|
async collectCurrentDocuments() {
|
|
10534
|
-
const referencedSpecs = await this.getReferencedSpecs();
|
|
10535
|
-
return ProjectSearchDocumentSchema.array().parse(await collectSearchDocuments(this.adapter, this.documentService, this.resolveEntityReadOptions, referencedSpecs));
|
|
10544
|
+
const [referencedSpecs, namespaceNames] = await Promise.all([this.getReferencedSpecs(), this.getNamespaceNames()]);
|
|
10545
|
+
return ProjectSearchDocumentSchema.array().parse(await collectSearchDocuments(this.adapter, this.documentService, this.resolveEntityReadOptions, referencedSpecs, { namespaceNames: new Set(namespaceNames) }));
|
|
10536
10546
|
}
|
|
10537
10547
|
async applyDocuments(documents) {
|
|
10538
10548
|
if (this.initialized) {
|
|
@@ -10903,6 +10913,7 @@ var WorkflowInvocationService = class {
|
|
|
10903
10913
|
* Original request (2026-07-31): "把所有write-lock打印上时间日志和来源堆栈,使用otel来进行trace。"
|
|
10904
10914
|
* Owner diagnosis (2026-07-31): readonly cache misses must merge before lock admission, and slow async work must remain outside write locks.
|
|
10905
10915
|
* Full-gate correction (2026-07-31): imperative snapshots cannot become reactive replay authority before dependency-tracked validation.
|
|
10916
|
+
* Original request (2026-09-17): "Openspec 1.13.1 释放了…" — change-list nested/warnings projection (update-openspec-cli-1131 Slice 2).
|
|
10906
10917
|
*/
|
|
10907
10918
|
/** Root resolution failure that retains the complete failed Root Context state. */
|
|
10908
10919
|
var PlanningRootUnavailableError = class extends Error {
|
|
@@ -10914,18 +10925,29 @@ var PlanningRootUnavailableError = class extends Error {
|
|
|
10914
10925
|
}
|
|
10915
10926
|
};
|
|
10916
10927
|
/** Serialized deep owner for one replaceable Planning-root service record. */
|
|
10917
|
-
/**
|
|
10918
|
-
|
|
10928
|
+
/**
|
|
10929
|
+
* Read the CLI-owned Change-list facts once per call: actionable entries keyed by name plus
|
|
10930
|
+
* the structural namespace-name set (OpenSpec 1.13.1), both derived once at the kernel
|
|
10931
|
+
* change-list projection boundary. Failures degrade to empty facts so row builders keep
|
|
10932
|
+
* today's behavior (local rows visible, CLI summaries absent).
|
|
10933
|
+
*/
|
|
10934
|
+
function readCliChangeListFactsFor(service) {
|
|
10919
10935
|
return async () => {
|
|
10920
10936
|
try {
|
|
10921
10937
|
const data = await service.getCurrent({ kind: "opsx-change-list" });
|
|
10922
|
-
if (data.kind !== "opsx-change-list") return
|
|
10923
|
-
return
|
|
10938
|
+
if (data.kind !== "opsx-change-list") return emptyCliChangeListFacts();
|
|
10939
|
+
return deriveCliChangeListFacts(data);
|
|
10924
10940
|
} catch {
|
|
10925
|
-
return
|
|
10941
|
+
return emptyCliChangeListFacts();
|
|
10926
10942
|
}
|
|
10927
10943
|
};
|
|
10928
10944
|
}
|
|
10945
|
+
function emptyCliChangeListFacts() {
|
|
10946
|
+
return {
|
|
10947
|
+
entries: /* @__PURE__ */ new Map(),
|
|
10948
|
+
namespaceNames: /* @__PURE__ */ new Set()
|
|
10949
|
+
};
|
|
10950
|
+
}
|
|
10929
10951
|
var PlanningRootServiceManager = class {
|
|
10930
10952
|
activeRecord = null;
|
|
10931
10953
|
currentRootContextSnapshot = null;
|
|
@@ -10984,6 +11006,14 @@ var PlanningRootServiceManager = class {
|
|
|
10984
11006
|
documentService,
|
|
10985
11007
|
contracts: this.options.cliExecutor.contracts
|
|
10986
11008
|
})).entries.filter((entry) => entry.source === "referenced");
|
|
11009
|
+
}, async () => {
|
|
11010
|
+
try {
|
|
11011
|
+
const projection = planningCliProjectionService.read({ kind: "opsx-change-list" });
|
|
11012
|
+
if (projection.state !== "ready" || projection.data.kind !== "opsx-change-list") return [];
|
|
11013
|
+
return projection.data.namespaces;
|
|
11014
|
+
} catch {
|
|
11015
|
+
return [];
|
|
11016
|
+
}
|
|
10987
11017
|
});
|
|
10988
11018
|
const dashboardOverviewService = new DashboardOverviewService((reason) => loadDashboardOverview({
|
|
10989
11019
|
adapter,
|
|
@@ -11003,7 +11033,7 @@ var PlanningRootServiceManager = class {
|
|
|
11003
11033
|
loaders: {
|
|
11004
11034
|
loadSummary: () => loadDashboardSummary({
|
|
11005
11035
|
adapter,
|
|
11006
|
-
|
|
11036
|
+
readCliChangeListFacts: readCliChangeListFactsFor(planningCliProjectionService)
|
|
11007
11037
|
}),
|
|
11008
11038
|
loadTrends: () => loadDashboardTrends({
|
|
11009
11039
|
adapter,
|
|
@@ -11036,15 +11066,7 @@ var PlanningRootServiceManager = class {
|
|
|
11036
11066
|
adapter: {
|
|
11037
11067
|
listChanges: () => adapter.listChanges(),
|
|
11038
11068
|
readChangeMeta: (id) => adapter.readChangeMeta(id),
|
|
11039
|
-
|
|
11040
|
-
try {
|
|
11041
|
-
const data = await planningCliProjectionService.getCurrent({ kind: "opsx-change-list" });
|
|
11042
|
-
if (data.kind !== "opsx-change-list") return /* @__PURE__ */ new Map();
|
|
11043
|
-
return new Map(data.entries.map((entry) => [entry.name, entry]));
|
|
11044
|
-
} catch {
|
|
11045
|
-
return /* @__PURE__ */ new Map();
|
|
11046
|
-
}
|
|
11047
|
-
}
|
|
11069
|
+
readCliChangeListFacts: readCliChangeListFactsFor(planningCliProjectionService)
|
|
11048
11070
|
}
|
|
11049
11071
|
});
|
|
11050
11072
|
const filePreviewService = new FilePreviewService(projectDir, this.options.previewAssetsDir);
|
|
@@ -15503,9 +15525,18 @@ const specRouter = router({
|
|
|
15503
15525
|
* rows the CLI did not list keep a null summary rather than a UI-side recomputation.
|
|
15504
15526
|
*/
|
|
15505
15527
|
async function listChangesWithCliTaskSummary(ctx, adapter) {
|
|
15506
|
-
const [rows,
|
|
15507
|
-
|
|
15508
|
-
|
|
15528
|
+
const [rows, cliFacts] = await Promise.all([adapter.listChangesWithMeta(), runPlanningRootRead(ctx, ({ planningCliProjectionService }) => planningCliProjectionService.getCurrent({ kind: "opsx-change-list" })).then((data) => data.kind === "opsx-change-list" ? {
|
|
15529
|
+
entries: new Map(data.entries.map((entry) => [entry.name, entry])),
|
|
15530
|
+
namespaces: new Set(data.namespaces)
|
|
15531
|
+
} : {
|
|
15532
|
+
entries: /* @__PURE__ */ new Map(),
|
|
15533
|
+
namespaces: /* @__PURE__ */ new Set()
|
|
15534
|
+
}, () => ({
|
|
15535
|
+
entries: /* @__PURE__ */ new Map(),
|
|
15536
|
+
namespaces: /* @__PURE__ */ new Set()
|
|
15537
|
+
}))]);
|
|
15538
|
+
return rows.filter((row) => !cliFacts.namespaces.has(row.id)).map((row) => {
|
|
15539
|
+
const entry = cliFacts.entries.get(row.id);
|
|
15509
15540
|
return entry ? {
|
|
15510
15541
|
...row,
|
|
15511
15542
|
cliTaskSummary: {
|
|
@@ -16904,9 +16935,13 @@ const appRouter = router({
|
|
|
16904
16935
|
* 3. Keep Specs and active Changes regions independent for load/refresh/error/recovery (6.7).
|
|
16905
16936
|
* 4. Key Projection Work by composite (envUri, Store id, kind) identity; reject stale/cross-Store completion (6.8).
|
|
16906
16937
|
* 5. Reuse Store-root observation invalidation and data-free Push -> Pull transport (6.9).
|
|
16938
|
+
* 6. Exclude structurally-nested entries from the projected Store active-Change list
|
|
16939
|
+
* (OpenSpec 1.13.1): this independent `list --json` decode never presents a namespace
|
|
16940
|
+
* folder as a Store change; top-level warnings stay unprojected.
|
|
16907
16941
|
*
|
|
16908
16942
|
* Original request (2026-07-30): "Stores 完全可以融入 `Environment Center` 这个东西。"
|
|
16909
16943
|
* Spec: hosted-environment-delivery › "Environment-Scoped Store Content Projection".
|
|
16944
|
+
* Original request (2026-09-17): "Openspec 1.13.1 释放了…" — change-list nested/warnings projection (update-openspec-cli-1131 Slice 2).
|
|
16910
16945
|
*
|
|
16911
16946
|
* This service mirrors `store-projection-service.ts` but projects typed Spec/active-Change lists for one selected
|
|
16912
16947
|
* composite identity. It is demand-driven: only a subscribed Store Detail starts work (6.12).
|
|
@@ -17037,7 +17072,7 @@ var StoreContentProjectionService = class {
|
|
|
17037
17072
|
toChangesEnvelope(classification, storeId, cliVersion) {
|
|
17038
17073
|
if (classification.kind === "ok") return {
|
|
17039
17074
|
available: true,
|
|
17040
|
-
changes: classification.data.changes,
|
|
17075
|
+
changes: classification.data.changes.filter((entry) => entry.nested === void 0),
|
|
17041
17076
|
storeId,
|
|
17042
17077
|
...cliVersion ? { cliVersion } : {}
|
|
17043
17078
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openspecui/server",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "13.0.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.mjs",
|
|
6
6
|
"exports": {
|
|
@@ -33,8 +33,8 @@
|
|
|
33
33
|
"@hono/node-server": "^1.14.1",
|
|
34
34
|
"@huggingface/hub": "^2.12.0",
|
|
35
35
|
"@lydell/node-pty": "^1.1.0",
|
|
36
|
-
"@openspecui/core": "
|
|
37
|
-
"@openspecui/search": "
|
|
36
|
+
"@openspecui/core": "13.0.1",
|
|
37
|
+
"@openspecui/search": "13.0.1",
|
|
38
38
|
"@opentelemetry/api": "^1.9.1",
|
|
39
39
|
"@opentelemetry/exporter-trace-otlp-http": "^0.221.0",
|
|
40
40
|
"@opentelemetry/sdk-node": "^0.221.0",
|