@openspecui/server 13.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.
Files changed (2) hide show
  1. package/dist/index.mjs +67 -32
  2. 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 cliEntries = await this.options.adapter.readCliChangeListEntries?.() ?? /* @__PURE__ */ new Map();
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 = ids.length;
4134
- for (const [index, id] of ids.entries()) {
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 = cliEntries.get(id);
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, cliEntries] = await Promise.all([
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.readCliChangeListEntries?.().catch(() => /* @__PURE__ */ new Map()) ?? Promise.resolve(/* @__PURE__ */ new Map())
9379
+ ctx.readCliChangeListFacts?.().catch(emptyCliChangeListFacts$1) ?? Promise.resolve(emptyCliChangeListFacts$1())
9372
9380
  ]);
9373
- const allActiveChanges = changeMetas.map((changeMeta) => {
9374
- const entry = cliEntries.get(changeMeta.id);
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
- /** Read CLI Change-list task facts once per call; failures degrade to an empty index. */
10918
- function readCliChangeListEntriesFor(service) {
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 /* @__PURE__ */ new Map();
10923
- return new Map(data.entries.map((entry) => [entry.name, entry]));
10938
+ if (data.kind !== "opsx-change-list") return emptyCliChangeListFacts();
10939
+ return deriveCliChangeListFacts(data);
10924
10940
  } catch {
10925
- return /* @__PURE__ */ new Map();
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
- readCliChangeListEntries: readCliChangeListEntriesFor(planningCliProjectionService)
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
- readCliChangeListEntries: async () => {
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, cliList] = await Promise.all([adapter.listChangesWithMeta(), runPlanningRootRead(ctx, ({ planningCliProjectionService }) => planningCliProjectionService.getCurrent({ kind: "opsx-change-list" })).then((data) => data.kind === "opsx-change-list" ? new Map(data.entries.map((entry) => [entry.name, entry])) : /* @__PURE__ */ new Map(), () => /* @__PURE__ */ new Map())]);
15507
- return rows.map((row) => {
15508
- const entry = cliList.get(row.id);
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": "13.0.0",
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": "13.0.0",
37
- "@openspecui/search": "13.0.0",
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",