dsh-openwrite 0.2.27 → 0.2.28
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/README.md +8 -0
- package/docs/CLOSED_ISSUE_FOLLOWUPS.md +5 -3
- package/docs/CONTEXT_SLOTS.md +60 -0
- package/docs/EDITOR_SAFETY_REPAIRS.md +17 -0
- package/docs/ISSUES_121_123.md +97 -0
- package/docs/ISSUES_98_100.md +2 -0
- package/docs/ISSUE_123_FOLLOWUP.md +54 -0
- package/docs/RELEASE_ACCEPTANCE.md +73 -3
- package/docs/SELECTION_UPGRADE_REPAIRS.md +16 -0
- package/docs/TOOLS.md +1356 -0
- package/dog-tools.mjs +5 -3
- package/package.json +5 -4
- package/packages/openwrite-bridge/lib/dog-delivery.js +7 -3
- package/packages/openwrite-bridge/lib/managed-runtime.js +3 -1
- package/packages/openwrite-bridge/lib/tool-policy.js +2 -0
- package/packages/openwrite-bridge/lib/tools.js +28 -5
- package/packages/studio-panel/lib/client.js +760 -539
- package/packages/studio-panel/lib/client.js.map +1 -1
- package/packages/studio-panel/lib/types/client/VditorBody.d.ts +7 -1
- package/packages/studio-panel/lib/types/client/locales.d.ts +1 -1
- package/packages/studio-panel/lib/types/client/manuscript-annotations.d.ts +2 -1
- package/packages/studio-panel/lib/types/client/manuscript-overlay.d.ts +2 -1
- package/packages/studio-panel/lib/types/client/manuscript-selection.d.ts +18 -5
- package/packages/studio-panel/lib/types/client/selection-coordinates.d.ts +15 -0
- package/preset-definition.mjs +1 -1
- package/release/{openwrite-5.8.16-py3-none-any.whl → openwrite-5.8.20-py3-none-any.whl} +0 -0
- package/release/runtime-manifest.json +6 -5
- package/release/source.json +3 -3
- package/scripts/safe-upgrade.mjs +104 -9
- package/vendor/dsh-dog/lib/{core-BAlgZpLq.js → core--byUPJL8.js} +129 -12
- package/vendor/dsh-dog/lib/core.js +1 -1
- package/vendor/dsh-dog/lib/index.js +54 -103
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
* compact subset plus headings/code/table (card-body scope).
|
|
11
11
|
*/
|
|
12
12
|
import type { PropsLocale } from '@deepseek-ai/dsh-client-ui-slots';
|
|
13
|
+
import type { EditorSerialization } from './selection-coordinates.ts';
|
|
13
14
|
import { type ManuscriptSelection } from './manuscript-selection.ts';
|
|
14
15
|
import type { ManuscriptAnnotation } from './manuscript-annotations.ts';
|
|
15
16
|
/** The slice of the bundled Vditor API this editor uses. */
|
|
@@ -29,6 +30,9 @@ type TFunc = PropsLocale<'studio-panel'>['t'];
|
|
|
29
30
|
*/
|
|
30
31
|
export declare function loadVditor(): Promise<VditorCtor>;
|
|
31
32
|
export type ManuscriptEditorApi = {
|
|
33
|
+
getValue: () => string;
|
|
34
|
+
getSerialization: () => EditorSerialization | undefined;
|
|
35
|
+
flush: () => void;
|
|
32
36
|
insertAtCaret: (markdown: string) => void;
|
|
33
37
|
revealQuote: (quote: string, start: number) => boolean;
|
|
34
38
|
};
|
|
@@ -36,6 +40,7 @@ interface VditorBodyProps {
|
|
|
36
40
|
/** Initial markdown (the editor is the source of truth afterwards). */
|
|
37
41
|
initial: string;
|
|
38
42
|
onChange: (value: string) => void;
|
|
43
|
+
onInputStateChange?: (pending: boolean) => void;
|
|
39
44
|
onSelectionChange?: (selection: ManuscriptSelection | null) => void;
|
|
40
45
|
onReady?: () => void;
|
|
41
46
|
onFailed: () => void;
|
|
@@ -43,11 +48,12 @@ interface VditorBodyProps {
|
|
|
43
48
|
/** The consumer can synchronously retain callbacks delivered during cleanup. */
|
|
44
49
|
flushOnLeave?: boolean;
|
|
45
50
|
annotations?: readonly ManuscriptAnnotation[];
|
|
51
|
+
annotationSource?: string;
|
|
46
52
|
onInsertMarker?: () => void;
|
|
47
53
|
onEditorApi?: (api: ManuscriptEditorApi | null) => void;
|
|
48
54
|
}
|
|
49
55
|
/** One Vditor IR instance bound to the shell theme; destroyed on unmount. */
|
|
50
|
-
export declare function VditorBody({ initial, onChange, onSelectionChange, onReady, onFailed, disabled, flushOnLeave, annotations, onInsertMarker, onEditorApi, }: VditorBodyProps): import("react").JSX.Element;
|
|
56
|
+
export declare function VditorBody({ initial, onChange, onInputStateChange, onSelectionChange, onReady, onFailed, disabled, flushOnLeave, annotations, annotationSource, onInsertMarker, onEditorApi, }: VditorBodyProps): import("react").JSX.Element;
|
|
51
57
|
/** Loading line shown while the Vditor script is in flight. */
|
|
52
58
|
export declare function VditorLoading({ t }: {
|
|
53
59
|
t: TFunc;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/** Dictionary namespace owned by this plugin. */
|
|
3
3
|
export declare const NS = "studio-panel";
|
|
4
4
|
/** The studio-panel dictionary key set (the source of truth for both locales). */
|
|
5
|
-
export type StudioPanelKey = 'serial.used' | 'serial.recoverTransaction' | 'serial.title' | 'serial.hint' | 'serial.saved' | 'serial.audit' | 'serial.scope' | 'serial.all' | 'serial.words' | 'serial.payoffs' | 'serial.overdue' | 'serial.promiseHint' | 'serial.chapter' | 'serial.promise' | 'serial.budget' | 'serial.function' | 'serial.payoffIds' | 'serial.actual' | 'serial.saveOutline' | 'serial.streak' | 'serial.metrics' | 'serial.hanzi' | 'serial.paragraphs' | 'serial.sentences' | 'serial.paragraphLengths' | 'serial.nounDensity' | 'serial.dialogue' | 'serial.duplicate' | 'serial.assets' | 'serial.assetsHint' | 'serial.term' | 'serial.forbidden' | 'serial.minimum' | 'serial.example' | 'serial.replacement' | 'serial.remove' | 'serial.addTerm' | 'serial.reviewTerms' | 'serial.nouns' | 'serial.threshold' | 'serial.groups' | 'serial.groupsHint' | 'serial.character' | 'serial.detail' | 'serial.addGroup' | 'serial.saveAssets' | 'serial.anchors' | 'serial.anchorHint' | 'serial.drift' | 'serial.driftHint' | 'serial.frozen' | 'serial.unfrozen' | 'serial.kind' | 'serial.impact' | 'serial.note' | 'serial.addDrift' | 'serial.growth' | 'serial.escape' | 'serial.dilution' | 'serial.snowball' | 'serial.local' | 'serial.section' | 'serial.arc' | 'serial.decision' | 'serial.absorb' | 'serial.recover' | 'serial.freeze' | 'serial.target' | 'serial.reconcile' | 'serial.historical' | 'serial.discard' | 'serial.activity' | 'serial.heartbeat' | 'serial.modelElapsed' | 'tools.export.purpose.personal_archive' | 'view.overview' | 'view.writing' | 'view.studio' | 'view.reviewWs' | 'view.outline' | 'view.assets' | 'view.tasks' | 'view.benchmark' | 'view.models' | 'view.graph' | 'view.research' | 'view.search' | 'view.creation' | 'view.library' | 'view.operations' | 'creation.chapters' | 'creation.searchChapters' | 'creation.clearSearch' | 'creation.chaptersEmpty' | 'creation.previousChapter' | 'creation.nextChapter' | 'creation.jumpChapter' | 'creation.chapterDuplicate' | 'creation.order.loading' | 'creation.order.unavailable' | 'creation.order.refresh' | 'creation.order.invalid' | 'creation.order.missingCount' | 'creation.order.move' | 'creation.order.volume' | 'creation.order.position' | 'creation.order.positionHelp' | 'creation.order.applyMove' | 'creation.order.blocked' | 'creation.order.moveComplete' | 'creation.order.conflict' | 'creation.mode.edit' | 'creation.mode.reader' | 'creation.writing.bookProgress' | 'creation.writing.chapterTarget' | 'creation.writing.chapterProgress' | 'creation.reader.title' | 'creation.reader.readOnly' | 'creation.reader.loading' | 'creation.reader.refresh' | 'creation.reader.openEditor' | 'creation.reader.path' | 'creation.reader.documentId' | 'creation.reader.revision' | 'creation.reader.revisionUnavailable' | 'creation.showChapters' | 'creation.hideChapters' | 'creation.inspector' | 'creation.showInspector' | 'creation.hideInspector' | 'creation.editorLoading' | 'creation.documentLoading' | 'creation.inspectorLoading' | 'creation.inspectorLoadingSlow' | 'creation.empty' | 'creation.acceptance.title' | 'creation.acceptance.loading' | 'creation.acceptance.current' | 'creation.acceptance.pending' | 'creation.acceptance.drift' | 'creation.acceptance.baselinePending' | 'creation.acceptance.needsReview' | 'creation.acceptance.failed' | 'creation.acceptance.unknown' | 'creation.acceptance.unavailable' | 'creation.acceptance.currentRevision' | 'creation.acceptance.acceptedRevision' | 'creation.acceptance.operation' | 'creation.acceptance.stale' | 'creation.acceptance.refresh' | 'creation.acceptance.baseline' | 'creation.acceptance.external' | 'creation.acceptance.resume' | 'creation.acceptance.acknowledge' | 'creation.acceptance.confirmBaseline' | 'creation.acceptance.confirmExternal' | 'creation.acceptance.confirmAcknowledge' | 'creation.context' | 'creation.review' | 'creation.revisions' | 'creation.activity' | 'creation.activity.loading' | 'creation.activity.unavailable' | 'creation.activity.invalid' | 'creation.activity.target' | 'creation.activity.remaining' | 'creation.activity.sprint' | 'creation.activity.sprintAdded' | 'creation.activity.sprintDeleted' | 'creation.activity.sprintNet' | 'creation.activity.sprintRevision' | 'creation.activity.sprintSaved' | 'creation.activity.identity' | 'creation.activity.recent' | 'creation.activity.empty' | 'creation.foreshadow.title' | 'creation.foreshadow.empty' | 'creation.foreshadow.due' | 'creation.foreshadow.overdue' | 'creation.foreshadow.toPlant' | 'creation.foreshadow.open' | 'creation.foreshadow.close' | 'creation.foreshadow.plant' | 'creation.foreshadow.reveal' | 'creation.foreshadow.status' | 'creation.foreshadow.weight' | 'creation.foreshadow.layer' | 'creation.foreshadow.source' | 'creation.contextEmpty' | 'creation.context.packet' | 'creation.context.current' | 'creation.context.stale' | 'creation.context.previousStale' | 'creation.context.requestBudget' | 'creation.context.sessionBudget' | 'creation.context.outputReserve' | 'creation.context.actualUsage' | 'creation.context.reported' | 'creation.context.unavailable' | 'creation.context.sessionSeparate' | 'creation.context.retrieval' | 'creation.context.sources' | 'creation.context.protected' | 'creation.context.noSnippet' | 'creation.context.reason' | 'creation.context.missing' | 'creation.context.excluded' | 'creation.context.fullText' | 'creation.reviewEmpty' | 'creation.review.stale' | 'creation.review.casUnavailable' | 'creation.review.refreshRequired' | 'creation.review.closure' | 'creation.review.closureProposal' | 'creation.review.closureRevision' | 'creation.review.outcome.resolved' | 'creation.review.outcome.retained' | 'creation.review.outcome.regressed' | 'creation.review.selectionSummary' | 'creation.review.instruction' | 'creation.review.createRevision' | 'creation.review.rereview' | 'creation.review.revisionStarted' | 'creation.review.rereviewStarted' | 'creation.revisionsEmpty' | 'creation.history.title' | 'creation.history.snapshot' | 'creation.history.snapshotName' | 'creation.history.snapshotCreated' | 'creation.history.empty' | 'creation.history.units' | 'creation.history.loading' | 'creation.history.compare' | 'creation.history.restorePreview' | 'creation.history.closePreview' | 'creation.history.noChanges' | 'creation.history.restore' | 'creation.history.restoreConfirm' | 'creation.history.restored' | 'creation.history.previewFailed' | 'creation.history.reason.autosave' | 'creation.history.reason.manual' | 'creation.history.reason.aiRevision' | 'creation.history.reason.fullRewrite' | 'creation.history.reason.restore' | 'creation.proposals.title' | 'creation.proposals.noRationale' | 'creation.proposals.range' | 'creation.proposals.evidence' | 'creation.proposals.reviewRevision' | 'creation.proposals.sourceRevision' | 'creation.proposals.noHunks' | 'creation.proposals.originalCandidate' | 'creation.proposals.reject' | 'creation.proposals.regenerate' | 'creation.proposals.applySelected' | 'creation.proposals.appliedNeedsReview' | 'creation.proposals.sourceConflict' | 'creation.selection.title' | 'creation.selection.expand' | 'creation.selection.compress' | 'creation.selection.naturalize' | 'creation.selection.reviewFix' | 'creation.selection.working' | 'creation.selection.staged' | 'creation.selection.empty' | 'creation.selection.saveRequired' | 'creation.selection.reviewRequired' | 'creation.selection.noIssues' | 'creation.selection.annotate' | 'creation.notes.title' | 'creation.notes.note' | 'creation.notes.color' | 'creation.notes.submit' | 'creation.notes.cancel' | 'creation.notes.working' | 'creation.notes.saved' | 'creation.notes.empty' | 'creation.notes.rangeLost' | 'creation.notes.saveRequired' | 'creation.notes.locate' | 'creation.notes.resolve' | 'creation.notes.resolved' | 'creation.notes.attached' | 'creation.notes.relocated' | 'creation.notes.detached' | 'creation.notes.quote' | 'creation.notes.color.amber' | 'creation.notes.color.rose' | 'creation.notes.color.sky' | 'creation.notes.color.lime' | 'creation.notes.color.violet' | 'creation.marker.insert' | 'creation.marker.title' | 'creation.marker.purpose' | 'creation.marker.state' | 'creation.marker.relation' | 'creation.marker.field' | 'creation.marker.oldState' | 'creation.marker.newState' | 'creation.marker.source' | 'creation.marker.target' | 'creation.marker.description' | 'creation.marker.pickCharacter' | 'creation.marker.insertNow' | 'creation.marker.cancel' | 'creation.marker.empty' | 'creation.marker.newline' | 'creation.marker.reserved' | 'creation.marker.needId' | 'creation.mentions.title' | 'creation.mentions.mention' | 'creation.mentions.card' | 'creation.mentions.aliases' | 'creation.mentions.close' | 'creation.mentions.ambiguous' | 'creation.mentions.choose' | 'creation.mentions.conflict' | 'creation.mentions.noSummary' | 'creation.issues' | 'creation.changedElsewhere' | 'creation.conflict' | 'creation.reload' | 'creation.overwrite' | 'creation.discardConfirm' | 'creation.overwriteConfirm' | 'creation.closePanel' | 'creation.draft.available' | 'creation.draft.conflict' | 'creation.draft.updated' | 'creation.draft.preview' | 'creation.draft.restore' | 'creation.draft.dismiss' | 'creation.draft.unavailable' | 'creation.status.idle' | 'creation.status.loading' | 'creation.status.saved' | 'creation.status.dirty' | 'creation.status.saving' | 'creation.status.conflict' | 'creation.status.offline' | 'operations.transfer' | 'operations.transferHint' | 'operations.project' | 'operations.create.new' | 'operations.create.id' | 'operations.create.title' | 'operations.create.submit' | 'operations.create.done' | 'operations.create.failed' | 'operations.create.pickHint' | 'operations.init.hint' | 'operations.init.submit' | 'operations.cancel' | 'workspace.unbound' | 'workspace.notInitialized' | 'workspace.bind.hint' | 'workspace.bind.pick' | 'workspace.bind.failed' | 'operations.create.titleHint' | 'tool.family.status' | 'tool.family.context' | 'tool.family.manuscript' | 'tool.family.revision' | 'tool.family.task' | 'tool.family.search' | 'tool.family.asset' | 'tool.family.outline' | 'tool.running' | 'tool.failed' | 'tool.succeeded' | 'tool.openChapter' | 'turn.changed' | 'turn.partial' | 'turn.failed' | 'turn.refreshFailed' | 'turn.history' | 'turn.proposed' | 'turn.rejected' | 'turn.entityChanges' | 'turn.before' | 'turn.after' | 'turn.missing' | 'turn.truncated' | 'turn.sourceRevision' | 'turn.resultRevision' | 'turn.committed' | 'turn.trace' | 'turn.modelCalls' | 'turn.days' | 'turn.accept' | 'turn.reject' | 'turn.retry' | 'turn.undo' | 'turn.applied' | 'turn.retried' | 'turn.undone' | 'resolving' | 'loading' | 'unreachable' | 'retry' | 'refresh' | 'openExternal' | 'outline.empty' | 'outline.drafted' | 'outline.planned' | 'outline.draftedCount' | 'outline.addChild' | 'outline.addAfter' | 'outline.addVolume' | 'outline.expandAll' | 'outline.collapseAll' | 'outline.del' | 'outline.confirmDelete' | 'outline.newTitlePlaceholder' | 'outline.opConflict' | 'outline.opFailed' | 'outline.summaryEmpty' | 'tools.title' | 'tools.export' | 'tools.export.done' | 'tools.export.failed' | 'tools.export.purpose' | 'tools.export.purpose.backup' | 'tools.export.purpose.delivery' | 'tools.export.format' | 'tools.export.preflight' | 'tools.export.loading' | 'tools.export.unavailable' | 'tools.export.refresh' | 'tools.export.revision' | 'tools.export.ready' | 'tools.export.blocked' | 'tools.export.download' | 'tools.export.order' | 'tools.export.orderEmpty' | 'tools.export.units' | 'tools.export.structure' | 'tools.export.structure.duplicates' | 'tools.export.structure.missing' | 'tools.export.structure.empty' | 'tools.export.structure.unreadable' | 'tools.export.clear' | 'tools.export.writingUnits' | 'tools.export.total' | 'tools.export.bookTarget' | 'tools.export.chapterTarget' | 'tools.export.completion' | 'tools.metadata.edit' | 'tools.metadata.save' | 'tools.metadata.cancel' | 'tools.metadata.hint' | 'tools.export.metadata' | 'tools.export.metadata.title' | 'tools.export.metadata.author' | 'tools.export.metadata.language' | 'tools.export.reviews' | 'tools.export.reviews.missing' | 'tools.export.reviews.current' | 'tools.export.reviews.stale' | 'tools.export.reviews.approved' | 'tools.export.reviews.notApproved' | 'tools.export.acceptance' | 'tools.export.acceptance.blocking' | 'tools.export.acceptance.blockingState' | 'tools.export.acceptance.needsReview' | 'tools.export.status' | 'tools.export.blockers' | 'tools.export.warnings' | 'tools.export.none' | 'tools.export.stale' | 'tools.sync' | 'tools.sync.done' | 'tools.sync.failed' | 'tools.import' | 'tools.import.empty' | 'tools.import.failed' | 'tools.import.done' | 'tools.import.choose' | 'tools.import.noFile' | 'tools.import.start' | 'tools.import.startAuto' | 'tools.import.preview' | 'tools.import.plan' | 'tools.import.conflicts' | 'tools.import.force' | 'tools.import.confirm' | 'tools.import.workspace.title' | 'tools.import.workspace.ownHint' | 'tools.import.workspace.operations' | 'tools.import.workspace.empty' | 'tools.import.workspace.new' | 'tools.import.workspace.file' | 'tools.import.workspace.arc' | 'tools.import.workspace.prepare' | 'tools.import.workspace.prepared' | 'tools.import.workspace.select' | 'tools.import.workspace.chapters' | 'tools.import.workspace.structure' | 'tools.import.workspace.chapterId' | 'tools.import.workspace.chapterTitle' | 'tools.import.workspace.chapterContent' | 'tools.import.workspace.moveUp' | 'tools.import.workspace.moveDown' | 'tools.import.workspace.remove' | 'tools.import.workspace.addChapter' | 'tools.import.workspace.newChapter' | 'tools.import.workspace.saveStructure' | 'tools.import.workspace.structureSaved' | 'tools.import.workspace.confirmStructure' | 'tools.import.workspace.confirmPrompt' | 'tools.import.workspace.confirmed' | 'tools.import.workspace.run' | 'tools.import.workspace.resume' | 'tools.import.workspace.taskStarted' | 'tools.import.workspace.discard' | 'tools.import.workspace.discardPrompt' | 'tools.import.workspace.discarded' | 'tools.import.workspace.recoverable' | 'tools.import.workspace.notRecoverable' | 'tools.import.stage.snapshot' | 'tools.import.stage.split' | 'tools.import.stage.structure_confirmed' | 'tools.import.stage.published' | 'tools.import.stage.acceptance' | 'tools.import.stage.reconcile' | 'tools.import.stage.synthesis' | 'tools.import.stage.complete' | 'tools.archive.title' | 'tools.archive.hint' | 'tools.archive.failed' | 'tools.archive.preflight' | 'tools.archive.create' | 'tools.archive.created' | 'tools.archive.list' | 'tools.archive.empty' | 'tools.archive.download' | 'tools.archive.downloaded' | 'tools.archive.files' | 'tools.archive.size' | 'tools.archive.categories' | 'tools.archive.includes' | 'tools.archive.excludes' | 'tools.archive.missing' | 'tools.archive.references' | 'tools.archive.referencePlan' | 'tools.archive.restore' | 'tools.archive.targetRoot' | 'tools.archive.pickTarget' | 'tools.archive.targetNovelId' | 'tools.archive.referencePolicy' | 'tools.archive.preserveRelative' | 'tools.archive.rewriteNovelId' | 'tools.archive.previewRestore' | 'tools.archive.restoreReady' | 'tools.archive.restoreBlocked' | 'tools.archive.conflicts' | 'tools.archive.pathRewrites' | 'tools.archive.rewrittenFiles' | 'tools.archive.rewrittenReferences' | 'tools.archive.preservedReferences' | 'tools.archive.referenceWarnings' | 'tools.archive.referenceConflicts' | 'tools.archive.tasksArchived' | 'tools.archive.autoResume' | 'tools.archive.noAutoResume' | 'tools.archive.confirmRestore' | 'tools.archive.restoreConfirm' | 'tools.archive.restoreStarted' | 'tasks.cancel' | 'tasks.cancel.title' | 'tasks.cancel.confirm' | 'tasks.cancel.done' | 'tasks.cancel.failed' | 'tasks.retry' | 'tasks.retry.title' | 'tasks.retry.notRecoverable' | 'tasks.retry.done' | 'tasks.retry.failed' | 'tasks.summary.total' | 'tasks.summary.updated' | 'tasks.filter.type' | 'tasks.filter.typeAll' | 'tasks.filter.chapter' | 'tasks.filter.keyword' | 'tasks.sort.newest' | 'tasks.sort.oldest' | 'tasks.sort.toggle' | 'tasks.progress.unknown' | 'tasks.phase.unknown' | 'tasks.confirm' | 'tasks.confirm.title' | 'tasks.confirm.done' | 'tasks.confirm.failed' | 'tasks.cancel.armYes' | 'tasks.cancel.armNo' | 'tasks.list' | 'tasks.detail.open' | 'tasks.detail.close' | 'tasks.detail.copyId' | 'tasks.detail.copied' | 'tasks.detail.events' | 'tasks.detail.eventsLoading' | 'tasks.detail.eventsEmpty' | 'tasks.detail.eventsFailed' | 'tasks.field.id' | 'tasks.field.type' | 'tasks.field.status' | 'tasks.field.phase' | 'tasks.field.chapter' | 'tasks.field.progress' | 'tasks.field.attempt' | 'tasks.field.created' | 'tasks.field.started' | 'tasks.field.updated' | 'tasks.field.completed' | 'tasks.field.summary' | 'tasks.field.resultRef' | 'tasks.field.failedStage' | 'tasks.field.errorCode' | 'tasks.field.recoverable' | 'tasks.field.yes' | 'tasks.field.no' | 'tasks.failure.cancelled' | 'tasks.failure.recoverable' | 'tasks.failure.provider' | 'tasks.failure.input' | 'tasks.failure.system' | 'tasks.jump.benchmark' | 'tasks.jump.research' | 'tasks.jump.chapter' | 'tasks.jump.review' | 'tasks.jump.unavailable' | 'tasks.jump.chapterHint' | 'tasks.jump.reviewHint' | 'tasks.jump.chapterMissing' | 'research.launch' | 'research.launch.placeholder' | 'research.launch.submit' | 'research.launch.submitting' | 'research.launch.submitted' | 'research.launch.failed' | 'research.launch.hint' | 'tasks.result.toggle' | 'tasks.result.score' | 'tasks.result.issues' | 'search.preview.back' | 'search.preview.openCreation' | 'search.preview.jumpReady' | 'search.preview.identityMismatch' | 'search.preview.locatorCurrent' | 'search.preview.locatorStale' | 'search.preview.locatorUnverified' | 'search.preview.revisionUnavailable' | 'search.change.title' | 'search.change.serverOwned' | 'search.change.unavailable' | 'search.change.currentLine' | 'search.change.replacement' | 'search.change.preview' | 'search.change.previewing' | 'search.change.sourceRevision' | 'search.change.resultRevision' | 'search.change.reject' | 'search.change.confirmApply' | 'search.change.applying' | 'search.change.refreshRequired' | 'search.change.invalidApply' | 'search.change.invalidReject' | 'search.change.applied' | 'search.change.rejected' | 'search.change.refresh' | 'assets.empty' | 'assets.other' | 'assets.stages' | 'assets.aliases' | 'assets.segment.characters' | 'assets.segment.world' | 'assets.segment.progression' | 'assets.segment.references' | 'assets.segment.core' | 'assets.segment.empty' | 'assets.references.empty' | 'assets.core.empty' | 'assets.detail.loading' | 'assets.draft.restored' | 'assets.draft.unsaved' | 'assets.draft.conflict' | 'assets.detail.relations' | 'assets.detail.index' | 'assets.list.detail_refs' | 'assets.list.taboos' | 'assets.edit.linesHint' | 'assets.relation.confirmed' | 'assets.relation.registered' | 'assets.relation.incoming' | 'assets.searchPlaceholder' | 'assets.edit.open' | 'assets.edit.name' | 'assets.edit.summary' | 'assets.edit.tags' | 'assets.edit.listHint' | 'assets.edit.save' | 'assets.edit.saving' | 'assets.edit.cancel' | 'assets.edit.conflict' | 'assets.edit.conflictRefresh' | 'assets.edit.addRelation' | 'assets.edit.removeRelation' | 'assets.edit.relationTarget' | 'assets.edit.relationNote' | 'assets.edit.derivedRelations' | 'assets.edit.body' | 'assets.edit.liveLoading' | 'assets.edit.optional' | 'assets.field.tier' | 'assets.field.personality' | 'assets.field.goal' | 'assets.field.fear' | 'assets.field.appearance' | 'assets.field.voice' | 'assets.field.current_state' | 'assets.field.organization' | 'assets.field.progression_system' | 'assets.field.progression_stage' | 'assets.field.status' | 'assets.field.kind' | 'assets.field.type' | 'assets.field.subtype' | 'assets.field.state_updated_at' | 'assets.field.role' | 'assets.edit.liveFailed' | 'assets.selectHint' | 'assets.create.open' | 'assets.create.submit' | 'assets.create.idHint' | 'assets.create.tier' | 'assets.create.type' | 'assets.create.progressionKind' | 'assets.create.stages' | 'assets.create.stageId' | 'assets.create.stageName' | 'assets.create.addStage' | 'tasks.empty' | 'tasks.filter.all' | 'tasks.attempt' | 'tasks.status.pending' | 'tasks.status.running' | 'tasks.status.awaiting_confirmation' | 'tasks.status.completed' | 'tasks.status.failed' | 'tasks.status.cancelled' | 'tasks.status.interrupted' | 'tasks.phase.queued' | 'tasks.phase.reading' | 'tasks.phase.preparing' | 'tasks.phase.model' | 'tasks.phase.validating' | 'tasks.phase.committing' | 'tasks.phase.complete' | 'tasks.type.chapter_write' | 'tasks.type.chapter_review' | 'tasks.type.continuous_write' | 'tasks.type.revision' | 'tasks.type.source_operation' | 'tasks.type.reference_operation' | 'tasks.type.manuscript_import' | 'tasks.type.project_restore' | 'tasks.type.research' | 'tasks.type.model_benchmark' | 'graph.foreshadowing' | 'graph.relationships' | 'graph.nodes' | 'graph.connections' | 'graph.relayout' | 'graph.weight' | 'graph.target' | 'graph.truncated' | 'graph.validation.errors' | 'graph.empty.foreshadowing' | 'graph.empty.relationships' | 'graph.entityType' | 'graph.entityStatus' | 'graph.search' | 'graph.connectedOnly' | 'graph.neighbors' | 'graph.edgeType' | 'graph.origin' | 'graph.source' | 'graph.confirmed' | 'dag.quality' | 'dag.coverage' | 'dag.gate' | 'dag.delivery' | 'dag.current' | 'dag.stale' | 'dag.toRevision' | 'dag.toRevisionDone' | 'dag.toRevisionFailed' | 'graph.unresolved' | 'graph.kind.character' | 'graph.kind.faction' | 'graph.kind.place' | 'graph.kind.concept' | 'graph.kind.other' | 'graph.truth' | 'graph.truth.currentState' | 'graph.truth.ledger' | 'graph.truth.relationships' | 'graph.workflows' | 'graph.workflow.currentStage' | 'graph.empty.truth' | 'graph.empty.truthDoc' | 'graph.empty.workflows' | 'graph.reviewDag' | 'graph.reviewFramework' | 'graph.reviewDomains' | 'graph.reviewChecks' | 'graph.reviewCriteria' | 'graph.deliveryDag' | 'graph.filter.all' | 'graph.filter.anomaly' | 'graph.filter.blocker' | 'graph.expandChecks' | 'graph.collapseChecks' | 'graph.empty.dag' | 'benchmark.title' | 'benchmark.taskType' | 'benchmark.executionEvidence' | 'benchmark.evidence' | 'benchmark.status.skipped' | 'benchmark.status.stale' | 'benchmark.task.chapter' | 'benchmark.task.outline' | 'benchmark.task.chapterHint' | 'benchmark.task.outlineHint' | 'benchmark.planner' | 'benchmark.nextChapter' | 'benchmark.chapterWritten' | 'benchmark.chapterPlanned' | 'benchmark.chapterUnavailable' | 'benchmark.customChapter' | 'benchmark.chapterId' | 'benchmark.outlineOrigin' | 'benchmark.continueOutline' | 'benchmark.customOutlineStart' | 'benchmark.outlineStart' | 'benchmark.outlineCount' | 'benchmark.rangeFrom' | 'benchmark.rangeTo' | 'benchmark.chapterUnit' | 'benchmark.invalidRange' | 'benchmark.outlineRangeHint' | 'benchmark.earliestOutlineStart' | 'benchmark.invalidChapter' | 'benchmark.historicalChapterHint' | 'benchmark.autoDag' | 'benchmark.executedDag' | 'benchmark.dagAutomatic' | 'benchmark.afterStage' | 'benchmark.reviewScope' | 'benchmark.isolatedHint' | 'benchmark.pipelineUnavailable' | 'benchmark.actualChapters' | 'benchmark.pipelineFinished' | 'benchmark.pipelineStatus' | 'benchmark.reviewIncomplete' | 'benchmark.partialScore' | 'benchmark.reviewIncompleteHint' | 'benchmark.completeReviews' | 'benchmark.reportedCoverage' | 'benchmark.coveragePending' | 'benchmark.factsPendingTitle' | 'benchmark.factsPendingHint' | 'benchmark.selectModels' | 'benchmark.description' | 'benchmark.configure' | 'benchmark.modelHint' | 'benchmark.advanced' | 'benchmark.history' | 'benchmark.results' | 'benchmark.noProfiles' | 'benchmark.chooseModels' | 'benchmark.workload' | 'benchmark.submitting' | 'benchmark.noCandidates' | 'benchmark.noEvaluations' | 'benchmark.plannedCandidates' | 'benchmark.plannedEvaluations' | 'benchmark.task' | 'benchmark.mode' | 'benchmark.mode.framework' | 'benchmark.mode.creative' | 'benchmark.mode.unknown' | 'benchmark.reviewer' | 'benchmark.chapter' | 'benchmark.repeats' | 'benchmark.words' | 'benchmark.concurrency' | 'benchmark.run' | 'benchmark.empty' | 'benchmark.select' | 'benchmark.averageScore' | 'benchmark.output' | 'benchmark.candidate' | 'benchmark.candidates' | 'benchmark.evaluations' | 'benchmark.writer' | 'benchmark.path' | 'benchmark.status' | 'benchmark.actualWords' | 'benchmark.finishReason' | 'benchmark.error' | 'benchmark.coverage' | 'benchmark.gate' | 'benchmark.delivery' | 'benchmark.productionGate' | 'benchmark.productionGateMissing' | 'benchmark.domains' | 'benchmark.latency' | 'benchmark.usage' | 'benchmark.cost' | 'benchmark.inputTokens' | 'benchmark.outputTokens' | 'benchmark.reasoningTokens' | 'benchmark.totalTokens' | 'benchmark.actualCost' | 'benchmark.costCoverage' | 'benchmark.effectiveRate' | 'benchmark.runs' | 'benchmark.sameInputGroup' | 'benchmark.comparisonIncomplete' | 'benchmark.inputProvenance' | 'benchmark.runPhases' | 'benchmark.phase.created' | 'benchmark.phase.started' | 'benchmark.phase.completed' | 'benchmark.contextHash' | 'benchmark.comparisonKey' | 'benchmark.promptVersion' | 'benchmark.rubricVersion' | 'benchmark.blindReview' | 'benchmark.contextStrategy' | 'benchmark.manifestVersion' | 'benchmark.tokenEstimator' | 'benchmark.packetRevision' | 'benchmark.sourceRevision' | 'benchmark.estimatedTokens' | 'benchmark.characters' | 'benchmark.contextSources' | 'benchmark.sourcePresent' | 'benchmark.sourceMissing' | 'benchmark.responseIdentity' | 'models.title' | 'models.list' | 'models.editor' | 'models.new' | 'models.empty' | 'models.id' | 'models.label' | 'models.provider' | 'models.protocol.openai' | 'models.protocol.anthropic' | 'models.modelId' | 'models.baseUrl' | 'models.apiFormat' | 'models.context' | 'models.output' | 'models.credential' | 'models.embeddingProvider' | 'models.embeddingProviderOpenai' | 'models.embeddingProviderLocal' | 'models.embeddingProviderUnknown' | 'models.embeddingProviderOpenaiHint' | 'models.embeddingProviderLocalHint' | 'models.embeddingLocalPreset' | 'models.vectorDimensionsLocalHint' | 'models.embeddingModel' | 'models.embeddingCredential' | 'models.credentialHint' | 'models.authSource' | 'models.authApiKey' | 'models.authConsole' | 'models.consoleHint' | 'models.goWorkspace' | 'models.goWorkspaceHint' | 'models.remember' | 'models.save' | 'models.chatTest' | 'models.embeddingTest' | 'models.vectorParameters' | 'models.vectorDimension' | 'models.vectorMaxTokens' | 'models.vectorCount' | 'models.vectorDimensionsHint' | 'models.test.invalidResponseHint' | 'models.test.unsupportedHint' | 'models.delete' | 'models.delete.confirm' | 'models.delete.blocked' | 'models.delete.wouldFail' | 'models.test.untested' | 'models.test.ok' | 'models.test.failed' | 'models.dependencies' | 'models.dependenciesHint' | 'models.fallback' | 'models.chooseFallback' | 'models.routes' | 'models.routesSave' | 'models.saved' | 'models.deleted' | 'models.chatOk' | 'models.embeddingOk' | 'models.configured' | 'models.missing' | 'models.routesSaved' | 'models.group.basic' | 'models.group.connection' | 'models.group.generation' | 'models.group.embedding' | 'models.group.credentials' | 'models.group.routeUsage' | 'models.temperature' | 'models.timeout' | 'models.embeddingBaseUrl' | 'models.validation.required' | 'models.validation.positive' | 'models.validation.temperature' | 'models.validation.embeddingProvider' | 'models.unsavedChanges' | 'models.unsavedDiscard' | 'models.unsavedKeep' | 'models.test.loading' | 'models.usedByRoutes' | 'models.noRoutes' | 'models.delete.resultingRoutes' | 'models.embeddingEmpty' | 'models.embeddingConfigured' | 'models.embeddingMissing' | 'models.active' | 'models.inactive' | 'models.route.goethe' | 'models.route.dante' | 'models.route.chapter_write' | 'models.route.review' | 'models.route.source_extract' | 'models.route.revision' | 'models.route.search' | 'models.route.research' | 'models.routesImpact' | 'models.routesUnchanged' | 'models.routesUnassigned' | 'models.embedConfigured' | 'models.embedMissing' | 'models.capability.chat' | 'models.capability.embedding' | 'research.reports' | 'research.unavailable' | 'research.empty' | 'research.selectHint' | 'research.report.loading' | 'research.quality' | 'research.language' | 'research.filter.keyword' | 'research.filter.status' | 'research.filter.sources' | 'research.filter.all' | 'research.status.succeeded' | 'research.status.failed' | 'research.status.needsReview' | 'research.status.unknown' | 'research.sourcesAvailable' | 'research.sourcesUnavailable' | 'research.sourcesEmpty' | 'research.sources' | 'research.sourceCheck' | 'research.source.cited' | 'research.source.uncited' | 'research.exportMarkdown' | 'research.referenceOnly' | 'research.prompt' | 'research.taskId' | 'research.episodeId' | 'research.model' | 'research.searchProvider' | 'research.createdAt' | 'research.completedAt' | 'research.latency' | 'research.wordCount' | 'research.tokens' | 'research.cost' | 'research.sourcesStatus' | 'research.metrics' | 'search.placeholder' | 'search.hint' | 'search.empty' | 'search.indexed' | 'search.timeout' | 'search.scope.all' | 'search.scope.outline' | 'search.scope.core' | 'search.scope.characters' | 'search.scope.settings' | 'search.scope.continuity' | 'search.scope.chapters' | 'search.scope.sources' | 'assets.references' | 'reference.intent.reference' | 'reference.intent.continuation' | 'reference.intent.canon' | 'reference.intent.migration' | 'reference.structure.awaiting_confirmation' | 'reference.structure.confirmed' | 'reference.analysis.complete' | 'reference.analysis.pending' | 'reference.chars' | 'reference.content.loading' | 'reference.content.full' | 'review.running' | 'review.passed' | 'review.failed' | 'review.score' | 'review.issues' | 'review.suggestion' | 'review.quote' | 'review.dimension' | 'review.coverage' | 'review.gate' | 'review.delivery' | 'review.execution' | 'review.priority' | 'review.severity.critical' | 'review.severity.warning' | 'review.severity.info' | 'review.severity.blocker' | 'review.severity.high' | 'review.severity.medium' | 'review.severity.low' | 'review.priority.blocker' | 'review.priority.high' | 'review.priority.medium' | 'review.priority.low' | 'review.status.pass' | 'review.status.blocked' | 'review.status.inconclusive' | 'review.status.revise' | 'review.status.completed' | 'review.status.partial' | 'review.status.failed' | 'review.status.stale' | 'review.status.unknown' | 'review.rawTitle';
|
|
5
|
+
export type StudioPanelKey = 'serial.used' | 'serial.recoverTransaction' | 'serial.title' | 'serial.hint' | 'serial.saved' | 'serial.audit' | 'serial.scope' | 'serial.all' | 'serial.words' | 'serial.payoffs' | 'serial.overdue' | 'serial.promiseHint' | 'serial.chapter' | 'serial.promise' | 'serial.budget' | 'serial.function' | 'serial.payoffIds' | 'serial.actual' | 'serial.saveOutline' | 'serial.streak' | 'serial.metrics' | 'serial.hanzi' | 'serial.paragraphs' | 'serial.sentences' | 'serial.paragraphLengths' | 'serial.nounDensity' | 'serial.dialogue' | 'serial.duplicate' | 'serial.assets' | 'serial.assetsHint' | 'serial.term' | 'serial.forbidden' | 'serial.minimum' | 'serial.example' | 'serial.replacement' | 'serial.remove' | 'serial.addTerm' | 'serial.reviewTerms' | 'serial.nouns' | 'serial.threshold' | 'serial.groups' | 'serial.groupsHint' | 'serial.character' | 'serial.detail' | 'serial.addGroup' | 'serial.saveAssets' | 'serial.anchors' | 'serial.anchorHint' | 'serial.drift' | 'serial.driftHint' | 'serial.frozen' | 'serial.unfrozen' | 'serial.kind' | 'serial.impact' | 'serial.note' | 'serial.addDrift' | 'serial.growth' | 'serial.escape' | 'serial.dilution' | 'serial.snowball' | 'serial.local' | 'serial.section' | 'serial.arc' | 'serial.decision' | 'serial.absorb' | 'serial.recover' | 'serial.freeze' | 'serial.target' | 'serial.reconcile' | 'serial.historical' | 'serial.discard' | 'serial.activity' | 'serial.heartbeat' | 'serial.modelElapsed' | 'tools.export.purpose.personal_archive' | 'view.overview' | 'view.writing' | 'view.studio' | 'view.reviewWs' | 'view.outline' | 'view.assets' | 'view.tasks' | 'view.benchmark' | 'view.models' | 'view.graph' | 'view.research' | 'view.search' | 'view.creation' | 'view.library' | 'view.operations' | 'creation.chapters' | 'creation.searchChapters' | 'creation.clearSearch' | 'creation.chaptersEmpty' | 'creation.previousChapter' | 'creation.nextChapter' | 'creation.jumpChapter' | 'creation.chapterDuplicate' | 'creation.order.loading' | 'creation.order.unavailable' | 'creation.order.refresh' | 'creation.order.invalid' | 'creation.order.missingCount' | 'creation.order.move' | 'creation.order.volume' | 'creation.order.position' | 'creation.order.positionHelp' | 'creation.order.applyMove' | 'creation.order.blocked' | 'creation.order.moveComplete' | 'creation.order.conflict' | 'creation.mode.edit' | 'creation.mode.reader' | 'creation.writing.bookProgress' | 'creation.writing.chapterTarget' | 'creation.writing.chapterProgress' | 'creation.reader.title' | 'creation.reader.readOnly' | 'creation.reader.loading' | 'creation.reader.refresh' | 'creation.reader.openEditor' | 'creation.reader.path' | 'creation.reader.documentId' | 'creation.reader.revision' | 'creation.reader.revisionUnavailable' | 'creation.showChapters' | 'creation.hideChapters' | 'creation.inspector' | 'creation.showInspector' | 'creation.hideInspector' | 'creation.editorLoading' | 'creation.documentLoading' | 'creation.inspectorLoading' | 'creation.inspectorLoadingSlow' | 'creation.empty' | 'creation.acceptance.title' | 'creation.acceptance.loading' | 'creation.acceptance.current' | 'creation.acceptance.pending' | 'creation.acceptance.drift' | 'creation.acceptance.baselinePending' | 'creation.acceptance.needsReview' | 'creation.acceptance.failed' | 'creation.acceptance.unknown' | 'creation.acceptance.unavailable' | 'creation.acceptance.currentRevision' | 'creation.acceptance.acceptedRevision' | 'creation.acceptance.operation' | 'creation.acceptance.stale' | 'creation.acceptance.refresh' | 'creation.acceptance.baseline' | 'creation.acceptance.external' | 'creation.acceptance.resume' | 'creation.acceptance.acknowledge' | 'creation.acceptance.confirmBaseline' | 'creation.acceptance.confirmExternal' | 'creation.acceptance.confirmAcknowledge' | 'creation.context' | 'creation.review' | 'creation.revisions' | 'creation.activity' | 'creation.activity.loading' | 'creation.activity.unavailable' | 'creation.activity.invalid' | 'creation.activity.target' | 'creation.activity.remaining' | 'creation.activity.sprint' | 'creation.activity.sprintAdded' | 'creation.activity.sprintDeleted' | 'creation.activity.sprintNet' | 'creation.activity.sprintRevision' | 'creation.activity.sprintSaved' | 'creation.activity.identity' | 'creation.activity.recent' | 'creation.activity.empty' | 'creation.foreshadow.title' | 'creation.foreshadow.empty' | 'creation.foreshadow.due' | 'creation.foreshadow.overdue' | 'creation.foreshadow.toPlant' | 'creation.foreshadow.open' | 'creation.foreshadow.close' | 'creation.foreshadow.plant' | 'creation.foreshadow.reveal' | 'creation.foreshadow.status' | 'creation.foreshadow.weight' | 'creation.foreshadow.layer' | 'creation.foreshadow.source' | 'creation.contextEmpty' | 'creation.context.packet' | 'creation.context.current' | 'creation.context.stale' | 'creation.context.previousStale' | 'creation.context.requestBudget' | 'creation.context.sessionBudget' | 'creation.context.outputReserve' | 'creation.context.actualUsage' | 'creation.context.reported' | 'creation.context.unavailable' | 'creation.context.sessionSeparate' | 'creation.context.retrieval' | 'creation.context.sources' | 'creation.context.protected' | 'creation.context.noSnippet' | 'creation.context.reason' | 'creation.context.missing' | 'creation.context.excluded' | 'creation.context.fullText' | 'creation.reviewEmpty' | 'creation.review.stale' | 'creation.review.casUnavailable' | 'creation.review.refreshRequired' | 'creation.review.closure' | 'creation.review.closureProposal' | 'creation.review.closureRevision' | 'creation.review.outcome.resolved' | 'creation.review.outcome.retained' | 'creation.review.outcome.regressed' | 'creation.review.selectionSummary' | 'creation.review.instruction' | 'creation.review.createRevision' | 'creation.review.rereview' | 'creation.review.revisionStarted' | 'creation.review.rereviewStarted' | 'creation.revisionsEmpty' | 'creation.history.title' | 'creation.history.snapshot' | 'creation.history.snapshotName' | 'creation.history.snapshotCreated' | 'creation.history.empty' | 'creation.history.units' | 'creation.history.loading' | 'creation.history.compare' | 'creation.history.restorePreview' | 'creation.history.closePreview' | 'creation.history.noChanges' | 'creation.history.restore' | 'creation.history.restoreConfirm' | 'creation.history.restored' | 'creation.history.previewFailed' | 'creation.history.reason.autosave' | 'creation.history.reason.manual' | 'creation.history.reason.aiRevision' | 'creation.history.reason.fullRewrite' | 'creation.history.reason.restore' | 'creation.proposals.title' | 'creation.proposals.noRationale' | 'creation.proposals.range' | 'creation.proposals.evidence' | 'creation.proposals.reviewRevision' | 'creation.proposals.sourceRevision' | 'creation.proposals.noHunks' | 'creation.proposals.originalCandidate' | 'creation.proposals.reject' | 'creation.proposals.regenerate' | 'creation.proposals.applySelected' | 'creation.proposals.appliedNeedsReview' | 'creation.proposals.sourceConflict' | 'creation.selection.title' | 'creation.selection.expand' | 'creation.selection.compress' | 'creation.selection.naturalize' | 'creation.selection.reviewFix' | 'creation.selection.working' | 'creation.selection.staged' | 'creation.selection.empty' | 'creation.selection.saveRequired' | 'creation.selection.reviewRequired' | 'creation.selection.noIssues' | 'creation.selection.annotate' | 'creation.notes.title' | 'creation.notes.note' | 'creation.notes.color' | 'creation.notes.submit' | 'creation.notes.cancel' | 'creation.notes.working' | 'creation.notes.saved' | 'creation.notes.empty' | 'creation.notes.rangeLost' | 'creation.notes.saveRequired' | 'creation.notes.locate' | 'creation.notes.resolve' | 'creation.notes.resolved' | 'creation.notes.attached' | 'creation.notes.relocated' | 'creation.notes.detached' | 'creation.notes.quote' | 'creation.notes.color.amber' | 'creation.notes.color.rose' | 'creation.notes.color.sky' | 'creation.notes.color.lime' | 'creation.notes.color.violet' | 'creation.marker.insert' | 'creation.marker.title' | 'creation.marker.purpose' | 'creation.marker.state' | 'creation.marker.relation' | 'creation.marker.field' | 'creation.marker.oldState' | 'creation.marker.newState' | 'creation.marker.source' | 'creation.marker.target' | 'creation.marker.description' | 'creation.marker.pickCharacter' | 'creation.marker.insertNow' | 'creation.marker.cancel' | 'creation.marker.empty' | 'creation.marker.newline' | 'creation.marker.reserved' | 'creation.marker.needId' | 'creation.mentions.title' | 'creation.mentions.mention' | 'creation.mentions.card' | 'creation.mentions.aliases' | 'creation.mentions.close' | 'creation.mentions.ambiguous' | 'creation.mentions.choose' | 'creation.mentions.conflict' | 'creation.mentions.noSummary' | 'creation.issues' | 'creation.changedElsewhere' | 'creation.conflict' | 'creation.reload' | 'creation.overwrite' | 'creation.discardConfirm' | 'creation.overwriteConfirm' | 'creation.closePanel' | 'creation.draft.available' | 'creation.draft.conflict' | 'creation.draft.updated' | 'creation.draft.preview' | 'creation.draft.restore' | 'creation.draft.dismiss' | 'creation.draft.unavailable' | 'creation.status.idle' | 'creation.status.loading' | 'creation.status.saved' | 'creation.status.dirty' | 'creation.status.saving' | 'creation.status.conflict' | 'creation.status.offline' | 'operations.transfer' | 'operations.transferHint' | 'operations.project' | 'operations.create.new' | 'operations.create.id' | 'operations.create.title' | 'operations.create.submit' | 'operations.create.done' | 'operations.create.failed' | 'operations.create.pickHint' | 'operations.init.hint' | 'operations.init.submit' | 'operations.cancel' | 'workspace.unbound' | 'workspace.notInitialized' | 'workspace.bind.hint' | 'workspace.bind.pick' | 'workspace.bind.failed' | 'operations.create.titleHint' | 'tool.family.status' | 'tool.family.context' | 'tool.family.manuscript' | 'tool.family.revision' | 'tool.family.task' | 'tool.family.search' | 'tool.family.asset' | 'tool.family.outline' | 'tool.running' | 'tool.failed' | 'tool.succeeded' | 'tool.openChapter' | 'turn.changed' | 'turn.partial' | 'turn.failed' | 'turn.refreshFailed' | 'turn.history' | 'turn.proposed' | 'turn.rejected' | 'turn.entityChanges' | 'turn.before' | 'turn.after' | 'turn.missing' | 'turn.truncated' | 'turn.sourceRevision' | 'turn.resultRevision' | 'turn.committed' | 'turn.trace' | 'turn.modelCalls' | 'turn.days' | 'turn.accept' | 'turn.reject' | 'turn.retry' | 'turn.undo' | 'turn.applied' | 'turn.retried' | 'turn.undone' | 'resolving' | 'loading' | 'unreachable' | 'retry' | 'refresh' | 'openExternal' | 'outline.empty' | 'outline.drafted' | 'outline.planned' | 'outline.draftedCount' | 'outline.addChild' | 'outline.addAfter' | 'outline.addVolume' | 'outline.expandAll' | 'outline.collapseAll' | 'outline.del' | 'outline.confirmDelete' | 'outline.newTitlePlaceholder' | 'outline.opConflict' | 'outline.opFailed' | 'outline.summaryEmpty' | 'tools.title' | 'tools.export' | 'tools.export.done' | 'tools.export.failed' | 'tools.export.purpose' | 'tools.export.purpose.backup' | 'tools.export.purpose.delivery' | 'tools.export.format' | 'tools.export.preflight' | 'tools.export.loading' | 'tools.export.unavailable' | 'tools.export.refresh' | 'tools.export.revision' | 'tools.export.ready' | 'tools.export.blocked' | 'tools.export.download' | 'tools.export.order' | 'tools.export.orderEmpty' | 'tools.export.units' | 'tools.export.structure' | 'tools.export.structure.duplicates' | 'tools.export.structure.missing' | 'tools.export.structure.empty' | 'tools.export.structure.unreadable' | 'tools.export.clear' | 'tools.export.writingUnits' | 'tools.export.total' | 'tools.export.bookTarget' | 'tools.export.chapterTarget' | 'tools.export.completion' | 'tools.metadata.edit' | 'tools.metadata.save' | 'tools.metadata.cancel' | 'tools.metadata.hint' | 'tools.export.metadata' | 'tools.export.metadata.title' | 'tools.export.metadata.author' | 'tools.export.metadata.language' | 'tools.export.reviews' | 'tools.export.reviews.missing' | 'tools.export.reviews.current' | 'tools.export.reviews.stale' | 'tools.export.reviews.approved' | 'tools.export.reviews.notApproved' | 'tools.export.acceptance' | 'tools.export.acceptance.blocking' | 'tools.export.acceptance.blockingState' | 'tools.export.acceptance.needsReview' | 'tools.export.status' | 'tools.export.blockers' | 'tools.export.warnings' | 'tools.export.none' | 'tools.export.stale' | 'tools.sync' | 'tools.sync.done' | 'tools.sync.failed' | 'tools.import' | 'tools.import.empty' | 'tools.import.failed' | 'tools.import.done' | 'tools.import.choose' | 'tools.import.noFile' | 'tools.import.start' | 'tools.import.startAuto' | 'tools.import.preview' | 'tools.import.plan' | 'tools.import.conflicts' | 'tools.import.force' | 'tools.import.confirm' | 'tools.import.workspace.title' | 'tools.import.workspace.ownHint' | 'tools.import.workspace.operations' | 'tools.import.workspace.empty' | 'tools.import.workspace.new' | 'tools.import.workspace.file' | 'tools.import.workspace.arc' | 'tools.import.workspace.prepare' | 'tools.import.workspace.prepared' | 'tools.import.workspace.select' | 'tools.import.workspace.chapters' | 'tools.import.workspace.structure' | 'tools.import.workspace.chapterId' | 'tools.import.workspace.chapterTitle' | 'tools.import.workspace.chapterContent' | 'tools.import.workspace.moveUp' | 'tools.import.workspace.moveDown' | 'tools.import.workspace.remove' | 'tools.import.workspace.addChapter' | 'tools.import.workspace.newChapter' | 'tools.import.workspace.saveStructure' | 'tools.import.workspace.structureSaved' | 'tools.import.workspace.confirmStructure' | 'tools.import.workspace.confirmPrompt' | 'tools.import.workspace.confirmed' | 'tools.import.workspace.run' | 'tools.import.workspace.resume' | 'tools.import.workspace.taskStarted' | 'tools.import.workspace.discard' | 'tools.import.workspace.discardPrompt' | 'tools.import.workspace.discarded' | 'tools.import.workspace.recoverable' | 'tools.import.workspace.notRecoverable' | 'tools.import.stage.snapshot' | 'tools.import.stage.split' | 'tools.import.stage.structure_confirmed' | 'tools.import.stage.published' | 'tools.import.stage.acceptance' | 'tools.import.stage.reconcile' | 'tools.import.stage.synthesis' | 'tools.import.stage.complete' | 'tools.archive.title' | 'tools.archive.hint' | 'tools.archive.failed' | 'tools.archive.preflight' | 'tools.archive.create' | 'tools.archive.created' | 'tools.archive.list' | 'tools.archive.empty' | 'tools.archive.download' | 'tools.archive.downloaded' | 'tools.archive.files' | 'tools.archive.size' | 'tools.archive.categories' | 'tools.archive.includes' | 'tools.archive.excludes' | 'tools.archive.missing' | 'tools.archive.references' | 'tools.archive.referencePlan' | 'tools.archive.restore' | 'tools.archive.targetRoot' | 'tools.archive.pickTarget' | 'tools.archive.targetNovelId' | 'tools.archive.referencePolicy' | 'tools.archive.preserveRelative' | 'tools.archive.rewriteNovelId' | 'tools.archive.previewRestore' | 'tools.archive.restoreReady' | 'tools.archive.restoreBlocked' | 'tools.archive.conflicts' | 'tools.archive.pathRewrites' | 'tools.archive.rewrittenFiles' | 'tools.archive.rewrittenReferences' | 'tools.archive.preservedReferences' | 'tools.archive.referenceWarnings' | 'tools.archive.referenceConflicts' | 'tools.archive.tasksArchived' | 'tools.archive.autoResume' | 'tools.archive.noAutoResume' | 'tools.archive.confirmRestore' | 'tools.archive.restoreConfirm' | 'tools.archive.restoreStarted' | 'tasks.cancel' | 'tasks.cancel.title' | 'tasks.cancel.confirm' | 'tasks.cancel.done' | 'tasks.cancel.failed' | 'tasks.retry' | 'tasks.retry.title' | 'tasks.retry.notRecoverable' | 'tasks.retry.done' | 'tasks.retry.failed' | 'tasks.summary.total' | 'tasks.summary.updated' | 'tasks.filter.type' | 'tasks.filter.typeAll' | 'tasks.filter.chapter' | 'tasks.filter.keyword' | 'tasks.sort.newest' | 'tasks.sort.oldest' | 'tasks.sort.toggle' | 'tasks.progress.unknown' | 'tasks.phase.unknown' | 'tasks.confirm' | 'tasks.confirm.title' | 'tasks.confirm.done' | 'tasks.confirm.failed' | 'tasks.cancel.armYes' | 'tasks.cancel.armNo' | 'tasks.list' | 'tasks.detail.open' | 'tasks.detail.close' | 'tasks.detail.copyId' | 'tasks.detail.copied' | 'tasks.detail.events' | 'tasks.detail.eventsLoading' | 'tasks.detail.eventsEmpty' | 'tasks.detail.eventsFailed' | 'tasks.field.id' | 'tasks.field.type' | 'tasks.field.status' | 'tasks.field.phase' | 'tasks.field.chapter' | 'tasks.field.progress' | 'tasks.field.attempt' | 'tasks.field.created' | 'tasks.field.started' | 'tasks.field.updated' | 'tasks.field.completed' | 'tasks.field.summary' | 'tasks.field.resultRef' | 'tasks.field.failedStage' | 'tasks.field.errorCode' | 'tasks.field.recoverable' | 'tasks.field.yes' | 'tasks.field.no' | 'tasks.failure.cancelled' | 'tasks.failure.recoverable' | 'tasks.failure.provider' | 'tasks.failure.input' | 'tasks.failure.system' | 'tasks.jump.benchmark' | 'tasks.jump.research' | 'tasks.jump.chapter' | 'tasks.jump.review' | 'tasks.jump.unavailable' | 'tasks.jump.chapterHint' | 'tasks.jump.reviewHint' | 'tasks.jump.chapterMissing' | 'research.launch' | 'research.launch.placeholder' | 'research.launch.submit' | 'research.launch.submitting' | 'research.launch.submitted' | 'research.launch.failed' | 'research.launch.hint' | 'tasks.result.toggle' | 'tasks.result.score' | 'tasks.result.issues' | 'search.preview.back' | 'search.preview.openCreation' | 'search.preview.jumpReady' | 'search.preview.identityMismatch' | 'search.preview.locatorCurrent' | 'search.preview.locatorStale' | 'search.preview.locatorUnverified' | 'search.preview.revisionUnavailable' | 'search.change.title' | 'search.change.serverOwned' | 'search.change.unavailable' | 'search.change.currentLine' | 'search.change.replacement' | 'search.change.preview' | 'search.change.previewing' | 'search.change.sourceRevision' | 'search.change.resultRevision' | 'search.change.reject' | 'search.change.confirmApply' | 'search.change.applying' | 'search.change.refreshRequired' | 'search.change.invalidApply' | 'search.change.invalidReject' | 'search.change.applied' | 'search.change.rejected' | 'search.change.refresh' | 'assets.empty' | 'assets.other' | 'assets.stages' | 'assets.aliases' | 'assets.segment.characters' | 'assets.segment.world' | 'assets.segment.progression' | 'assets.segment.references' | 'assets.segment.core' | 'assets.segment.empty' | 'assets.references.empty' | 'assets.core.empty' | 'assets.detail.loading' | 'assets.draft.restored' | 'assets.draft.unsaved' | 'assets.draft.conflict' | 'assets.detail.relations' | 'assets.detail.index' | 'assets.list.detail_refs' | 'assets.list.taboos' | 'assets.edit.linesHint' | 'assets.relation.confirmed' | 'assets.relation.registered' | 'assets.relation.incoming' | 'assets.searchPlaceholder' | 'assets.edit.open' | 'assets.edit.name' | 'assets.edit.summary' | 'assets.edit.tags' | 'assets.edit.listHint' | 'assets.edit.save' | 'assets.edit.saving' | 'assets.edit.cancel' | 'assets.edit.conflict' | 'assets.edit.conflictRefresh' | 'assets.edit.addRelation' | 'assets.edit.removeRelation' | 'assets.edit.relationTarget' | 'assets.edit.relationNote' | 'assets.edit.derivedRelations' | 'assets.edit.body' | 'assets.edit.liveLoading' | 'assets.edit.optional' | 'assets.field.tier' | 'assets.field.personality' | 'assets.field.goal' | 'assets.field.fear' | 'assets.field.appearance' | 'assets.field.voice' | 'assets.field.current_state' | 'assets.field.organization' | 'assets.field.progression_system' | 'assets.field.progression_stage' | 'assets.field.status' | 'assets.field.kind' | 'assets.field.type' | 'assets.field.subtype' | 'assets.field.state_updated_at' | 'assets.field.role' | 'assets.edit.liveFailed' | 'assets.selectHint' | 'assets.create.open' | 'assets.create.submit' | 'assets.create.idHint' | 'assets.create.tier' | 'assets.create.type' | 'assets.create.progressionKind' | 'assets.create.stages' | 'assets.create.stageId' | 'assets.create.stageName' | 'assets.create.addStage' | 'tasks.empty' | 'tasks.filter.all' | 'tasks.attempt' | 'tasks.status.pending' | 'tasks.status.running' | 'tasks.status.awaiting_confirmation' | 'tasks.status.completed' | 'tasks.status.failed' | 'tasks.status.cancelled' | 'tasks.status.interrupted' | 'tasks.phase.queued' | 'tasks.phase.reading' | 'tasks.phase.preparing' | 'tasks.phase.model' | 'tasks.phase.validating' | 'tasks.phase.committing' | 'tasks.phase.complete' | 'tasks.type.chapter_write' | 'tasks.type.chapter_review' | 'tasks.type.continuous_write' | 'tasks.type.revision' | 'tasks.type.source_operation' | 'tasks.type.reference_operation' | 'tasks.type.manuscript_import' | 'tasks.type.project_restore' | 'tasks.type.research' | 'tasks.type.model_benchmark' | 'graph.foreshadowing' | 'graph.relationships' | 'graph.nodes' | 'graph.connections' | 'graph.relayout' | 'graph.weight' | 'graph.target' | 'graph.truncated' | 'graph.validation.errors' | 'graph.empty.foreshadowing' | 'graph.empty.relationships' | 'graph.entityType' | 'graph.entityStatus' | 'graph.search' | 'graph.connectedOnly' | 'graph.neighbors' | 'graph.edgeType' | 'graph.origin' | 'graph.source' | 'graph.confirmed' | 'dag.quality' | 'dag.coverage' | 'dag.gate' | 'dag.delivery' | 'dag.current' | 'dag.stale' | 'dag.toRevision' | 'dag.toRevisionDone' | 'dag.toRevisionFailed' | 'graph.unresolved' | 'graph.kind.character' | 'graph.kind.faction' | 'graph.kind.place' | 'graph.kind.concept' | 'graph.kind.other' | 'graph.truth' | 'graph.truth.currentState' | 'graph.truth.ledger' | 'graph.truth.relationships' | 'graph.workflows' | 'graph.workflow.currentStage' | 'graph.workflow.executionHint' | 'graph.workflow.confirmHint' | 'graph.empty.truth' | 'graph.empty.truthDoc' | 'graph.empty.workflows' | 'graph.reviewDag' | 'graph.reviewFramework' | 'graph.reviewDomains' | 'graph.reviewChecks' | 'graph.reviewCriteria' | 'graph.deliveryDag' | 'graph.filter.all' | 'graph.filter.anomaly' | 'graph.filter.blocker' | 'graph.expandChecks' | 'graph.collapseChecks' | 'graph.empty.dag' | 'benchmark.title' | 'benchmark.taskType' | 'benchmark.executionEvidence' | 'benchmark.evidence' | 'benchmark.status.skipped' | 'benchmark.status.stale' | 'benchmark.task.chapter' | 'benchmark.task.outline' | 'benchmark.task.chapterHint' | 'benchmark.task.outlineHint' | 'benchmark.planner' | 'benchmark.nextChapter' | 'benchmark.chapterWritten' | 'benchmark.chapterPlanned' | 'benchmark.chapterUnavailable' | 'benchmark.customChapter' | 'benchmark.chapterId' | 'benchmark.outlineOrigin' | 'benchmark.continueOutline' | 'benchmark.customOutlineStart' | 'benchmark.outlineStart' | 'benchmark.outlineCount' | 'benchmark.rangeFrom' | 'benchmark.rangeTo' | 'benchmark.chapterUnit' | 'benchmark.invalidRange' | 'benchmark.outlineRangeHint' | 'benchmark.earliestOutlineStart' | 'benchmark.invalidChapter' | 'benchmark.historicalChapterHint' | 'benchmark.autoDag' | 'benchmark.executedDag' | 'benchmark.dagAutomatic' | 'benchmark.afterStage' | 'benchmark.reviewScope' | 'benchmark.isolatedHint' | 'benchmark.pipelineUnavailable' | 'benchmark.actualChapters' | 'benchmark.pipelineFinished' | 'benchmark.pipelineStatus' | 'benchmark.reviewIncomplete' | 'benchmark.partialScore' | 'benchmark.reviewIncompleteHint' | 'benchmark.completeReviews' | 'benchmark.reportedCoverage' | 'benchmark.coveragePending' | 'benchmark.factsPendingTitle' | 'benchmark.factsPendingHint' | 'benchmark.selectModels' | 'benchmark.description' | 'benchmark.configure' | 'benchmark.modelHint' | 'benchmark.advanced' | 'benchmark.history' | 'benchmark.results' | 'benchmark.noProfiles' | 'benchmark.chooseModels' | 'benchmark.workload' | 'benchmark.submitting' | 'benchmark.noCandidates' | 'benchmark.noEvaluations' | 'benchmark.plannedCandidates' | 'benchmark.plannedEvaluations' | 'benchmark.task' | 'benchmark.mode' | 'benchmark.mode.framework' | 'benchmark.mode.creative' | 'benchmark.mode.unknown' | 'benchmark.reviewer' | 'benchmark.chapter' | 'benchmark.repeats' | 'benchmark.words' | 'benchmark.concurrency' | 'benchmark.run' | 'benchmark.empty' | 'benchmark.select' | 'benchmark.averageScore' | 'benchmark.output' | 'benchmark.candidate' | 'benchmark.candidates' | 'benchmark.evaluations' | 'benchmark.writer' | 'benchmark.path' | 'benchmark.status' | 'benchmark.actualWords' | 'benchmark.finishReason' | 'benchmark.error' | 'benchmark.coverage' | 'benchmark.gate' | 'benchmark.delivery' | 'benchmark.productionGate' | 'benchmark.productionGateMissing' | 'benchmark.domains' | 'benchmark.latency' | 'benchmark.usage' | 'benchmark.cost' | 'benchmark.inputTokens' | 'benchmark.outputTokens' | 'benchmark.reasoningTokens' | 'benchmark.totalTokens' | 'benchmark.actualCost' | 'benchmark.costCoverage' | 'benchmark.effectiveRate' | 'benchmark.runs' | 'benchmark.sameInputGroup' | 'benchmark.comparisonIncomplete' | 'benchmark.inputProvenance' | 'benchmark.runPhases' | 'benchmark.phase.created' | 'benchmark.phase.started' | 'benchmark.phase.completed' | 'benchmark.contextHash' | 'benchmark.comparisonKey' | 'benchmark.promptVersion' | 'benchmark.rubricVersion' | 'benchmark.blindReview' | 'benchmark.contextStrategy' | 'benchmark.manifestVersion' | 'benchmark.tokenEstimator' | 'benchmark.packetRevision' | 'benchmark.sourceRevision' | 'benchmark.estimatedTokens' | 'benchmark.characters' | 'benchmark.contextSources' | 'benchmark.sourcePresent' | 'benchmark.sourceMissing' | 'benchmark.responseIdentity' | 'models.title' | 'models.list' | 'models.editor' | 'models.new' | 'models.empty' | 'models.id' | 'models.label' | 'models.provider' | 'models.protocol.openai' | 'models.protocol.anthropic' | 'models.modelId' | 'models.baseUrl' | 'models.apiFormat' | 'models.context' | 'models.output' | 'models.credential' | 'models.embeddingProvider' | 'models.embeddingProviderOpenai' | 'models.embeddingProviderLocal' | 'models.embeddingProviderUnknown' | 'models.embeddingProviderOpenaiHint' | 'models.embeddingProviderLocalHint' | 'models.embeddingLocalPreset' | 'models.vectorDimensionsLocalHint' | 'models.embeddingModel' | 'models.embeddingCredential' | 'models.credentialHint' | 'models.authSource' | 'models.authApiKey' | 'models.authConsole' | 'models.consoleHint' | 'models.goWorkspace' | 'models.goWorkspaceHint' | 'models.remember' | 'models.save' | 'models.chatTest' | 'models.embeddingTest' | 'models.vectorParameters' | 'models.vectorDimension' | 'models.vectorMaxTokens' | 'models.vectorCount' | 'models.vectorDimensionsHint' | 'models.test.invalidResponseHint' | 'models.test.unsupportedHint' | 'models.delete' | 'models.delete.confirm' | 'models.delete.blocked' | 'models.delete.wouldFail' | 'models.test.untested' | 'models.test.ok' | 'models.test.failed' | 'models.dependencies' | 'models.dependenciesHint' | 'models.fallback' | 'models.chooseFallback' | 'models.routes' | 'models.routesSave' | 'models.saved' | 'models.deleted' | 'models.chatOk' | 'models.embeddingOk' | 'models.configured' | 'models.missing' | 'models.routesSaved' | 'models.group.basic' | 'models.group.connection' | 'models.group.generation' | 'models.group.embedding' | 'models.group.credentials' | 'models.group.routeUsage' | 'models.temperature' | 'models.timeout' | 'models.embeddingBaseUrl' | 'models.validation.required' | 'models.validation.positive' | 'models.validation.temperature' | 'models.validation.embeddingProvider' | 'models.unsavedChanges' | 'models.unsavedDiscard' | 'models.unsavedKeep' | 'models.test.loading' | 'models.usedByRoutes' | 'models.noRoutes' | 'models.delete.resultingRoutes' | 'models.embeddingEmpty' | 'models.embeddingConfigured' | 'models.embeddingMissing' | 'models.active' | 'models.inactive' | 'models.route.goethe' | 'models.route.dante' | 'models.route.chapter_write' | 'models.route.review' | 'models.route.source_extract' | 'models.route.revision' | 'models.route.search' | 'models.route.research' | 'models.routesImpact' | 'models.routesUnchanged' | 'models.routesUnassigned' | 'models.embedConfigured' | 'models.embedMissing' | 'models.capability.chat' | 'models.capability.embedding' | 'research.reports' | 'research.unavailable' | 'research.empty' | 'research.selectHint' | 'research.report.loading' | 'research.quality' | 'research.language' | 'research.filter.keyword' | 'research.filter.status' | 'research.filter.sources' | 'research.filter.all' | 'research.status.succeeded' | 'research.status.failed' | 'research.status.needsReview' | 'research.status.unknown' | 'research.sourcesAvailable' | 'research.sourcesUnavailable' | 'research.sourcesEmpty' | 'research.sources' | 'research.sourceCheck' | 'research.source.cited' | 'research.source.uncited' | 'research.exportMarkdown' | 'research.referenceOnly' | 'research.prompt' | 'research.taskId' | 'research.episodeId' | 'research.model' | 'research.searchProvider' | 'research.createdAt' | 'research.completedAt' | 'research.latency' | 'research.wordCount' | 'research.tokens' | 'research.cost' | 'research.sourcesStatus' | 'research.metrics' | 'search.placeholder' | 'search.hint' | 'search.empty' | 'search.indexed' | 'search.timeout' | 'search.scope.all' | 'search.scope.outline' | 'search.scope.core' | 'search.scope.characters' | 'search.scope.settings' | 'search.scope.continuity' | 'search.scope.chapters' | 'search.scope.sources' | 'assets.references' | 'reference.intent.reference' | 'reference.intent.continuation' | 'reference.intent.canon' | 'reference.intent.migration' | 'reference.structure.awaiting_confirmation' | 'reference.structure.confirmed' | 'reference.analysis.complete' | 'reference.analysis.pending' | 'reference.chars' | 'reference.content.loading' | 'reference.content.full' | 'review.running' | 'review.passed' | 'review.failed' | 'review.score' | 'review.issues' | 'review.suggestion' | 'review.quote' | 'review.dimension' | 'review.coverage' | 'review.gate' | 'review.delivery' | 'review.execution' | 'review.priority' | 'review.severity.critical' | 'review.severity.warning' | 'review.severity.info' | 'review.severity.blocker' | 'review.severity.high' | 'review.severity.medium' | 'review.severity.low' | 'review.priority.blocker' | 'review.priority.high' | 'review.priority.medium' | 'review.priority.low' | 'review.status.pass' | 'review.status.blocked' | 'review.status.inconclusive' | 'review.status.revise' | 'review.status.completed' | 'review.status.partial' | 'review.status.failed' | 'review.status.stale' | 'review.status.unknown' | 'review.rawTitle';
|
|
6
6
|
declare module '@deepseek-ai/dsh-client-ui-slots' {
|
|
7
7
|
interface LocaleNamespaceMap {
|
|
8
8
|
/** The 稿件/大纲/资产 view tab labels and panel state strings. */
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type QuoteAnchor } from './manuscript-selection.ts';
|
|
2
|
+
import { type EditorSerialization } from './selection-coordinates.ts';
|
|
2
3
|
export declare const ANNOTATION_COLORS: readonly ["amber", "rose", "sky", "lime", "violet"];
|
|
3
4
|
export type AnnotationColor = (typeof ANNOTATION_COLORS)[number];
|
|
4
5
|
export declare const DEFAULT_ANNOTATION_COLOR: AnnotationColor;
|
|
@@ -30,7 +31,7 @@ export declare function unsavedAnnotationGuard(dirty: boolean): 'ok' | 'save-fir
|
|
|
30
31
|
export declare function annotationLocateLabel(anchor: QuoteAnchor | {
|
|
31
32
|
state: AnnotationAnchorState;
|
|
32
33
|
}): string;
|
|
33
|
-
export declare function liveAnnotationAnchor(content: string, item: ManuscriptAnnotation): QuoteAnchor;
|
|
34
|
+
export declare function liveAnnotationAnchor(content: string, item: ManuscriptAnnotation, source?: string, serialization?: EditorSerialization): QuoteAnchor;
|
|
34
35
|
export declare function revalidateAnnotationRange(content: string, selection: {
|
|
35
36
|
start: number;
|
|
36
37
|
end: number;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { AnnotationColor, ManuscriptAnnotation } from './manuscript-annotations.ts';
|
|
2
2
|
import type { MarkerSpan } from './manuscript-markers.ts';
|
|
3
|
+
import type { EditorSerialization } from './selection-coordinates.ts';
|
|
3
4
|
export type OverlayKind = 'note' | 'state' | 'relation' | 'invalid';
|
|
4
5
|
export type OverlayBand = {
|
|
5
6
|
kind: OverlayKind;
|
|
@@ -11,7 +12,7 @@ export type OverlayBand = {
|
|
|
11
12
|
title: string;
|
|
12
13
|
};
|
|
13
14
|
/** Display-only bands. Never written back into markdown. */
|
|
14
|
-
export declare function overlayBands(content: string, notes: readonly ManuscriptAnnotation[], markers: readonly MarkerSpan[]): OverlayBand[];
|
|
15
|
+
export declare function overlayBands(content: string, notes: readonly ManuscriptAnnotation[], markers: readonly MarkerSpan[], source?: string, serialization?: EditorSerialization): OverlayBand[];
|
|
15
16
|
export declare const OVERLAY_THEME: {
|
|
16
17
|
readonly light: {
|
|
17
18
|
readonly note: {
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
import { type EditorSerialization } from './selection-coordinates.ts';
|
|
2
|
+
/** Editor UTF-16 positions, plus the exact editor value which produced them. */
|
|
2
3
|
export type ManuscriptSelection = {
|
|
3
4
|
start: number;
|
|
4
5
|
end: number;
|
|
5
6
|
text: string;
|
|
7
|
+
source: string;
|
|
8
|
+
serialization?: EditorSerialization | undefined;
|
|
6
9
|
};
|
|
7
10
|
export type SelectionPolishKind = 'expand' | 'compress' | 'naturalize' | 'reviewFix';
|
|
8
11
|
export declare const SELECTION_POLISH_ACTIONS: readonly {
|
|
@@ -17,7 +20,12 @@ export declare function shouldClearManuscriptSelection(options: {
|
|
|
17
20
|
selectionInsideEditor: boolean;
|
|
18
21
|
preserveNode: EventTarget | Node | null;
|
|
19
22
|
}): boolean;
|
|
20
|
-
export declare function manuscriptSelectionFromRange(value: string, start: number, end: number): ManuscriptSelection | null;
|
|
23
|
+
export declare function manuscriptSelectionFromRange(value: string, start: number, end: number, serialization?: EditorSerialization): ManuscriptSelection | null;
|
|
24
|
+
export declare function mapManuscriptSelection(source: string, selection: ManuscriptSelection): {
|
|
25
|
+
start: number;
|
|
26
|
+
end: number;
|
|
27
|
+
text: string;
|
|
28
|
+
} | null;
|
|
21
29
|
/** Count non-overlapping occurrences of needle in haystack. */
|
|
22
30
|
export declare function countOccurrences(haystack: string, needle: string): number;
|
|
23
31
|
/** Zero-based nth occurrence start, or -1. */
|
|
@@ -26,7 +34,7 @@ export declare function nthIndexOf(haystack: string, needle: string, occurrence:
|
|
|
26
34
|
* Map a live editor selection onto markdown offsets.
|
|
27
35
|
* Duplicate quotes without an occurrence index do not bind the first hit.
|
|
28
36
|
*/
|
|
29
|
-
export declare function locateSelectedMarkdown(value: string, selected: string, occurrence?: number): ManuscriptSelection | null;
|
|
37
|
+
export declare function locateSelectedMarkdown(value: string, selected: string, occurrence?: number, serialization?: EditorSerialization): ManuscriptSelection | null;
|
|
30
38
|
export type QuoteAnchor = {
|
|
31
39
|
state: 'attached' | 'relocated';
|
|
32
40
|
start: number;
|
|
@@ -38,20 +46,25 @@ export type QuoteAnchor = {
|
|
|
38
46
|
/** Bind a stored quote to current markdown using hints, then unique relocate. */
|
|
39
47
|
export declare function locateQuote(content: string, quote: string, startHint: number, endHint: number): QuoteAnchor;
|
|
40
48
|
/** Review issues whose evidence sits inside the current manuscript selection. */
|
|
41
|
-
export declare function reviewIssuesForSelection(issues: readonly unknown[], selection:
|
|
49
|
+
export declare function reviewIssuesForSelection(issues: readonly unknown[], selection: {
|
|
50
|
+
start: number;
|
|
51
|
+
end: number;
|
|
52
|
+
text: string;
|
|
53
|
+
}): string[];
|
|
42
54
|
export type SelectionPolishRequest = {
|
|
43
55
|
ok: true;
|
|
44
56
|
path: '/revisions/selection' | '/revisions/from-review';
|
|
45
57
|
body: Record<string, unknown>;
|
|
46
58
|
} | {
|
|
47
59
|
ok: false;
|
|
48
|
-
reason: 'empty' | 'no-review' | 'no-issues';
|
|
60
|
+
reason: 'empty' | 'no-review' | 'no-issues' | 'source-changed';
|
|
49
61
|
};
|
|
50
62
|
/** Map one author action onto the existing Studio revision-create routes. */
|
|
51
63
|
export declare function selectionPolishRequest(input: {
|
|
52
64
|
kind: SelectionPolishKind;
|
|
53
65
|
chapterId: string;
|
|
54
66
|
selection: ManuscriptSelection;
|
|
67
|
+
documentContent: string;
|
|
55
68
|
documentRevision: string;
|
|
56
69
|
reviewRevision: string;
|
|
57
70
|
reviewFresh: boolean;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Exact mapping between an editor's UTF-16 view and the saved source's code points. */
|
|
2
|
+
export type SourceRange = {
|
|
3
|
+
start: number;
|
|
4
|
+
end: number;
|
|
5
|
+
text: string;
|
|
6
|
+
};
|
|
7
|
+
/** A pair captured from the editor's initial serialization, before author input. */
|
|
8
|
+
export type EditorSerialization = {
|
|
9
|
+
source: string;
|
|
10
|
+
value: string;
|
|
11
|
+
};
|
|
12
|
+
/** Exact content and witnessed newline serialization; never guess among quotes. */
|
|
13
|
+
export declare function mapEditorRange(source: string, editor: string, start: number, end: number, serialization?: EditorSerialization): SourceRange | null;
|
|
14
|
+
/** Translate stored source code-point hints back into the editor's UTF-16 view. */
|
|
15
|
+
export declare function mapSourceRange(source: string, editor: string, start: number, end: number, serialization?: EditorSerialization): SourceRange | null;
|
package/preset-definition.mjs
CHANGED
|
@@ -13,7 +13,7 @@ export const stablePresetId = 'openwrite'
|
|
|
13
13
|
|
|
14
14
|
// These released identities are durable session references, even after their
|
|
15
15
|
// package-managed directories have been removed by older plugin versions.
|
|
16
|
-
export const legacyPresetIds = Array.from({ length:
|
|
16
|
+
export const legacyPresetIds = Array.from({ length: 28 }, (_, i) => `openwrite-0-2-${i + 1}`)
|
|
17
17
|
|
|
18
18
|
export async function presetDefinition(version, modern = false) {
|
|
19
19
|
const baseUrl = new URL('./presets/openwrite/', import.meta.url)
|
|
Binary file
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"dsh": "0.1.2-rc.1",
|
|
4
4
|
"uv_version": "0.11.19",
|
|
5
5
|
"python_version": "3.12.13",
|
|
6
|
-
"core_version": "5.8.
|
|
6
|
+
"core_version": "5.8.20",
|
|
7
7
|
"contract_version": 1,
|
|
8
8
|
"platforms": {
|
|
9
9
|
"darwin-arm64": {
|
|
@@ -56,8 +56,8 @@
|
|
|
56
56
|
}
|
|
57
57
|
},
|
|
58
58
|
"wheel": {
|
|
59
|
-
"file": "openwrite-5.8.
|
|
60
|
-
"sha256": "
|
|
59
|
+
"file": "openwrite-5.8.20-py3-none-any.whl",
|
|
60
|
+
"sha256": "aa1f25f3c615497cd73c3c059fd2acc4e71ba2e936765d02331d1382df4b201a"
|
|
61
61
|
},
|
|
62
62
|
"requirements": {
|
|
63
63
|
"file": "requirements.lock",
|
|
@@ -67,14 +67,15 @@
|
|
|
67
67
|
"core": {
|
|
68
68
|
"repository": "https://github.com/LiPu-jpg/Openwrite",
|
|
69
69
|
"branch": "native-core",
|
|
70
|
-
"commit": "
|
|
70
|
+
"commit": "9611c654e5d77bcb5968105a7adfa8e9b4f9624a"
|
|
71
71
|
},
|
|
72
72
|
"dog": {
|
|
73
73
|
"repository": "https://github.com/Fun10165/dsh-dog",
|
|
74
74
|
"tag": "v1.2.0",
|
|
75
75
|
"commit": "3a442ef4b1a82cc4258a01baf798913c94a99445",
|
|
76
76
|
"patches": [
|
|
77
|
-
"0.2.19: src/host-shims.ts 内置 dshHomePath/defineTool,移除 @deepseek-ai/dsh-home-paths 与 @deepseek-ai/dsh-tools 的运行时导入(#74)"
|
|
77
|
+
"0.2.19: src/host-shims.ts 内置 dshHomePath/defineTool,移除 @deepseek-ai/dsh-home-paths 与 @deepseek-ai/dsh-tools 的运行时导入(#74)",
|
|
78
|
+
"unreleased 0.2.28: Electron Node-mode verifier execution, structured process/output diagnostics, and per-condition DoG guards (#121)"
|
|
78
79
|
]
|
|
79
80
|
},
|
|
80
81
|
"cryptography": {
|
package/release/source.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"repository": "https://github.com/LiPu-jpg/Openwrite",
|
|
3
|
-
"commit": "
|
|
4
|
-
"tree": "
|
|
3
|
+
"commit": "9390c7826024ee78cc91d5a144825a55ca0016e0",
|
|
4
|
+
"tree": "d59236a0d5dd77ce0d960586cd7c59eeaf0b96c9",
|
|
5
5
|
"dirty": false,
|
|
6
6
|
"acquisition": "git-checkout",
|
|
7
|
-
"sourceTreeSha256": "
|
|
7
|
+
"sourceTreeSha256": "b257753216e9ff918bae3ef04487531cb27d186f65d2e0cc613343c4663db1c8",
|
|
8
8
|
"components": [
|
|
9
9
|
{
|
|
10
10
|
"name": "@deepseek-ai/schemastery",
|
package/scripts/safe-upgrade.mjs
CHANGED
|
@@ -1,16 +1,29 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
// Offline profile upgrades retain the previous complete dependency tree until commit.
|
|
3
|
-
import { cp, mkdir, readFile, readdir, rename, writeFile, open, access, readlink, symlink, unlink } from 'node:fs/promises'
|
|
3
|
+
import { cp, mkdir, readFile, readdir, rename, writeFile, open, access, readlink, symlink, unlink, realpath, lstat, rmdir, utimes } from 'node:fs/promises'
|
|
4
4
|
import { spawn, spawnSync } from 'node:child_process'
|
|
5
5
|
import { join, resolve, relative, isAbsolute, dirname, sep } from 'node:path'
|
|
6
6
|
import { randomUUID, createHash } from 'node:crypto'
|
|
7
7
|
import { homedir } from 'node:os'
|
|
8
8
|
import { pathToFileURL } from 'node:url'
|
|
9
|
-
import {
|
|
10
|
-
import yaml from 'js-yaml'
|
|
9
|
+
import { createRequire } from 'node:module'
|
|
11
10
|
|
|
12
11
|
const PROFILE = /^[a-zA-Z0-9_-]+$/
|
|
13
12
|
const digest = bytes => createHash('sha256').update(bytes).digest('hex')
|
|
13
|
+
function upgradeDependencies(home, profile) {
|
|
14
|
+
// Release archives do not contain node_modules. Resolve the same dependencies
|
|
15
|
+
// from the explicitly selected installed profile, without loading its plugin.
|
|
16
|
+
const resolvers = [createRequire(import.meta.url), createRequire(join(profileDirectory(home, profile), 'package.json'))]
|
|
17
|
+
const load = name => {
|
|
18
|
+
for (const require of resolvers) {
|
|
19
|
+
try { return require(name) } catch (error) {
|
|
20
|
+
if (error.code !== 'MODULE_NOT_FOUND') throw error
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
throw new Error(`UPGRADE_DEPENDENCY_MISSING: ${name}; run this tool from an installed OpenWrite package or repair dependencies in the selected profile first`)
|
|
24
|
+
}
|
|
25
|
+
return { acquireLock: load('proper-lockfile').lock, yaml: load('js-yaml') }
|
|
26
|
+
}
|
|
14
27
|
async function exists(path) { try { await access(path); return true } catch (error) { if (error.code === 'ENOENT') return false; throw error } }
|
|
15
28
|
async function save(path, value) {
|
|
16
29
|
const pending = path + '.pending-' + randomUUID()
|
|
@@ -18,7 +31,70 @@ async function save(path, value) {
|
|
|
18
31
|
await rename(pending, path)
|
|
19
32
|
}
|
|
20
33
|
|
|
21
|
-
|
|
34
|
+
// Recovery cannot load dependencies through a profile which is between renames.
|
|
35
|
+
// Use proper-lockfile's same canonical <profiles>.lock directory and fresh mtime
|
|
36
|
+
// protocol, without importing any code from the missing or backup profile.
|
|
37
|
+
export async function acquireRecoveryLock(home) {
|
|
38
|
+
const path = (await realpath(join(resolve(home), 'profiles'))) + '.lock'
|
|
39
|
+
const locked = () => Object.assign(new Error('ELOCKED: another profile operation holds the upgrade lock'), { code: 'ELOCKED' })
|
|
40
|
+
const same = (a, b) => a.dev === b.dev && a.ino === b.ino && a.birthtimeMs === b.birthtimeMs
|
|
41
|
+
let owner
|
|
42
|
+
for (let attempt = 0; attempt < 3; attempt++) {
|
|
43
|
+
try { await mkdir(path, { mode: 0o700 }); owner = await lstat(path); break }
|
|
44
|
+
catch (error) {
|
|
45
|
+
if (error.code !== 'EEXIST') throw error
|
|
46
|
+
let observed
|
|
47
|
+
try { observed = await lstat(path) } catch (cause) { if (cause.code === 'ENOENT') continue; throw cause }
|
|
48
|
+
if (!observed.isDirectory() || Date.now() - observed.mtimeMs <= 30_000) throw locked()
|
|
49
|
+
const current = await lstat(path)
|
|
50
|
+
if (!same(observed, current) || observed.mtimeMs !== current.mtimeMs) throw locked()
|
|
51
|
+
try { await rmdir(path) } catch (cause) { if (cause.code !== 'ENOENT') throw locked() }
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (!owner) throw locked()
|
|
55
|
+
let pending = Promise.resolve(), compromised
|
|
56
|
+
const assertOwned = async () => {
|
|
57
|
+
if (compromised) throw compromised
|
|
58
|
+
const current = await lstat(path)
|
|
59
|
+
if (!same(owner, current)) throw locked()
|
|
60
|
+
}
|
|
61
|
+
const timer = setInterval(() => {
|
|
62
|
+
pending = pending.then(async () => {
|
|
63
|
+
await assertOwned()
|
|
64
|
+
const now = new Date()
|
|
65
|
+
await utimes(path, now, now)
|
|
66
|
+
}).catch(error => { compromised = error })
|
|
67
|
+
}, 1000)
|
|
68
|
+
timer.unref()
|
|
69
|
+
return {
|
|
70
|
+
async assertOwned() { await pending; await assertOwned() },
|
|
71
|
+
async release() {
|
|
72
|
+
clearInterval(timer)
|
|
73
|
+
await pending
|
|
74
|
+
await assertOwned()
|
|
75
|
+
await rmdir(path)
|
|
76
|
+
},
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
async function pinArchive(home, archive) {
|
|
81
|
+
const bytes = await readFile(archive)
|
|
82
|
+
const sha256 = digest(bytes)
|
|
83
|
+
const cache = join(resolve(home), 'openwrite', 'packages')
|
|
84
|
+
await mkdir(cache, { recursive: true, mode: 0o700 })
|
|
85
|
+
const destination = join(cache, sha256 + '.tgz')
|
|
86
|
+
if (await exists(destination) && digest(await readFile(destination)) === sha256) return { path: destination, sha256 }
|
|
87
|
+
const pending = join(cache, '.' + sha256 + '-' + randomUUID() + '.pending')
|
|
88
|
+
try {
|
|
89
|
+
const handle = await open(pending, 'wx', 0o600)
|
|
90
|
+
try { await handle.writeFile(bytes); await handle.sync() } finally { await handle.close() }
|
|
91
|
+
if (digest(await readFile(pending)) !== sha256) throw new Error('PACKAGE_CACHE_CONFLICT: temporary archive verification failed')
|
|
92
|
+
await rename(pending, destination)
|
|
93
|
+
return { path: destination, sha256 }
|
|
94
|
+
} finally { try { await unlink(pending) } catch (error) { if (error.code !== 'ENOENT') throw error } }
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
async function relocateProfileLinks(staging, previous, replacementRoot, yaml) {
|
|
22
98
|
const visit = async directory => {
|
|
23
99
|
for (const entry of await readdir(directory, { withFileTypes: true })) {
|
|
24
100
|
const path = join(directory, entry.name)
|
|
@@ -100,9 +176,13 @@ export async function recoverUpgrade(home, operationId, options = {}) {
|
|
|
100
176
|
const target = profileDirectory(home, operation.profile)
|
|
101
177
|
await (options.assertStopped || assertHostStopped)(home, operation.profile)
|
|
102
178
|
const previous = join(root, 'previous-profile')
|
|
103
|
-
const
|
|
179
|
+
const lease = await acquireRecoveryLock(home)
|
|
104
180
|
try {
|
|
105
181
|
if (!await exists(target) && await exists(previous)) {
|
|
182
|
+
if (!operation.old_manifest_sha256 || digest(await readFile(join(previous, 'package.json'))) !== operation.old_manifest_sha256) {
|
|
183
|
+
throw new Error('PROFILE_CHANGED: backup manifest differs from the approved operation; no profile restored')
|
|
184
|
+
}
|
|
185
|
+
await lease.assertOwned()
|
|
106
186
|
await rename(previous, target)
|
|
107
187
|
operation.status = 'rolled_back'
|
|
108
188
|
} else if (await exists(target)) {
|
|
@@ -111,9 +191,10 @@ export async function recoverUpgrade(home, operationId, options = {}) {
|
|
|
111
191
|
else if (actual === operation.old_manifest_sha256) operation.status = 'rolled_back'
|
|
112
192
|
else throw new Error('PROFILE_CHANGED: preserve the backup and reconcile the profile manually')
|
|
113
193
|
} else throw new Error('RECOVERY_REQUIRED: neither active nor previous profile is available')
|
|
194
|
+
await lease.assertOwned()
|
|
114
195
|
await save(join(root, 'operation.json'), operation)
|
|
115
196
|
return { operation_id: operationId, status: operation.status, backup: previous }
|
|
116
|
-
} finally { await release() }
|
|
197
|
+
} finally { await lease.release() }
|
|
117
198
|
}
|
|
118
199
|
|
|
119
200
|
/** Stage a complete profile beside the active tree, validate, then swap while stopped. */
|
|
@@ -122,6 +203,7 @@ export async function upgradeProfile(home, profile, spec, options = {}) {
|
|
|
122
203
|
const target = profileDirectory(home, profile)
|
|
123
204
|
const stopped = options.assertStopped || assertHostStopped
|
|
124
205
|
await stopped(home, profile)
|
|
206
|
+
const { acquireLock, yaml } = upgradeDependencies(home, profile)
|
|
125
207
|
const release = await acquireLock(join(home, 'profiles'), { realpath: true, retries: 0 })
|
|
126
208
|
const id = 'upgrade_' + randomUUID()
|
|
127
209
|
const root = join(resolve(home), 'openwrite', 'upgrades', id)
|
|
@@ -141,8 +223,20 @@ export async function upgradeProfile(home, profile, spec, options = {}) {
|
|
|
141
223
|
await save(join(root, 'operation.json'), operation)
|
|
142
224
|
await cp(target, staging, { recursive: true, dereference: false, verbatimSymlinks: true,
|
|
143
225
|
filter: source => !source.includes('/.plugin-manager/') && !source.endsWith('/.plugin-manager') })
|
|
144
|
-
await relocateProfileLinks(staging, target)
|
|
145
|
-
|
|
226
|
+
await relocateProfileLinks(staging, target, staging, yaml)
|
|
227
|
+
// A downloaded tarball may live in a disposable directory. Pin its bytes
|
|
228
|
+
// below DSH_HOME before the installer writes file: references into locks.
|
|
229
|
+
let installSpec = spec
|
|
230
|
+
const localPath = spec.startsWith('file:') ? spec.slice(5) : spec
|
|
231
|
+
if (/\.(?:tgz|tar\.gz)$/i.test(localPath) && await exists(resolve(localPath))) {
|
|
232
|
+
const archive = resolve(localPath)
|
|
233
|
+
const pinned = await pinArchive(home, archive)
|
|
234
|
+
installSpec = pinned.path
|
|
235
|
+
operation.install_spec = installSpec
|
|
236
|
+
operation.package_sha256 = pinned.sha256
|
|
237
|
+
await save(join(root, 'operation.json'), operation)
|
|
238
|
+
}
|
|
239
|
+
await (options.run || runInstall)(home, stagingName, installSpec, log)
|
|
146
240
|
const installed = JSON.parse(await readFile(join(staging, 'node_modules', 'dsh-openwrite', 'package.json'), 'utf8'))
|
|
147
241
|
if (installed.name !== 'dsh-openwrite' || !installed.version || !installed.dsh?.bundle?.patch) throw new Error('BUNDLE_INCOMPLETE: staged OpenWrite manifest is invalid')
|
|
148
242
|
const bundleRoot = join(staging, 'node_modules', 'dsh-openwrite')
|
|
@@ -152,7 +246,7 @@ export async function upgradeProfile(home, profile, spec, options = {}) {
|
|
|
152
246
|
operation.new_manifest_sha256 = digest(await readFile(join(staging, 'package.json')))
|
|
153
247
|
if (digest(await readFile(join(target, 'package.json'))) !== operation.old_manifest_sha256) throw new Error('PROFILE_CHANGED: the active profile changed during staging')
|
|
154
248
|
await stopped(home, profile)
|
|
155
|
-
await relocateProfileLinks(staging, staging, target)
|
|
249
|
+
await relocateProfileLinks(staging, staging, target, yaml)
|
|
156
250
|
operation.status = 'swapping'
|
|
157
251
|
await save(join(root, 'operation.json'), operation)
|
|
158
252
|
await rename(target, previous)
|
|
@@ -187,6 +281,7 @@ export async function repairProfile(home, profile, apply = false, options = {})
|
|
|
187
281
|
const enabled = manifest.dsh?.profile?.bundles?.includes('dsh-openwrite') === true
|
|
188
282
|
if (!apply || !broken || !enabled) return { profile, incomplete: broken, enabled, changed: false }
|
|
189
283
|
await (options.assertStopped || assertHostStopped)(home, profile)
|
|
284
|
+
const { acquireLock } = upgradeDependencies(home, profile)
|
|
190
285
|
const release = await acquireLock(join(home, 'profiles'), { realpath: true, retries: 0 })
|
|
191
286
|
try {
|
|
192
287
|
if (await readFile(manifestPath, 'utf8') !== original) throw new Error('PROFILE_CHANGED: refresh repair inspection')
|