@monotykamary/dsh-tool-session-mutations 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 DeepSeek
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,6 @@
1
+ # Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
2
+ # side as of the last confirmed-consistent state. Both languages carry equal authority;
3
+ # after editing either side, bring the other along and re-record with:
4
+ # pnpm run verify-translation-pairing --write packages/session-query/tool-session-mutations/README.md
5
+ README.md: 2a0e72c40ca5ae9ba579383d2b038f77fad84c3d
6
+ README.zh.md: 0b45bdf98db0a26a3b6066d5a42e81f44929479f
package/README.md ADDED
@@ -0,0 +1,36 @@
1
+ # @monotykamary/dsh-tool-session-mutations
2
+
3
+ English | [中文](README.zh.md)
4
+
5
+ Bounded model reader over the current Agent's durable file-mutation receipts. The package registers `changes_read`; its pure `./ledger` entry exports the same commit-ordered projection for external automation without evaluating the plugin.
6
+
7
+ A list call returns summaries after an optional `after_commit_order` cursor. An exact `commit_order` call returns the recorded replacement hunks in UTF-16 pages. Every result states that the ledger covers receipt-aware tools only. It never reads or writes the workspace, and its output is recorded intent rather than unified-patch syntax or repository state.
8
+
9
+ ## Configuration
10
+
11
+ | Key | Meaning |
12
+ |---|---|
13
+ | `maxListItems` | Required positive integer limiting one summary page. |
14
+ | `maxDiffChars` | Required positive integer limiting mutation text in one detail page. |
15
+
16
+ ## Model Experience
17
+
18
+ ### Mutation-ledger reader
19
+
20
+ #### What the model sees
21
+
22
+ The generated [`changes_read` schema](../../../docs/tool-catalog.md#monotykamarydsh-tool-session-mutations) lists direct and nested receipt-aware mutations from the complete current Session, or returns one mutation's path, hashes, and recorded replacement hunks. Results explicitly exclude shell and external changes.
23
+
24
+ #### Token effect
25
+
26
+ One fixed schema is present while the plugin is mounted. List pages are capped by `maxListItems`; detail pages are capped by `maxDiffChars` and continue from the returned offset.
27
+
28
+ #### KV Cache effect
29
+
30
+ The schema remains prefix-stable while its definition is unchanged. Each called result appends after the reusable prefix like an ordinary tool result.
31
+
32
+ ## Known Limitations and Deferred Work
33
+
34
+ - **The ledger records instrumented tools, not repository state** — terminal commands, external edits, file modes, and uncommitted Git state are absent.
35
+ - **Hunks are presentation-oriented replacement intent** — callers must read current files before reconciling and cannot apply the output as a patch.
36
+ - **Only a live Agent Session is readable** — persisted sessions must be resumed before the tool can inspect their complete event history.
package/README.zh.md ADDED
@@ -0,0 +1,36 @@
1
+ # @monotykamary/dsh-tool-session-mutations
2
+
3
+ [English](README.md) | 中文
4
+
5
+ 这是对当前 Agent 持久文件修改 receipt 的有界模型读取器。本包注册 `changes_read`;纯 `./ledger` 入口导出同一套按提交顺序排列的投影,供外部自动化使用,且不会执行插件。
6
+
7
+ 列表调用会返回可选 `after_commit_order` cursor 之后的摘要。指定 `commit_order` 的调用会按 UTF-16 页返回已记录的 replacement hunk。每个结果都会说明 ledger 只覆盖 receipt-aware 工具。它永远不读写工作区,输出是已记录意图,而不是 unified-patch 语法或仓库状态。
8
+
9
+ ## 配置
10
+
11
+ | 键 | 含义 |
12
+ |---|---|
13
+ | `maxListItems` | 必需的正整数,用于限制一页摘要数量。 |
14
+ | `maxDiffChars` | 必需的正整数,用于限制一页详情中的修改文本。 |
15
+
16
+ ## 模型体验
17
+
18
+ ### 修改 ledger 读取器
19
+
20
+ #### 模型看到的内容
21
+
22
+ 生成的 [`changes_read` schema](../../../docs/tool-catalog.zh.md#monotykamarydsh-tool-session-mutations) 会列出当前完整 Session 中由直接或嵌套 receipt-aware 工具产生的修改,或返回一项修改的路径、hash 与已记录 replacement hunk。结果会明确排除 shell 与外部修改。
23
+
24
+ #### Token 影响
25
+
26
+ 插件挂载期间会提供一个固定 schema。列表页受 `maxListItems` 限制;详情页受 `maxDiffChars` 限制,并从返回的 offset 继续。
27
+
28
+ #### KV Cache 影响
29
+
30
+ 只要定义不变,schema 就保持前缀稳定。每次调用结果都像普通工具结果一样追加在可复用前缀之后。
31
+
32
+ ## 已知限制与暂缓事项
33
+
34
+ - **Ledger 记录接入的工具,而非仓库状态。**Terminal 命令、外部编辑、文件 mode 与未提交 Git 状态均缺席。
35
+ - **Hunk 是面向展示的 replacement intent。**调用方在对账前必须读取当前文件,不能把输出当作 patch 应用。
36
+ - **只能读取 live Agent Session。**持久 Session 必须先恢复,工具才能检查其完整事件历史。
package/lib/index.js ADDED
@@ -0,0 +1,165 @@
1
+ import { COVERAGE, boundedText, mutationLedger, renderMutation } from "./ledger.js";
2
+ import z from "@monotykamary/schemastery";
3
+ import { defineTool } from "@monotykamary/dsh-tools";
4
+ //#region lib/types/index.js
5
+ /**
6
+ * Model-facing reader over the current Session's durable file-mutation receipts.
7
+ *
8
+ * @module @monotykamary/dsh-tool-session-mutations
9
+ */
10
+ /** Cordis plugin name used by Loader diagnostics. */
11
+ const name = "tool-session-mutations";
12
+ /** Service required by the model-facing Consumer. */
13
+ const inject = ["tools"];
14
+ /** Validated mutation-ledger output bounds. */
15
+ const Config = z.object({
16
+ maxListItems: z.number().step(1).min(1).required(),
17
+ maxDiffChars: z.number().step(1).min(1).required()
18
+ });
19
+ const itemSchema = {
20
+ type: "object",
21
+ additionalProperties: false,
22
+ properties: {
23
+ commitOrder: {
24
+ type: "integer",
25
+ required: true
26
+ },
27
+ path: {
28
+ type: "string",
29
+ required: true
30
+ },
31
+ operation: {
32
+ type: "string",
33
+ required: true,
34
+ enum: [
35
+ "create",
36
+ "modify",
37
+ "delete"
38
+ ]
39
+ },
40
+ additions: {
41
+ type: "integer",
42
+ required: true
43
+ },
44
+ deletions: {
45
+ type: "integer",
46
+ required: true
47
+ },
48
+ beforeSha256: { type: "string" },
49
+ afterSha256: { type: "string" }
50
+ }
51
+ };
52
+ /** Register the current-Session `changes_read` tool. */
53
+ function apply(ctx, config) {
54
+ ctx.tools.register(defineTool({
55
+ name: "changes_read",
56
+ description: "Read file changes committed by receipt-aware tools in this Session. Call without commit_order to list changes in durable commit order; call with commit_order to read that change's recorded replacement hunks. Use the returned SHA-256 identities and ordinary file reads to reconcile later workspace divergence. Shell and external changes are outside this ledger.",
57
+ parameters: {
58
+ after_commit_order: {
59
+ type: "integer",
60
+ description: "List only changes after this commit order."
61
+ },
62
+ commit_order: {
63
+ type: "integer",
64
+ description: "Read one exact change instead of listing summaries."
65
+ },
66
+ offset: {
67
+ type: "integer",
68
+ description: "UTF-16 offset for the next page of one exact change; valid only with commit_order."
69
+ }
70
+ },
71
+ output: {
72
+ schema: {
73
+ type: "object",
74
+ additionalProperties: false,
75
+ properties: {
76
+ kind: {
77
+ type: "string",
78
+ required: true,
79
+ enum: ["list", "detail"]
80
+ },
81
+ coverage: {
82
+ type: "string",
83
+ required: true
84
+ },
85
+ items: {
86
+ type: "array",
87
+ required: true,
88
+ items: itemSchema
89
+ },
90
+ nextAfterCommitOrder: { type: "integer" },
91
+ commitOrder: { type: "integer" },
92
+ text: { type: "string" },
93
+ offset: { type: "integer" },
94
+ nextOffset: { type: "integer" }
95
+ }
96
+ },
97
+ render: (_args, value) => [{
98
+ type: "text",
99
+ text: value.kind === "list" ? value.items.length === 0 ? `No recorded file mutations. ${value.coverage}` : [
100
+ `Recorded file mutations (${value.items.length}):`,
101
+ ...value.items.flatMap((item) => [
102
+ `#${item.commitOrder} ${item.operation} ${item.path} (+${item.additions} -${item.deletions})`,
103
+ ` before SHA-256: ${item.beforeSha256 ?? "(absent)"}`,
104
+ ` after SHA-256: ${item.afterSha256 ?? "(absent)"}`
105
+ ]),
106
+ ...value.nextAfterCommitOrder === void 0 ? [] : [`Continue with after_commit_order=${value.nextAfterCommitOrder}.`],
107
+ value.coverage
108
+ ].join("\n") : [
109
+ value.text ?? "",
110
+ ...value.nextOffset === void 0 ? [] : [`Continue change #${value.commitOrder} with offset=${value.nextOffset}.`],
111
+ value.coverage
112
+ ].join("\n")
113
+ }]
114
+ },
115
+ execute(args, exec) {
116
+ if (exec.agent === void 0) throw new Error("changes_read requires an owning agent session");
117
+ for (const [key, value] of [
118
+ ["after_commit_order", args.after_commit_order],
119
+ ["commit_order", args.commit_order],
120
+ ["offset", args.offset]
121
+ ]) if (value !== void 0 && value < 0) throw new Error(`changes_read ${key} must be nonnegative`);
122
+ if (args.commit_order === void 0 && args.offset !== void 0) throw new Error("changes_read offset requires commit_order");
123
+ if (args.commit_order !== void 0 && args.after_commit_order !== void 0) throw new Error("changes_read commit_order cannot be combined with after_commit_order");
124
+ const ledger = mutationLedger(exec.agent.session.events);
125
+ if (args.commit_order === void 0) {
126
+ const afterCommitOrder = args.after_commit_order;
127
+ const eligible = afterCommitOrder === void 0 ? ledger : ledger.filter((item) => item.commitOrder > afterCommitOrder);
128
+ const items = eligible.slice(0, config.maxListItems).map(({ diffs: _diffs, beforeSha256, afterSha256, ...item }) => ({
129
+ ...item,
130
+ ...beforeSha256 === null ? {} : { beforeSha256 },
131
+ ...afterSha256 === null ? {} : { afterSha256 }
132
+ }));
133
+ const lastItem = items.at(-1);
134
+ return Promise.resolve({
135
+ kind: "list",
136
+ coverage: COVERAGE,
137
+ items,
138
+ ...eligible.length > items.length && lastItem !== void 0 ? { nextAfterCommitOrder: lastItem.commitOrder } : {}
139
+ });
140
+ }
141
+ const mutation = ledger.find((item) => item.commitOrder === args.commit_order);
142
+ if (mutation === void 0) throw new Error(`changes_read cannot find commit order ${args.commit_order}`);
143
+ const offset = args.offset ?? 0;
144
+ const rendered = renderMutation(mutation);
145
+ if (offset > rendered.length) throw new Error(`changes_read offset ${offset} exceeds change length ${rendered.length}`);
146
+ const page = boundedText(rendered, offset, config.maxDiffChars);
147
+ return Promise.resolve({
148
+ kind: "detail",
149
+ coverage: COVERAGE,
150
+ items: [],
151
+ commitOrder: mutation.commitOrder,
152
+ text: page.text,
153
+ offset,
154
+ ...page.nextOffset === null ? {} : { nextOffset: page.nextOffset }
155
+ });
156
+ },
157
+ presentCall: (args) => ({
158
+ card: "generic",
159
+ title: args.commit_order === void 0 ? "List file changes" : `Read file change #${args.commit_order}`,
160
+ kind: "read"
161
+ })
162
+ }));
163
+ }
164
+ //#endregion
165
+ export { Config, apply, inject, name };
@@ -0,0 +1,20 @@
1
+ //#region lib/types/invariant.js
2
+ /**
3
+ * Package-owned invariant companion for `@monotykamary/dsh-tool-session-mutations`.
4
+ * @module @monotykamary/dsh-tool-session-mutations/invariant
5
+ */
6
+ const PACKAGE_NAME = "@monotykamary/dsh-tool-session-mutations";
7
+ /** Cordis companion plugin name. */
8
+ const name = "tool-session-mutations-invariant";
9
+ /** Service required before the companion can reserve package ownership. */
10
+ const inject = ["invariants"];
11
+ /** No runtime invariant: the read-only Consumer owns no mutable state beyond its effect-owned tool registration. */
12
+ const install = () => {};
13
+ /**
14
+ * Register this package's invariant companion.
15
+ * @param ctx - Cordis context carrying the invariant service.
16
+ * @returns the installed registration's disposer after setup succeeds.
17
+ */
18
+ const apply = (ctx) => Promise.resolve(ctx.invariants.register(PACKAGE_NAME, install));
19
+ //#endregion
20
+ export { apply, inject, name };
package/lib/ledger.js ADDED
@@ -0,0 +1,75 @@
1
+ //#region lib/types/ledger.js
2
+ /** Pure projections for the model-facing mutation-ledger reader. */
3
+ /** Coverage statement returned with every ledger read. */
4
+ const COVERAGE = "Receipt-aware tool mutations only; shell and external changes are not included.";
5
+ function lineCount(text) {
6
+ if (text === null || text === "") return 0;
7
+ return (text.endsWith("\n") ? text.slice(0, -1) : text).split("\n").length;
8
+ }
9
+ function toLedgerMutation(mutation) {
10
+ return {
11
+ commitOrder: mutation.commitOrder,
12
+ path: mutation.path,
13
+ operation: mutation.operation,
14
+ additions: mutation.diffs.reduce((sum, diff) => sum + lineCount(diff.newText), 0),
15
+ deletions: mutation.diffs.reduce((sum, diff) => sum + lineCount(diff.oldText), 0),
16
+ beforeSha256: mutation.beforeSha256,
17
+ afterSha256: mutation.afterSha256,
18
+ diffs: mutation.diffs
19
+ };
20
+ }
21
+ /**
22
+ * Read every direct and nested committed mutation from a Session in commit order.
23
+ * @param events - complete current Session event history.
24
+ * @returns detached ledger entries sorted by their durable commit order.
25
+ */
26
+ function mutationLedger(events) {
27
+ const mutations = [];
28
+ for (const event of events) if (event.type === "tool/result" || event.type === "tool/code-dispatch") mutations.push(...event.data.mutations ?? []);
29
+ return mutations.sort((a, b) => a.commitOrder - b.commitOrder).map(toLedgerMutation);
30
+ }
31
+ /**
32
+ * Render one mutation's durable intent without claiming unified-patch semantics.
33
+ * @param mutation - committed mutation and its recorded replacement hunks.
34
+ * @returns bounded-reader source text for the selected mutation.
35
+ */
36
+ function renderMutation(mutation) {
37
+ const lines = [
38
+ `Change #${mutation.commitOrder}: ${mutation.operation} ${mutation.path}`,
39
+ `Before SHA-256: ${mutation.beforeSha256 ?? "(absent)"}`,
40
+ `After SHA-256: ${mutation.afterSha256 ?? "(absent)"}`
41
+ ];
42
+ mutation.diffs.forEach((diff, index) => {
43
+ lines.push(`Hunk ${index + 1}:`);
44
+ if (diff.oldText !== null) {
45
+ lines.push("Removed:");
46
+ lines.push(diff.oldText);
47
+ }
48
+ if (diff.newText !== null) {
49
+ lines.push("Added:");
50
+ lines.push(diff.newText);
51
+ }
52
+ });
53
+ return lines.join("\n");
54
+ }
55
+ /**
56
+ * Slice text without ending between a UTF-16 surrogate pair.
57
+ * @param text - complete rendered mutation text.
58
+ * @param offset - UTF-16 code-unit offset selected by the caller.
59
+ * @param maxChars - maximum UTF-16 code units in this page.
60
+ * @returns page text and the next offset, or null at the end.
61
+ */
62
+ function boundedText(text, offset, maxChars) {
63
+ let end = Math.min(text.length, offset + maxChars);
64
+ if (end < text.length) {
65
+ const prior = text.charCodeAt(end - 1);
66
+ const next = text.charCodeAt(end);
67
+ if (prior >= 55296 && prior <= 56319 && next >= 56320 && next <= 57343) end--;
68
+ }
69
+ return {
70
+ text: text.slice(offset, end),
71
+ nextOffset: end < text.length ? end : null
72
+ };
73
+ }
74
+ //#endregion
75
+ export { COVERAGE, boundedText, mutationLedger, renderMutation };
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Model-facing reader over the current Session's durable file-mutation receipts.
3
+ *
4
+ * @module @monotykamary/dsh-tool-session-mutations
5
+ */
6
+ import type { Context } from '@monotykamary/cordis';
7
+ import z from '@monotykamary/schemastery';
8
+ /** Cordis plugin name used by Loader diagnostics. */
9
+ export declare const name = "tool-session-mutations";
10
+ /** Service required by the model-facing Consumer. */
11
+ export declare const inject: string[];
12
+ /** Deployment-owned output bounds for the mutation-ledger reader. */
13
+ export interface Config {
14
+ /** Maximum summaries returned by one list call. */
15
+ maxListItems: number;
16
+ /** Maximum UTF-16 code units of mutation text returned by one detail page. */
17
+ maxDiffChars: number;
18
+ }
19
+ /** Validated mutation-ledger output bounds. */
20
+ export declare const Config: z<Config>;
21
+ /** Register the current-Session `changes_read` tool. */
22
+ export declare function apply(ctx: Context, config: Config): void;
23
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Package-owned invariant companion for `@monotykamary/dsh-tool-session-mutations`.
3
+ * @module @monotykamary/dsh-tool-session-mutations/invariant
4
+ */
5
+ import type { Context } from '@monotykamary/cordis';
6
+ /** Cordis companion plugin name. */
7
+ export declare const name = "tool-session-mutations-invariant";
8
+ /** Service required before the companion can reserve package ownership. */
9
+ export declare const inject: string[];
10
+ /**
11
+ * Register this package's invariant companion.
12
+ * @param ctx - Cordis context carrying the invariant service.
13
+ * @returns the installed registration's disposer after setup succeeds.
14
+ */
15
+ export declare const apply: (ctx: Context) => Promise<() => void>;
16
+ //# sourceMappingURL=invariant.d.ts.map
@@ -0,0 +1,50 @@
1
+ /** Pure projections for the model-facing mutation-ledger reader. */
2
+ import type { FileMutation, SessionEvent } from '@monotykamary/dsh-session';
3
+ /** Coverage statement returned with every ledger read. */
4
+ export declare const COVERAGE = "Receipt-aware tool mutations only; shell and external changes are not included.";
5
+ /** Compact mutation summary used by list pages. */
6
+ export interface MutationSummary {
7
+ /** Durable Session-wide mutation order. */
8
+ commitOrder: number;
9
+ /** Provider display path recorded by the mutating tool. */
10
+ path: string;
11
+ /** Committed file operation. */
12
+ operation: FileMutation['operation'];
13
+ /** Added receipt lines across all recorded hunks. */
14
+ additions: number;
15
+ /** Removed receipt lines across all recorded hunks. */
16
+ deletions: number;
17
+ /** Complete prior-content identity, or null for creation. */
18
+ beforeSha256: string | null;
19
+ /** Complete resulting-content identity, or null for deletion. */
20
+ afterSha256: string | null;
21
+ }
22
+ /** One globally ordered mutation with its durable replacement hunks. */
23
+ export interface LedgerMutation extends MutationSummary {
24
+ /** Ordered replacement hunks recorded by the tool. */
25
+ diffs: FileMutation['diffs'];
26
+ }
27
+ /**
28
+ * Read every direct and nested committed mutation from a Session in commit order.
29
+ * @param events - complete current Session event history.
30
+ * @returns detached ledger entries sorted by their durable commit order.
31
+ */
32
+ export declare function mutationLedger(events: readonly SessionEvent[]): LedgerMutation[];
33
+ /**
34
+ * Render one mutation's durable intent without claiming unified-patch semantics.
35
+ * @param mutation - committed mutation and its recorded replacement hunks.
36
+ * @returns bounded-reader source text for the selected mutation.
37
+ */
38
+ export declare function renderMutation(mutation: LedgerMutation): string;
39
+ /**
40
+ * Slice text without ending between a UTF-16 surrogate pair.
41
+ * @param text - complete rendered mutation text.
42
+ * @param offset - UTF-16 code-unit offset selected by the caller.
43
+ * @param maxChars - maximum UTF-16 code units in this page.
44
+ * @returns page text and the next offset, or null at the end.
45
+ */
46
+ export declare function boundedText(text: string, offset: number, maxChars: number): {
47
+ text: string;
48
+ nextOffset: number | null;
49
+ };
50
+ //# sourceMappingURL=ledger.d.ts.map
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "@monotykamary/dsh-tool-session-mutations",
3
+ "description": "Bounded model reader over durable file-mutation receipts in the current Session",
4
+ "version": "0.1.0",
5
+ "publishConfig": {
6
+ "access": "public"
7
+ },
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/deepseek-ai/deepseek-harness.git",
11
+ "directory": "packages/session-query/tool-session-mutations"
12
+ },
13
+ "type": "module",
14
+ "main": "lib/index.js",
15
+ "types": "lib/types/index.d.ts",
16
+ "exports": {
17
+ ".": {
18
+ "types": "./lib/types/index.d.ts",
19
+ "default": "./lib/index.js"
20
+ },
21
+ "./ledger": {
22
+ "types": "./lib/types/ledger.d.ts",
23
+ "default": "./lib/ledger.js"
24
+ },
25
+ "./invariant": {
26
+ "types": "./lib/types/invariant.d.ts",
27
+ "default": "./lib/invariant.js"
28
+ },
29
+ "./src/*": "./src/*",
30
+ "./package.json": "./package.json"
31
+ },
32
+ "files": [
33
+ "lib/index.js",
34
+ "lib/invariant.js",
35
+ "lib/ledger.js",
36
+ "lib/types/**/*.d.ts"
37
+ ],
38
+ "license": "MIT",
39
+ "dependencies": {
40
+ "@monotykamary/schemastery": "^3.18.1"
41
+ },
42
+ "peerDependencies": {
43
+ "@monotykamary/dsh-invariants": "^0.1.0",
44
+ "@monotykamary/dsh-session": "^0.1.0",
45
+ "@monotykamary/cordis": "^4.0.1",
46
+ "@monotykamary/dsh-tools": "^0.1.0"
47
+ },
48
+ "devDependencies": {
49
+ "@monotykamary/dsh-invariants": "^0.1.0",
50
+ "@monotykamary/dsh-system-prompt": "^0.1.0",
51
+ "@monotykamary/dsh-session": "^0.1.0",
52
+ "@monotykamary/dsh-llm": "^0.1.0",
53
+ "@monotykamary/dsh-tools": "^0.1.0",
54
+ "@monotykamary/cordis": "^4.0.1"
55
+ }
56
+ }