@lmzhen/dsh-evolution-core 0.1.0-rc.6 → 0.1.0-rc.60
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/lib/index.js +1720 -427
- package/lib/types/constants.d.ts +53 -0
- package/lib/types/curator.d.ts +71 -4
- package/lib/types/events.d.ts +18 -10
- package/lib/types/gates.d.ts +38 -0
- package/lib/types/index.d.ts +5 -0
- package/lib/types/io.d.ts +31 -6
- package/lib/types/learn-prompt.d.ts +19 -0
- package/lib/types/memory-store.d.ts +45 -12
- package/lib/types/mutations.d.ts +24 -0
- package/lib/types/prompts.d.ts +21 -5
- package/lib/types/quality.d.ts +57 -0
- package/lib/types/skill-store.d.ts +153 -21
- package/lib/types/state-store.d.ts +2 -15
- package/lib/types/threats.d.ts +16 -4
- package/lib/types/usage.d.ts +39 -2
- package/package.json +5 -5
|
@@ -7,11 +7,8 @@
|
|
|
7
7
|
* move to `.archive/` — never a hard delete.
|
|
8
8
|
*/
|
|
9
9
|
import { type EvolutionIoLike } from './io.ts';
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
export declare const MAX_DESCRIPTION_LENGTH = 1024;
|
|
13
|
-
export declare const MAX_SKILL_CONTENT_CHARS = 100000;
|
|
14
|
-
export declare const MAX_SKILL_FILE_BYTES = 1048576;
|
|
10
|
+
import { type MutationRecord } from './mutations.ts';
|
|
11
|
+
import type { EvolutionSkillMutatedEvent } from './events.ts';
|
|
15
12
|
export interface SkillLimits {
|
|
16
13
|
maxNameLength: number;
|
|
17
14
|
maxDescriptionLength: number;
|
|
@@ -19,7 +16,6 @@ export interface SkillLimits {
|
|
|
19
16
|
maxSkillFileBytes: number;
|
|
20
17
|
}
|
|
21
18
|
export declare const DEFAULT_SKILL_LIMITS: SkillLimits;
|
|
22
|
-
export declare const SUPPORT_DIRS: readonly ["references", "templates", "scripts", "assets"];
|
|
23
19
|
export interface SkillSummary {
|
|
24
20
|
name: string;
|
|
25
21
|
description: string;
|
|
@@ -33,7 +29,52 @@ export interface SkillActionResult {
|
|
|
33
29
|
message: string;
|
|
34
30
|
path?: string;
|
|
35
31
|
}
|
|
32
|
+
/** Extra file name carried inside a snapshot's `extras/` directory. */
|
|
33
|
+
export declare const SNAPSHOT_EXTRA_NAME_RE: RegExp;
|
|
34
|
+
/** An opaque side file stored under a snapshot's `extras/` (curator state etc.). */
|
|
35
|
+
export interface SnapshotExtra {
|
|
36
|
+
name: string;
|
|
37
|
+
content: string;
|
|
38
|
+
}
|
|
39
|
+
/** Normalized manifest of a skills snapshot. */
|
|
40
|
+
export interface SnapshotManifest {
|
|
41
|
+
reason: string;
|
|
42
|
+
createdAt: string;
|
|
43
|
+
/** Active skill names at snapshot time. */
|
|
44
|
+
skills: string[];
|
|
45
|
+
/** Co-copied sidecar file names (usage/suppression). */
|
|
46
|
+
sidecars: string[];
|
|
47
|
+
/** Whether `.archive/` was co-copied; absent on legacy manifests (do not touch archive on restore). */
|
|
48
|
+
hasArchive?: boolean;
|
|
49
|
+
/** Extras declared under `extras/`; only these names are ever read back. */
|
|
50
|
+
extras: string[];
|
|
51
|
+
}
|
|
52
|
+
/** Who is writing: a foreground user-directed tool call, or the autonomous review/curator pipeline. */
|
|
53
|
+
export type WriteOrigin = 'foreground' | 'subagent' | 'background_review';
|
|
54
|
+
/** Options for `SkillLibrary.archive`. The absorbed-into name and the archival reason are distinct fields. */
|
|
55
|
+
export interface ArchiveOptions {
|
|
56
|
+
/** Umbrella skill this one was consolidated into; when set it must exist (consolidate semantics). */
|
|
57
|
+
absorbedInto?: string;
|
|
58
|
+
/** Human-readable reason written to `.archive-reason`; default derives from `absorbedInto`. */
|
|
59
|
+
reason?: string;
|
|
60
|
+
/** Permit archiving a bundled skill (curator prune-builtins only; hub-installed and pinned stay protected). */
|
|
61
|
+
allowBundled?: boolean;
|
|
62
|
+
}
|
|
36
63
|
export declare function skillsRoot(env?: NodeJS.ProcessEnv): string;
|
|
64
|
+
/**
|
|
65
|
+
* Map a requesting session onto the two origin surfaces (rc.44 plan M2-2.3):
|
|
66
|
+
* the APPROVAL surface treats every delegated subagent as the autonomous
|
|
67
|
+
* review channel, while the LIBRARY surface keeps the Hermes distinction -
|
|
68
|
+
* the review fork is 'background_review' (the pinned guard blocks its
|
|
69
|
+
* writes) and any other subagent is 'subagent' (agent-authored, not
|
|
70
|
+
* review-channel). `isReview` marks the caller as the background review
|
|
71
|
+
* pipeline itself. Single source: the two tools and the review executor all
|
|
72
|
+
* read this table instead of re-deriving it.
|
|
73
|
+
*/
|
|
74
|
+
export declare function resolveOrigins(headerOrigin: string | undefined, isReview?: boolean): {
|
|
75
|
+
approval: 'foreground' | 'background_review';
|
|
76
|
+
library: WriteOrigin;
|
|
77
|
+
};
|
|
37
78
|
export interface Frontmatter {
|
|
38
79
|
name?: string;
|
|
39
80
|
description?: string;
|
|
@@ -43,41 +84,132 @@ export declare function parseFrontmatter(content: string): {
|
|
|
43
84
|
frontmatter: Frontmatter;
|
|
44
85
|
body: string;
|
|
45
86
|
} | null;
|
|
87
|
+
/**
|
|
88
|
+
* Skill names referenced by a SKILL.md's `related_skills` frontmatter
|
|
89
|
+
* (B-line G3, rc.44): the single parsing source for the quality references
|
|
90
|
+
* factor and the learning-graph edges. The DSH frontmatter parser keeps the
|
|
91
|
+
* YAML value as a string (`"[a, b]"`), so names are scanned out of it; each
|
|
92
|
+
* must satisfy the skill-name shape and the referencing skill itself is
|
|
93
|
+
* excluded. Pure and deduplicated.
|
|
94
|
+
*/
|
|
95
|
+
export declare function relatedSkillNames(content: string, exclude?: string): string[];
|
|
46
96
|
export declare function validateFrontmatter(content: string, expectedName?: string, limits?: SkillLimits): string | null;
|
|
97
|
+
/** Hermes authoring quality bar for descriptions (the 60-char Rule). The
|
|
98
|
+
* platform's own index limit stays in `validateFrontmatter`; this bar is the
|
|
99
|
+
* target the authoring standard names, enforced as ADVISORY feedback. */
|
|
100
|
+
export declare const AUTHORING_DESCRIPTION_BAR = 60;
|
|
101
|
+
export interface AuthoringFeedback {
|
|
102
|
+
/** Frontmatter description length in characters (0 when absent). */
|
|
103
|
+
descriptionChars: number;
|
|
104
|
+
/** Whether the description exceeds the authoring bar (60) while still passing the platform limit. */
|
|
105
|
+
over60: boolean;
|
|
106
|
+
/** Whether the description contains a colon (the standard requires double-quote wrapping). */
|
|
107
|
+
hasColon: boolean;
|
|
108
|
+
/** Advice lines appended to mutation success messages. */
|
|
109
|
+
lines: string[];
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Advisory authoring feedback (P0): evaluate frontmatter against the
|
|
113
|
+
* authoring bar WITHOUT changing platform validation semantics. The bar is
|
|
114
|
+
* the quality target, `validateFrontmatter`'s limits are the compatibility
|
|
115
|
+
* floor, and this bridge layer tells the model when its text would be
|
|
116
|
+
* truncated or route-poor instead of silently shipping it.
|
|
117
|
+
*/
|
|
118
|
+
export declare function authoringFeedback(frontmatter: Frontmatter): AuthoringFeedback;
|
|
47
119
|
export declare class SkillLibrary {
|
|
48
120
|
readonly root: string;
|
|
49
121
|
readonly limits: SkillLimits;
|
|
50
122
|
private readonly io;
|
|
51
|
-
|
|
123
|
+
private readonly onMutation;
|
|
124
|
+
constructor(root?: string, io?: EvolutionIoLike, limits?: SkillLimits, onMutation?: (event: EvolutionSkillMutatedEvent) => void);
|
|
125
|
+
/** Notify the mutation observer after a successful write; observers must never fail the mutation. */
|
|
126
|
+
private notifyMutation;
|
|
52
127
|
list(): Promise<SkillSummary[]>;
|
|
53
|
-
read(
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
128
|
+
read(rawName: string): Promise<string | null>;
|
|
129
|
+
/**
|
|
130
|
+
|
|
131
|
+
* Single path-building choke point (rc.42 audit P2-5): every directory path
|
|
132
|
+
|
|
133
|
+
* is built from the TRIMMED name, so a name that passes `badName` (which
|
|
134
|
+
|
|
135
|
+
* trims before validating) can never mint a second, whitespace-padded
|
|
136
|
+
|
|
137
|
+
* directory next to the real one. Callers keep passing raw user input.
|
|
138
|
+
|
|
139
|
+
*/
|
|
140
|
+
private dirOf;
|
|
141
|
+
/** Name-format guard shared by every path-building mutator/reader. */
|
|
142
|
+
private badName;
|
|
143
|
+
writeProtection(rawName: string, origin?: WriteOrigin): Promise<string | null>;
|
|
144
|
+
deleteProtection(rawName: string, options?: {
|
|
145
|
+
allowBundled?: boolean;
|
|
146
|
+
}): Promise<string | null>;
|
|
147
|
+
isManaged(rawName: string): Promise<boolean>;
|
|
148
|
+
/** Whether the skill carries the bundled marker (curator prune-builtins eligibility). */
|
|
149
|
+
isBundled(rawName: string): Promise<boolean>;
|
|
150
|
+
/** Whether the skill carries the pinned marker (the marker is the factual source; usage.pinned mirrors it). */
|
|
151
|
+
isPinned(rawName: string): Promise<boolean>;
|
|
152
|
+
/** Count non-empty support subdirectories (richness input for quality scoring). */
|
|
153
|
+
countSupportDirs(rawName: string): Promise<number>;
|
|
154
|
+
/** Best-effort audit trail entry; never blocks the mutation. */
|
|
155
|
+
private audit;
|
|
156
|
+
/** Recent mutation audit records (read-only inspection surface). */
|
|
157
|
+
listMutations(): Promise<MutationRecord[]>;
|
|
158
|
+
/**
|
|
159
|
+
* Pin or unpin a skill (`.pinned` marker). Pinned skills are protected from
|
|
160
|
+
* deletion, from background-review writes, and from the lifecycle — a
|
|
161
|
+
* protective mutation, so the autonomous pipeline may never call it. The
|
|
162
|
+
* marker write is the only state change; content is untouched.
|
|
163
|
+
*/
|
|
164
|
+
setPinned(name: string, pinned: boolean, origin?: WriteOrigin): Promise<SkillActionResult>;
|
|
165
|
+
create(name: string, content: string, origin?: WriteOrigin): Promise<SkillActionResult>;
|
|
166
|
+
update(rawName: string, content: string, origin?: WriteOrigin): Promise<SkillActionResult>;
|
|
167
|
+
patch(rawName: string, oldString: string, newString: string, filePath?: string, replaceAll?: boolean, origin?: WriteOrigin): Promise<SkillActionResult>;
|
|
168
|
+
archive(rawName: string, options?: ArchiveOptions): Promise<SkillActionResult>;
|
|
61
169
|
/**
|
|
62
170
|
* Merge the bodies of `sources` into `target` and archive the sources with
|
|
63
171
|
* an absorbed-into marker. Hermes-style consolidation: overlapping skills
|
|
64
172
|
* collapse into one, and the originals stay recoverable under `.archive/`.
|
|
65
173
|
*/
|
|
66
|
-
consolidate(target: string, sources: string[]): Promise<SkillActionResult>;
|
|
174
|
+
consolidate(target: string, sources: string[], origin?: WriteOrigin): Promise<SkillActionResult>;
|
|
67
175
|
/**
|
|
68
176
|
* Restore one skill from `.archive/` back to the active root. Hermes-style
|
|
69
177
|
* recoverability: archival never deletes, and this is the control-plane
|
|
70
178
|
* path back. The `.archive-reason` marker is dropped on restore.
|
|
71
179
|
*/
|
|
72
|
-
restoreFromArchive(
|
|
73
|
-
writeSupportFile(
|
|
74
|
-
removeSupportFile(
|
|
75
|
-
|
|
180
|
+
restoreFromArchive(rawName: string): Promise<SkillActionResult>;
|
|
181
|
+
writeSupportFile(rawName: string, filePath: string, content: string, origin?: WriteOrigin): Promise<SkillActionResult>;
|
|
182
|
+
removeSupportFile(rawName: string, filePath: string, origin?: WriteOrigin): Promise<SkillActionResult>;
|
|
183
|
+
/**
|
|
184
|
+
* Snapshot the recoverable skills state: active tree, usage/suppression
|
|
185
|
+
* sidecars, `.archive/` and caller-supplied extras. `extras` are opaque
|
|
186
|
+
* side files the Snapshot owner cares about (curator state); they are
|
|
187
|
+
* listed in the manifest and only those names are ever read back.
|
|
188
|
+
*/
|
|
189
|
+
snapshotAll(reason?: string, extras?: SnapshotExtra[]): Promise<string>;
|
|
190
|
+
/** Read and normalize a snapshot manifest; null when the file is missing or unparsable. */
|
|
191
|
+
readSnapshotManifest(path: string): Promise<SnapshotManifest | null>;
|
|
192
|
+
/** Keep only the newest N snapshots (Hermes keep=5 parity); older ones are removed outright. */
|
|
193
|
+
private retainSnapshots;
|
|
76
194
|
listSnapshots(): Promise<Array<{
|
|
77
195
|
path: string;
|
|
78
196
|
createdAt: string;
|
|
79
197
|
reason: string;
|
|
80
198
|
}>>;
|
|
81
|
-
|
|
199
|
+
/**
|
|
200
|
+
* Read the extras of a snapshot, restricted to the names declared in the
|
|
201
|
+
* manifest — an `extras/` directory is never listed directly, so unknown
|
|
202
|
+
* files cannot leak back as state on the next restore.
|
|
203
|
+
*/
|
|
204
|
+
readSnapshotExtras(path: string): Promise<SnapshotExtra[]>;
|
|
205
|
+
/**
|
|
206
|
+
* Manifest-driven restore of the latest snapshot: active tree, sidecars,
|
|
207
|
+
* `.archive/` and (for full-state snapshots) the extras read back by the
|
|
208
|
+
* caller. `extras` are additionally written into the pre-rollback safety
|
|
209
|
+
* snapshot so the rollback itself is undoable with the same state.
|
|
210
|
+
*/
|
|
211
|
+
restoreLatestSnapshot(extras?: SnapshotExtra[]): Promise<SkillActionResult & {
|
|
212
|
+
extras?: SnapshotExtra[];
|
|
213
|
+
}>;
|
|
82
214
|
}
|
|
83
215
|
//# sourceMappingURL=skill-store.d.ts.map
|
|
@@ -1,19 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* Evolution home path helper: `$DSH_HOME/evolution` for plugin-owned sidecar
|
|
3
|
+
* state (reports, activity store, feedback file, state-domain data).
|
|
4
4
|
*/
|
|
5
5
|
export declare function evolutionHome(env?: NodeJS.ProcessEnv): string;
|
|
6
|
-
export declare class JsonState<T> {
|
|
7
|
-
private readonly initial;
|
|
8
|
-
readonly path: string;
|
|
9
|
-
private value;
|
|
10
|
-
constructor(name: string, initial: T, env?: NodeJS.ProcessEnv);
|
|
11
|
-
private loadSync;
|
|
12
|
-
get(): T;
|
|
13
|
-
set(value: T): void;
|
|
14
|
-
update(mutator: (value: T) => void): void;
|
|
15
|
-
flush(): Promise<void>;
|
|
16
|
-
/** Merge-on-load helper for persisted maps/records. */
|
|
17
|
-
reload(): Promise<void>;
|
|
18
|
-
}
|
|
19
6
|
//# sourceMappingURL=state-store.d.ts.map
|
package/lib/types/threats.d.ts
CHANGED
|
@@ -12,17 +12,29 @@ export interface ThreatFinding {
|
|
|
12
12
|
category: string;
|
|
13
13
|
scope: ThreatScope;
|
|
14
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* Optional scan controls. Default behavior (`options` omitted) is unchanged:
|
|
17
|
+
* every in-scope pattern blocks. Adapters that need to tolerate a specific
|
|
18
|
+
* benign phrasing (e.g. a skill that legitimately opens with "You are now a ...")
|
|
19
|
+
* can exclude that label by name here. This is opt-in and never widens strict
|
|
20
|
+
* scope; it only permits callers to drop a known-innocent match.
|
|
21
|
+
*/
|
|
22
|
+
export interface ScanOptions {
|
|
23
|
+
/** Pattern labels to skip during this scan. */
|
|
24
|
+
excludeLabels?: readonly string[];
|
|
25
|
+
}
|
|
15
26
|
/**
|
|
16
27
|
* Scan text at `scope`. Patterns are cumulative: `strict` includes all scopes.
|
|
28
|
+
* `options.excludeLabels` removes matching patterns without changing `scope`.
|
|
17
29
|
*/
|
|
18
|
-
export declare function scanThreats(text: string, scope?: ThreatScope, maxScanChars?: number): ThreatFinding[];
|
|
30
|
+
export declare function scanThreats(text: string, scope?: ThreatScope, maxScanChars?: number, options?: ScanOptions): ThreatFinding[];
|
|
19
31
|
/** Blocking policy: any hit blocks. `severity` is deliberately not a gate. */
|
|
20
|
-
export declare function evaluateThreat(text: string, scope?: ThreatScope, maxScanChars?: number): {
|
|
32
|
+
export declare function evaluateThreat(text: string, scope?: ThreatScope, maxScanChars?: number, options?: ScanOptions): {
|
|
21
33
|
blocked: boolean;
|
|
22
34
|
findings: ThreatFinding[];
|
|
23
35
|
};
|
|
24
36
|
/** User-facing block message for memory writes. */
|
|
25
|
-
export declare function scanMemoryThreats(text: string, maxScanChars?: number): string | null;
|
|
37
|
+
export declare function scanMemoryThreats(text: string, maxScanChars?: number, options?: ScanOptions): string | null;
|
|
26
38
|
/** User-facing block message for skill content writes. */
|
|
27
|
-
export declare function scanContentThreats(text: string, maxScanChars?: number): string | null;
|
|
39
|
+
export declare function scanContentThreats(text: string, maxScanChars?: number, options?: ScanOptions): string | null;
|
|
28
40
|
//# sourceMappingURL=threats.d.ts.map
|
package/lib/types/usage.d.ts
CHANGED
|
@@ -16,13 +16,33 @@ export interface UsageRecord {
|
|
|
16
16
|
state: SkillState;
|
|
17
17
|
pinned: boolean;
|
|
18
18
|
archived_at: string | null;
|
|
19
|
-
quality_score?: number;
|
|
20
|
-
quality_warn?: boolean;
|
|
19
|
+
quality_score?: number | undefined;
|
|
20
|
+
quality_warn?: boolean | undefined;
|
|
21
21
|
}
|
|
22
22
|
export type UsageMap = Map<string, UsageRecord>;
|
|
23
23
|
export declare function usageFile(root: string): string;
|
|
24
24
|
export declare function emptyRecord(): UsageRecord;
|
|
25
|
+
/**
|
|
26
|
+
* Field-level normalization for one sidecar record (rc.42 audit P2-3): the
|
|
27
|
+
* spread used to copy any junk through verbatim, so a corrupted file could
|
|
28
|
+
* carry `use_count: "3"` into the quality math and lifecycle comparisons as
|
|
29
|
+
* NaN. Every field falls back to its `emptyRecord()` baseline unless it has
|
|
30
|
+
* exactly the declared type; an invalid `created_at` anchors the age clock at
|
|
31
|
+
* now (first-sight defer semantics for a record whose age is unknowable).
|
|
32
|
+
* Timestamps additionally require a parseable date (N-3): `"not-a-date"`
|
|
33
|
+
* would otherwise survive the type check as Invalid Date.
|
|
34
|
+
* Pure — exported for unit tests; `loadUsage` is the production caller.
|
|
35
|
+
*/
|
|
36
|
+
export declare function normalizeUsageRecord(record: unknown): UsageRecord;
|
|
25
37
|
export declare function loadUsage(root: string, io?: EvolutionIoLike): Promise<UsageMap>;
|
|
38
|
+
/**
|
|
39
|
+
* Atomic read-modify-write on the usage sidecar (rc.50 P2-2): `task` receives
|
|
40
|
+
* the map parsed from the current on-disk state and may mutate it; the result
|
|
41
|
+
* is persisted inside the same transact so a second process sharing DSH_HOME
|
|
42
|
+
* cannot interleave its RMW and lose a counter update. Callers keep their own
|
|
43
|
+
* single-process serialize chain as the second layer.
|
|
44
|
+
*/
|
|
45
|
+
export declare function mutateUsage(root: string, io: EvolutionIoLike, task: (map: UsageMap) => void | Promise<void>): Promise<void>;
|
|
26
46
|
export declare function saveUsage(root: string, map: UsageMap, io?: EvolutionIoLike): Promise<void>;
|
|
27
47
|
export declare function getRecord(map: UsageMap, name: string): UsageRecord;
|
|
28
48
|
export declare function bumpView(map: UsageMap, name: string, when?: Date): void;
|
|
@@ -30,4 +50,21 @@ export declare function bumpUse(map: UsageMap, name: string, when?: Date): void;
|
|
|
30
50
|
export declare function bumpPatch(map: UsageMap, name: string, when?: Date): void;
|
|
31
51
|
export declare function markAgentCreated(map: UsageMap, name: string): void;
|
|
32
52
|
export declare function latestActivityAt(record: UsageRecord): string | null;
|
|
53
|
+
/**
|
|
54
|
+
* Curator suppression sidecar: built-in skills the curator has archived stay
|
|
55
|
+
* suppressed across re-seeds, so the lifecycle never fights a re-created
|
|
56
|
+
* bundled skill. Best-effort load/save, mirroring the usage sidecar posture.
|
|
57
|
+
* Versioned shape ({ version, names }) with legacy plain-array compat.
|
|
58
|
+
*/
|
|
59
|
+
export declare const SUPPRESSED_FILE_VERSION = 1;
|
|
60
|
+
export declare function suppressedFile(root: string): string;
|
|
61
|
+
export declare function loadSuppressedNames(root: string, io?: EvolutionIoLike): Promise<ReadonlySet<string>>;
|
|
62
|
+
export declare function saveSuppressedNames(root: string, names: ReadonlySet<string>, io?: EvolutionIoLike): Promise<void>;
|
|
63
|
+
/**
|
|
64
|
+
* Atomic read-modify-write on the suppression sidecar (rc.50 P2-2): `task`
|
|
65
|
+
* receives the set parsed from the current on-disk state and may mutate it;
|
|
66
|
+
* the result is persisted inside the same transact so a second process
|
|
67
|
+
* sharing DSH_HOME cannot interleave its RMW. Best-effort posture unchanged.
|
|
68
|
+
*/
|
|
69
|
+
export declare function updateSuppressedNames(root: string, io: EvolutionIoLike, task: (names: Set<string>) => void | Promise<void>): Promise<void>;
|
|
33
70
|
//# sourceMappingURL=usage.d.ts.map
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lmzhen/dsh-evolution-core",
|
|
3
3
|
"description": "Shared stores, prompts, signals and lifecycle logic for the dsh-evolution plugin family (community build)",
|
|
4
|
-
"version": "0.1.0-rc.
|
|
4
|
+
"version": "0.1.0-rc.60",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
@@ -32,13 +32,13 @@
|
|
|
32
32
|
],
|
|
33
33
|
"license": "MIT",
|
|
34
34
|
"peerDependencies": {
|
|
35
|
-
"@deepseek-ai/dsh-invariants": "^0.1.
|
|
35
|
+
"@deepseek-ai/dsh-invariants": "^0.1.1-rc.2",
|
|
36
36
|
"@deepseek-ai/cordis": "^4.0.1",
|
|
37
|
-
"@deepseek-ai/dsh-session": "^0.1.
|
|
37
|
+
"@deepseek-ai/dsh-session": "^0.1.1-rc.2"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
|
-
"@deepseek-ai/dsh-invariants": "^0.1.
|
|
40
|
+
"@deepseek-ai/dsh-invariants": "^0.1.1-rc.2",
|
|
41
41
|
"@deepseek-ai/cordis": "^4.0.1",
|
|
42
|
-
"@deepseek-ai/dsh-session": "^0.1.
|
|
42
|
+
"@deepseek-ai/dsh-session": "^0.1.1-rc.2"
|
|
43
43
|
}
|
|
44
44
|
}
|