@linxin666/dsh-pet 0.1.19 → 0.2.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/README.i18n.yaml +2 -2
- package/README.md +19 -12
- package/README.zh.md +19 -12
- package/assets/whale/pet.json +9 -0
- package/lib/client.js +202 -38
- package/lib/client.js.map +1 -1
- package/lib/index.js +897 -42
- package/lib/invariant.js +1 -1
- package/lib/{state-Diiq8vjk.js → state-Ch3f4luZ.js} +51 -23
- package/lib/types/affinity.d.ts +22 -18
- package/lib/types/affinity.d.ts.map +1 -1
- package/lib/types/affinity.js +32 -6
- package/lib/types/chatter.d.ts +111 -0
- package/lib/types/chatter.d.ts.map +1 -0
- package/lib/types/chatter.js +666 -0
- package/lib/types/client/PetDockEntry.d.ts +2 -0
- package/lib/types/client/PetDockEntry.d.ts.map +1 -1
- package/lib/types/client/PetDockEntry.js +2 -2
- package/lib/types/client/PetSettingsCard.d.ts.map +1 -1
- package/lib/types/client/PetSettingsCard.js +2 -2
- package/lib/types/client/PetSprite.d.ts +2 -0
- package/lib/types/client/PetSprite.d.ts.map +1 -1
- package/lib/types/client/PetSprite.js +100 -25
- package/lib/types/client/PluginSettingsCard.d.ts +7 -1
- package/lib/types/client/PluginSettingsCard.d.ts.map +1 -1
- package/lib/types/client/PluginSettingsCard.js +5 -3
- package/lib/types/client/index.d.ts +1 -1
- package/lib/types/client/index.d.ts.map +1 -1
- package/lib/types/client/index.js +31 -6
- package/lib/types/client/locales.d.ts +82 -80
- package/lib/types/client/locales.d.ts.map +1 -1
- package/lib/types/client/locales.js +2 -0
- package/lib/types/client/sequences.d.ts +10 -0
- package/lib/types/client/sequences.d.ts.map +1 -0
- package/lib/types/client/sequences.js +20 -0
- package/lib/types/client/settings-form.d.ts.map +1 -1
- package/lib/types/client/spritesheet.d.ts +1 -1
- package/lib/types/client/spritesheet.d.ts.map +1 -1
- package/lib/types/client/spritesheet.js +3 -12
- package/lib/types/event-projection.d.ts +14 -1
- package/lib/types/event-projection.d.ts.map +1 -1
- package/lib/types/event-projection.js +38 -17
- package/lib/types/index.d.ts +2 -1
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/index.js +15 -13
- package/lib/types/invariant.js +2 -2
- package/lib/types/ledger.d.ts.map +1 -1
- package/lib/types/ledger.js +18 -10
- package/lib/types/mount-once.d.ts +25 -0
- package/lib/types/mount-once.d.ts.map +1 -0
- package/lib/types/mount-once.js +42 -0
- package/lib/types/persist.d.ts.map +1 -1
- package/lib/types/persist.js +6 -4
- package/lib/types/registry.d.ts +7 -1
- package/lib/types/registry.d.ts.map +1 -1
- package/lib/types/registry.js +37 -1
- package/lib/types/remarks.d.ts +2 -0
- package/lib/types/remarks.d.ts.map +1 -1
- package/lib/types/remarks.js +5 -0
- package/lib/types/routes.js +2 -2
- package/lib/types/service.d.ts +16 -6
- package/lib/types/service.d.ts.map +1 -1
- package/lib/types/service.js +26 -8
- package/lib/types/state.d.ts +7 -4
- package/lib/types/state.d.ts.map +1 -1
- package/lib/types/state.js +20 -20
- package/package.json +9 -9
- package/src/affinity.test.ts +4 -2
- package/src/affinity.ts +37 -6
- package/src/chatter.test.ts +154 -0
- package/src/chatter.ts +697 -0
- package/src/client/PetDockEntry.tsx +3 -0
- package/src/client/PetSprite.test.tsx +246 -4
- package/src/client/PetSprite.tsx +132 -36
- package/src/client/PluginSettingsCard.tsx +10 -0
- package/src/client/index.ts +26 -3
- package/src/client/locales.ts +2 -0
- package/src/client/pet-css.test.ts +42 -0
- package/src/client/pet.module.css +173 -22
- package/src/client/sequences.test.ts +33 -0
- package/src/client/sequences.ts +33 -0
- package/src/client/spritesheet.ts +3 -13
- package/src/event-projection.ts +49 -16
- package/src/index.ts +4 -1
- package/src/ledger.test.ts +42 -1
- package/src/ledger.ts +15 -7
- package/src/mount-once.ts +48 -0
- package/src/persist.test.ts +18 -1
- package/src/persist.ts +3 -1
- package/src/registry.test.ts +50 -3
- package/src/registry.ts +47 -3
- package/src/remarks.ts +6 -0
- package/src/service.ts +42 -9
- package/src/state.test.ts +13 -0
- package/src/state.ts +24 -18
|
@@ -6,89 +6,91 @@
|
|
|
6
6
|
export declare const NS = "pet";
|
|
7
7
|
/** Chinese copy. */
|
|
8
8
|
export declare const zh: {
|
|
9
|
-
readonly 'pet.feed':
|
|
10
|
-
readonly 'pet.hide':
|
|
11
|
-
readonly 'pet.rename':
|
|
12
|
-
readonly 'pet.confirm':
|
|
13
|
-
readonly 'pet.namePlaceholder':
|
|
14
|
-
readonly 'pet.summon':
|
|
15
|
-
readonly 'pet.rank':
|
|
16
|
-
readonly 'pet.points':
|
|
17
|
-
readonly 'pet.treats':
|
|
18
|
-
readonly 'pet.state.loading':
|
|
19
|
-
readonly 'pet.state.error':
|
|
20
|
-
readonly '
|
|
21
|
-
readonly 'settings.
|
|
22
|
-
readonly 'settings.
|
|
23
|
-
readonly 'settings.
|
|
24
|
-
readonly 'settings.
|
|
25
|
-
readonly 'settings.
|
|
26
|
-
readonly 'settings.
|
|
27
|
-
readonly 'settings.
|
|
28
|
-
readonly 'settings.
|
|
29
|
-
readonly 'settings.
|
|
30
|
-
readonly 'settings.
|
|
31
|
-
readonly 'settings.
|
|
32
|
-
readonly 'settings.
|
|
33
|
-
readonly 'settings.
|
|
34
|
-
readonly 'settings.
|
|
35
|
-
readonly 'settings.
|
|
36
|
-
readonly 'settings.
|
|
37
|
-
readonly 'settings.
|
|
38
|
-
readonly 'settings.
|
|
39
|
-
readonly 'settings.
|
|
40
|
-
readonly 'settings.
|
|
41
|
-
readonly 'settings.
|
|
42
|
-
readonly 'settings.
|
|
43
|
-
readonly 'settings.
|
|
44
|
-
readonly 'settings.
|
|
45
|
-
readonly 'settings.
|
|
46
|
-
readonly 'settings.
|
|
47
|
-
readonly 'settings.
|
|
48
|
-
readonly 'settings.
|
|
9
|
+
readonly 'pet.feed': '喂食';
|
|
10
|
+
readonly 'pet.hide': '隐藏';
|
|
11
|
+
readonly 'pet.rename': '改名';
|
|
12
|
+
readonly 'pet.confirm': '确定';
|
|
13
|
+
readonly 'pet.namePlaceholder': '输入新名字';
|
|
14
|
+
readonly 'pet.summon': '召唤{name}';
|
|
15
|
+
readonly 'pet.rank': '亲密度 {rank}';
|
|
16
|
+
readonly 'pet.points': '{points} 点';
|
|
17
|
+
readonly 'pet.treats': '小鱼干 ×{n}';
|
|
18
|
+
readonly 'pet.state.loading': '宠物正在赶来…';
|
|
19
|
+
readonly 'pet.state.error': '宠物迷路了(连接失败)';
|
|
20
|
+
readonly 'pet.openSessionHint': '点击跳转到对应会话';
|
|
21
|
+
readonly 'settings.title': '宠物';
|
|
22
|
+
readonly 'settings.description': '选择宠物并调整它的显示布局。';
|
|
23
|
+
readonly 'settings.pet': '宠物';
|
|
24
|
+
readonly 'settings.petHint': '选择显示哪只宠物;每只宠物独立命名,可在宠物悬浮面板改名。';
|
|
25
|
+
readonly 'settings.enabled': '启用宠物';
|
|
26
|
+
readonly 'settings.enabledHint': '关闭后隐藏宠物并停止轮询,可在设置里重新启用。';
|
|
27
|
+
readonly 'settings.visible': '显示宠物';
|
|
28
|
+
readonly 'settings.visibleHint': '关闭后宠物隐藏,可从聊天输入区重新召唤。';
|
|
29
|
+
readonly 'settings.size': '大小(px)';
|
|
30
|
+
readonly 'settings.sizeHint': '精灵单元高度,范围 32–512。';
|
|
31
|
+
readonly 'settings.right': '距右侧(px)';
|
|
32
|
+
readonly 'settings.rightHint': '距视口右边缘的水平内缩距离。';
|
|
33
|
+
readonly 'settings.bottom': '距底部(px)';
|
|
34
|
+
readonly 'settings.bottomHint': '距视口底边的垂直内缩距离。';
|
|
35
|
+
readonly 'settings.inherit': '继承';
|
|
36
|
+
readonly 'settings.on': '开';
|
|
37
|
+
readonly 'settings.off': '关';
|
|
38
|
+
readonly 'settings.overridden': '已覆盖';
|
|
39
|
+
readonly 'settings.reset': '恢复默认';
|
|
40
|
+
readonly 'settings.notExposed': '当前 DSH 版本未向设置页暴露本插件的配置命名空间,表单不可用。可编辑 ~/.dsh/settings.yaml 直接配置,或为 dsh-host-apiproxy 的 WEB_SETTINGS_NAMESPACES 白名单补充本命名空间后重启。';
|
|
41
|
+
readonly 'settings.readOnly': '当前部署的设置只读。';
|
|
42
|
+
readonly 'settings.expand': '展开设置';
|
|
43
|
+
readonly 'settings.collapse': '收起设置';
|
|
44
|
+
readonly 'settings.save': '保存';
|
|
45
|
+
readonly 'settings.saving': '保存中…';
|
|
46
|
+
readonly 'settings.discard': '放弃';
|
|
47
|
+
readonly 'settings.unsaved': '未保存';
|
|
48
|
+
readonly 'settings.saveFailed': '部署未接受这些值,已保留供你修改。';
|
|
49
|
+
readonly 'settings.invalidNumber': '请输入数字,留空则使用默认值。';
|
|
49
50
|
};
|
|
50
51
|
/** English copy. */
|
|
51
52
|
export declare const en: {
|
|
52
|
-
readonly 'pet.feed':
|
|
53
|
-
readonly 'pet.hide':
|
|
54
|
-
readonly 'pet.rename':
|
|
55
|
-
readonly 'pet.confirm':
|
|
56
|
-
readonly 'pet.namePlaceholder':
|
|
57
|
-
readonly 'pet.summon':
|
|
58
|
-
readonly 'pet.rank':
|
|
59
|
-
readonly 'pet.points':
|
|
60
|
-
readonly 'pet.treats':
|
|
61
|
-
readonly 'pet.state.loading':
|
|
62
|
-
readonly 'pet.state.error':
|
|
63
|
-
readonly '
|
|
64
|
-
readonly 'settings.
|
|
65
|
-
readonly 'settings.
|
|
66
|
-
readonly 'settings.
|
|
67
|
-
readonly 'settings.
|
|
68
|
-
readonly 'settings.
|
|
69
|
-
readonly 'settings.
|
|
70
|
-
readonly 'settings.
|
|
71
|
-
readonly 'settings.
|
|
72
|
-
readonly 'settings.
|
|
73
|
-
readonly 'settings.
|
|
74
|
-
readonly 'settings.
|
|
75
|
-
readonly 'settings.
|
|
76
|
-
readonly 'settings.
|
|
77
|
-
readonly 'settings.
|
|
78
|
-
readonly 'settings.
|
|
79
|
-
readonly 'settings.
|
|
80
|
-
readonly 'settings.
|
|
81
|
-
readonly 'settings.
|
|
82
|
-
readonly 'settings.
|
|
83
|
-
readonly 'settings.
|
|
84
|
-
readonly 'settings.
|
|
85
|
-
readonly 'settings.
|
|
86
|
-
readonly 'settings.
|
|
87
|
-
readonly 'settings.
|
|
88
|
-
readonly 'settings.
|
|
89
|
-
readonly 'settings.
|
|
90
|
-
readonly 'settings.
|
|
91
|
-
readonly 'settings.
|
|
53
|
+
readonly 'pet.feed': 'Feed';
|
|
54
|
+
readonly 'pet.hide': 'Hide';
|
|
55
|
+
readonly 'pet.rename': 'Rename';
|
|
56
|
+
readonly 'pet.confirm': 'OK';
|
|
57
|
+
readonly 'pet.namePlaceholder': 'Enter a new name';
|
|
58
|
+
readonly 'pet.summon': 'Summon {name}';
|
|
59
|
+
readonly 'pet.rank': 'Affinity {rank}';
|
|
60
|
+
readonly 'pet.points': '{points} pts';
|
|
61
|
+
readonly 'pet.treats': 'Treats ×{n}';
|
|
62
|
+
readonly 'pet.state.loading': 'The pet is on its way…';
|
|
63
|
+
readonly 'pet.state.error': 'The pet is lost (connection failed)';
|
|
64
|
+
readonly 'pet.openSessionHint': 'Click to jump to this session';
|
|
65
|
+
readonly 'settings.title': 'Pet';
|
|
66
|
+
readonly 'settings.description': 'Pick a pet and tune its display layout.';
|
|
67
|
+
readonly 'settings.pet': 'Pet';
|
|
68
|
+
readonly 'settings.petHint': 'Choose which pet shows. Names are stored per pet; rename from the pet hover panel.';
|
|
69
|
+
readonly 'settings.enabled': 'Enable the pet';
|
|
70
|
+
readonly 'settings.enabledHint': 'When off, the pet hides and polling stops; re-enable it here.';
|
|
71
|
+
readonly 'settings.visible': 'Show the pet';
|
|
72
|
+
readonly 'settings.visibleHint': 'When off, the pet hides; summon it again from the input row.';
|
|
73
|
+
readonly 'settings.size': 'Size (px)';
|
|
74
|
+
readonly 'settings.sizeHint': 'Sprite cell height, 32–512.';
|
|
75
|
+
readonly 'settings.right': 'Right inset (px)';
|
|
76
|
+
readonly 'settings.rightHint': 'Horizontal inset from the viewport right edge.';
|
|
77
|
+
readonly 'settings.bottom': 'Bottom inset (px)';
|
|
78
|
+
readonly 'settings.bottomHint': 'Vertical inset from the viewport bottom edge.';
|
|
79
|
+
readonly 'settings.inherit': 'Inherit';
|
|
80
|
+
readonly 'settings.on': 'On';
|
|
81
|
+
readonly 'settings.off': 'Off';
|
|
82
|
+
readonly 'settings.overridden': 'Overridden';
|
|
83
|
+
readonly 'settings.reset': 'Reset to default';
|
|
84
|
+
readonly 'settings.notExposed': 'This DSH version does not expose this plugin\'s settings namespace to the configuration page, so the form is unavailable. Edit ~/.dsh/settings.yaml directly, or add the namespace to dsh-host-apiproxy\'s WEB_SETTINGS_NAMESPACES allowlist and restart.';
|
|
85
|
+
readonly 'settings.readOnly': 'This deployment stores settings read-only.';
|
|
86
|
+
readonly 'settings.expand': 'Show settings';
|
|
87
|
+
readonly 'settings.collapse': 'Hide settings';
|
|
88
|
+
readonly 'settings.save': 'Save';
|
|
89
|
+
readonly 'settings.saving': 'Saving…';
|
|
90
|
+
readonly 'settings.discard': 'Discard';
|
|
91
|
+
readonly 'settings.unsaved': 'Unsaved';
|
|
92
|
+
readonly 'settings.saveFailed': 'The deployment did not accept these values; they were left for you to correct.';
|
|
93
|
+
readonly 'settings.invalidNumber': 'Enter a number, or leave blank to use the default.';
|
|
92
94
|
};
|
|
93
95
|
/** Key union for this namespace. */
|
|
94
96
|
export type PetKey = keyof typeof zh;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../../../src/client/locales.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,mDAAmD;AACnD,eAAO,MAAM,EAAE,QAAQ,CAAA;AAEvB,oBAAoB;AACpB,eAAO,MAAM,EAAE
|
|
1
|
+
{"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../../../src/client/locales.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,6 +17,7 @@ export const zh = {
|
|
|
17
17
|
'pet.treats': '小鱼干 ×{n}',
|
|
18
18
|
'pet.state.loading': '宠物正在赶来…',
|
|
19
19
|
'pet.state.error': '宠物迷路了(连接失败)',
|
|
20
|
+
'pet.openSessionHint': '点击跳转到对应会话',
|
|
20
21
|
// 一级设置页(settings.section 席位)。
|
|
21
22
|
'settings.title': '宠物',
|
|
22
23
|
'settings.description': '选择宠物并调整它的显示布局。',
|
|
@@ -61,6 +62,7 @@ export const en = {
|
|
|
61
62
|
'pet.treats': 'Treats ×{n}',
|
|
62
63
|
'pet.state.loading': 'The pet is on its way…',
|
|
63
64
|
'pet.state.error': 'The pet is lost (connection failed)',
|
|
65
|
+
'pet.openSessionHint': 'Click to jump to this session',
|
|
64
66
|
// First-level settings section (the `settings.section` seat).
|
|
65
67
|
'settings.title': 'Pet',
|
|
66
68
|
'settings.description': 'Pick a pet and tune its display layout.',
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Pure timing helpers for manifest-defined scene animation sequences. */
|
|
2
|
+
import type { PetTrackDef } from '../registry.ts';
|
|
3
|
+
import type { PetAnimation } from '../state.ts';
|
|
4
|
+
export interface SequenceFrame {
|
|
5
|
+
animation: PetAnimation;
|
|
6
|
+
frameIndex: number;
|
|
7
|
+
}
|
|
8
|
+
/** Resolve the active track and frame after elapsed milliseconds of a looping sequence. */
|
|
9
|
+
export declare function sequenceFrameAt(sequence: readonly PetAnimation[], tracks: Record<PetAnimation, PetTrackDef>, elapsedMs: number): SequenceFrame;
|
|
10
|
+
//# sourceMappingURL=sequences.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sequences.d.ts","sourceRoot":"","sources":["../../../src/client/sequences.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAE1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE/C,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,YAAY,CAAA;IACvB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,2FAA2F;AAC3F,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,SAAS,YAAY,EAAE,EACjC,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,WAAW,CAAC,EACzC,SAAS,EAAE,MAAM,GAChB,aAAa,CAiBf"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** Pure timing helpers for manifest-defined scene animation sequences. */
|
|
2
|
+
/** Resolve the active track and frame after elapsed milliseconds of a looping sequence. */
|
|
3
|
+
export function sequenceFrameAt(sequence, tracks, elapsedMs) {
|
|
4
|
+
const itemDurations = sequence.map(animation => tracks[animation].durations.reduce((sum, value) => sum + value, 0));
|
|
5
|
+
const sequenceDuration = itemDurations.reduce((sum, value) => sum + value, 0);
|
|
6
|
+
let offset = Math.max(0, elapsedMs) % sequenceDuration;
|
|
7
|
+
let itemIndex = 0;
|
|
8
|
+
while (itemIndex < sequence.length - 1 && offset >= itemDurations[itemIndex]) {
|
|
9
|
+
offset -= itemDurations[itemIndex];
|
|
10
|
+
itemIndex += 1;
|
|
11
|
+
}
|
|
12
|
+
const animation = sequence[itemIndex];
|
|
13
|
+
const track = tracks[animation];
|
|
14
|
+
let frameIndex = 0;
|
|
15
|
+
while (frameIndex < track.frames.length - 1 && offset >= track.durations[frameIndex]) {
|
|
16
|
+
offset -= track.durations[frameIndex];
|
|
17
|
+
frameIndex += 1;
|
|
18
|
+
}
|
|
19
|
+
return { animation, frameIndex };
|
|
20
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-form.d.ts","sourceRoot":"","sources":["../../../src/client/settings-form.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"settings-form.d.ts","sourceRoot":"","sources":["../../../src/client/settings-form.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* guard track lengths, and map the fixed 9-row animation contract.
|
|
7
7
|
* @module @linxin666/dsh-pet/client/spritesheet
|
|
8
8
|
*/
|
|
9
|
-
import type
|
|
9
|
+
import { type PetAnimation } from '../state.ts';
|
|
10
10
|
import type { PetCell, PetTrackDef } from '../registry.ts';
|
|
11
11
|
/** Animation track shape the frame loop consumes. */
|
|
12
12
|
export type TrackDef = PetTrackDef;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spritesheet.d.ts","sourceRoot":"","sources":["../../../src/client/spritesheet.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"spritesheet.d.ts","sourceRoot":"","sources":["../../../src/client/spritesheet.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,aAAa,CAAA;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAE1D,qDAAqD;AACrD,MAAM,MAAM,QAAQ,GAAG,WAAW,CAAA;AAElC,mEAAmE;AACnE,wBAAgB,UAAU,CAAC,SAAS,EAAE,YAAY,GAAG,MAAM,CAG1D;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAE3H;AAED,uCAAuC;AACvC,wBAAgB,aAAa,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAErD;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,GAAG,QAAQ,CAQvE"}
|
|
@@ -6,20 +6,11 @@
|
|
|
6
6
|
* guard track lengths, and map the fixed 9-row animation contract.
|
|
7
7
|
* @module @linxin666/dsh-pet/client/spritesheet
|
|
8
8
|
*/
|
|
9
|
+
import { rowOf } from '../state.js';
|
|
9
10
|
/** Row index of one animation track (the fixed 9-row contract). */
|
|
10
11
|
export function rowOfTrack(animation) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
'running-right': 1,
|
|
14
|
-
'running-left': 2,
|
|
15
|
-
waving: 3,
|
|
16
|
-
jumping: 4,
|
|
17
|
-
failed: 5,
|
|
18
|
-
waiting: 6,
|
|
19
|
-
running: 7,
|
|
20
|
-
review: 8,
|
|
21
|
-
};
|
|
22
|
-
return rows[animation];
|
|
12
|
+
// The table itself lives in state.ts (rowOf) — the single source of truth.
|
|
13
|
+
return rowOf(animation);
|
|
23
14
|
}
|
|
24
15
|
/**
|
|
25
16
|
* Background-position (px) of one frame cell within the scaled atlas.
|
|
@@ -3,10 +3,16 @@
|
|
|
3
3
|
* vocabulary onto the pet's visual phases and carries an optional completed-
|
|
4
4
|
* turn reward for the ledger. Holds no state of its own; callers keep a
|
|
5
5
|
* {@link ProjectionRuntime} per session and feed events in arrival order.
|
|
6
|
+
*
|
|
7
|
+
* Status copy comes from the chatter voice (big rotating pools, per-tool
|
|
8
|
+
* families, real-argument hints), and streamed model output feeds the murmur
|
|
9
|
+
* engine so the pet can whisper its inner voice (碎碎念). The wall clock is
|
|
10
|
+
* injected by the caller, keeping every projection reproducible.
|
|
6
11
|
* @module @linxin666/dsh-pet/event-projection
|
|
7
12
|
*/
|
|
8
13
|
import type { SessionEvent } from '@deepseek-ai/dsh-session';
|
|
9
14
|
import type { PetStateInput } from './state.ts';
|
|
15
|
+
import { StatusVoice, WhisperEngine } from './chatter.ts';
|
|
10
16
|
/** Runtime shape of the optional legacy activity event. */
|
|
11
17
|
export interface ActivityStatusEventLike {
|
|
12
18
|
phase?: string;
|
|
@@ -18,11 +24,17 @@ export interface ProjectionRuntime {
|
|
|
18
24
|
activeTools: Set<string>;
|
|
19
25
|
officialEventsSeen: boolean;
|
|
20
26
|
stepHadFailure: boolean;
|
|
27
|
+
/** Round-robin status copy voice (scene-stable, cadence-rotated). */
|
|
28
|
+
voice: StatusVoice;
|
|
29
|
+
/** Inner-whisper engine fed by the model's own streamed output. */
|
|
30
|
+
whispers: WhisperEngine;
|
|
21
31
|
}
|
|
22
32
|
/** One official event projection, optionally carrying a completed turn reward. */
|
|
23
33
|
export interface PetActivityTransition {
|
|
24
34
|
input: PetStateInput;
|
|
25
35
|
completedTurn?: number;
|
|
36
|
+
/** A fresh inner whisper woken by this event's model output, when any. */
|
|
37
|
+
whisper?: string;
|
|
26
38
|
}
|
|
27
39
|
/** Fresh projection runtime for a newly seen session. */
|
|
28
40
|
export declare function emptyProjectionRuntime(): ProjectionRuntime;
|
|
@@ -31,6 +43,7 @@ export declare function isActivityPhase(phase: string): phase is PetStateInput['
|
|
|
31
43
|
/**
|
|
32
44
|
* Project the durable DSH session vocabulary into the pet's visual phases.
|
|
33
45
|
* Unknown and log-only events do not disturb the last meaningful activity.
|
|
46
|
+
* @param nowMs - injected wall clock for copy rotation and whisper pacing.
|
|
34
47
|
*/
|
|
35
|
-
export declare function projectOfficialEvent(event: SessionEvent, runtime: ProjectionRuntime): PetActivityTransition | undefined;
|
|
48
|
+
export declare function projectOfficialEvent(event: SessionEvent, runtime: ProjectionRuntime, nowMs?: number): PetActivityTransition | undefined;
|
|
36
49
|
//# sourceMappingURL=event-projection.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-projection.d.ts","sourceRoot":"","sources":["../../src/event-projection.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"event-projection.d.ts","sourceRoot":"","sources":["../../src/event-projection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAe,aAAa,EAAE,MAAM,cAAc,CAAA;AAEtE,2DAA2D;AAC3D,MAAM,WAAW,uBAAuB;IACtC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,qEAAqE;AACrE,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACxB,kBAAkB,EAAE,OAAO,CAAA;IAC3B,cAAc,EAAE,OAAO,CAAA;IACvB,qEAAqE;IACrE,KAAK,EAAE,WAAW,CAAA;IAClB,mEAAmE;IACnE,QAAQ,EAAE,aAAa,CAAA;CACxB;AAED,kFAAkF;AAClF,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,aAAa,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,0EAA0E;IAC1E,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,yDAAyD;AACzD,wBAAgB,sBAAsB,IAAI,iBAAiB,CAQ1D;AAQD,wEAAwE;AACxE,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,aAAa,CAAC,OAAO,CAAC,CAE9E;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,iBAAiB,EAC1B,KAAK,GAAE,MAAmB,GACzB,qBAAqB,GAAG,SAAS,CAwFnC"}
|
|
@@ -3,16 +3,28 @@
|
|
|
3
3
|
* vocabulary onto the pet's visual phases and carries an optional completed-
|
|
4
4
|
* turn reward for the ledger. Holds no state of its own; callers keep a
|
|
5
5
|
* {@link ProjectionRuntime} per session and feed events in arrival order.
|
|
6
|
+
*
|
|
7
|
+
* Status copy comes from the chatter voice (big rotating pools, per-tool
|
|
8
|
+
* families, real-argument hints), and streamed model output feeds the murmur
|
|
9
|
+
* engine so the pet can whisper its inner voice (碎碎念). The wall clock is
|
|
10
|
+
* injected by the caller, keeping every projection reproducible.
|
|
6
11
|
* @module @linxin666/dsh-pet/event-projection
|
|
7
12
|
*/
|
|
13
|
+
import { StatusVoice, toolArgHint, WhisperEngine } from './chatter.js';
|
|
8
14
|
/** Fresh projection runtime for a newly seen session. */
|
|
9
15
|
export function emptyProjectionRuntime() {
|
|
10
|
-
return {
|
|
16
|
+
return {
|
|
17
|
+
activeTools: new Set(),
|
|
18
|
+
officialEventsSeen: false,
|
|
19
|
+
stepHadFailure: false,
|
|
20
|
+
voice: new StatusVoice(),
|
|
21
|
+
whispers: new WhisperEngine(),
|
|
22
|
+
};
|
|
11
23
|
}
|
|
12
24
|
/** Keep tool names readable inside the compact status bubble. */
|
|
13
25
|
function displayToolName(name) {
|
|
14
26
|
const compact = name.replace(/\s+/g, ' ').trim() || '工具';
|
|
15
|
-
return compact.length <= 24 ? compact :
|
|
27
|
+
return compact.length <= 24 ? compact : compact.slice(0, 21) + '...';
|
|
16
28
|
}
|
|
17
29
|
/** Whether a legacy phase is part of the pet's supported vocabulary. */
|
|
18
30
|
export function isActivityPhase(phase) {
|
|
@@ -21,35 +33,44 @@ export function isActivityPhase(phase) {
|
|
|
21
33
|
/**
|
|
22
34
|
* Project the durable DSH session vocabulary into the pet's visual phases.
|
|
23
35
|
* Unknown and log-only events do not disturb the last meaningful activity.
|
|
36
|
+
* @param nowMs - injected wall clock for copy rotation and whisper pacing.
|
|
24
37
|
*/
|
|
25
|
-
export function projectOfficialEvent(event, runtime) {
|
|
38
|
+
export function projectOfficialEvent(event, runtime, nowMs = Date.now()) {
|
|
26
39
|
switch (event.type) {
|
|
27
40
|
case 'turn/start':
|
|
28
41
|
runtime.activeTools.clear();
|
|
29
42
|
runtime.stepHadFailure = false;
|
|
30
|
-
return { input: { phase: 'waiting', line: '
|
|
43
|
+
return { input: { phase: 'waiting', line: runtime.voice.scene('prepare', nowMs) } };
|
|
31
44
|
case 'step/start':
|
|
32
45
|
runtime.activeTools.clear();
|
|
33
46
|
runtime.stepHadFailure = false;
|
|
34
|
-
return { input: { phase: 'waiting', line: '
|
|
47
|
+
return { input: { phase: 'waiting', line: runtime.voice.scene('waiting', nowMs) } };
|
|
35
48
|
case 'assistant/chunk': {
|
|
36
49
|
const { chunk } = event.data;
|
|
37
50
|
if (chunk.type === 'reasoning-delta' && chunk.text.length > 0) {
|
|
38
|
-
|
|
51
|
+
const whisper = runtime.whispers.feed(chunk.text, nowMs);
|
|
52
|
+
return {
|
|
53
|
+
input: { phase: 'thinking', line: runtime.voice.scene('thinking', nowMs) },
|
|
54
|
+
...(whisper === undefined ? {} : { whisper }),
|
|
55
|
+
};
|
|
39
56
|
}
|
|
40
57
|
if (chunk.type === 'text-delta' && chunk.text.length > 0) {
|
|
41
|
-
|
|
58
|
+
const whisper = runtime.whispers.feed(chunk.text, nowMs);
|
|
59
|
+
return {
|
|
60
|
+
input: { phase: 'review', line: runtime.voice.scene('review', nowMs) },
|
|
61
|
+
...(whisper === undefined ? {} : { whisper }),
|
|
62
|
+
};
|
|
42
63
|
}
|
|
43
64
|
return undefined;
|
|
44
65
|
}
|
|
45
66
|
case 'assistant/message':
|
|
46
|
-
return { input: { phase: 'review', line: '
|
|
67
|
+
return { input: { phase: 'review', line: runtime.voice.scene('review', nowMs) } };
|
|
47
68
|
case 'tool/call':
|
|
48
69
|
runtime.activeTools.add(String(event.data.callId));
|
|
49
70
|
return {
|
|
50
71
|
input: {
|
|
51
72
|
phase: 'tool',
|
|
52
|
-
line:
|
|
73
|
+
line: runtime.voice.tool(event.data.name, displayToolName(event.data.name), toolArgHint(event.data.name, event.data.arguments), nowMs),
|
|
53
74
|
},
|
|
54
75
|
};
|
|
55
76
|
case 'tool/result': {
|
|
@@ -60,30 +81,30 @@ export function projectOfficialEvent(event, runtime) {
|
|
|
60
81
|
return {
|
|
61
82
|
input: {
|
|
62
83
|
phase: 'tool',
|
|
63
|
-
line:
|
|
84
|
+
line: runtime.voice.toolRemaining(runtime.activeTools.size, nowMs),
|
|
64
85
|
},
|
|
65
86
|
};
|
|
66
87
|
}
|
|
67
88
|
return runtime.stepHadFailure
|
|
68
|
-
? { input: { phase: 'failed', line: '
|
|
69
|
-
: { input: { phase: 'thinking', line: '
|
|
89
|
+
? { input: { phase: 'failed', line: runtime.voice.scene('toolFailed', nowMs) } }
|
|
90
|
+
: { input: { phase: 'thinking', line: runtime.voice.scene('toolResult', nowMs) } };
|
|
70
91
|
}
|
|
71
92
|
case 'turn/end': {
|
|
72
93
|
runtime.activeTools.clear();
|
|
73
94
|
switch (event.data.reason.kind) {
|
|
74
95
|
case 'completed':
|
|
75
96
|
return {
|
|
76
|
-
input: { phase: 'done', line: '
|
|
97
|
+
input: { phase: 'done', line: runtime.voice.scene('done', nowMs) },
|
|
77
98
|
completedTurn: event.data.turn,
|
|
78
99
|
};
|
|
79
100
|
case 'error':
|
|
80
|
-
return { input: { phase: 'failed', line: '
|
|
101
|
+
return { input: { phase: 'failed', line: runtime.voice.scene('failed', nowMs) } };
|
|
81
102
|
case 'max-tokens':
|
|
82
|
-
return { input: { phase: 'failed', line: '
|
|
103
|
+
return { input: { phase: 'failed', line: runtime.voice.scene('maxTokens', nowMs) } };
|
|
83
104
|
case 'interrupted':
|
|
84
|
-
return { input: { phase: 'failed', line: '
|
|
105
|
+
return { input: { phase: 'failed', line: runtime.voice.scene('interrupted', nowMs) } };
|
|
85
106
|
case 'blocked':
|
|
86
|
-
return { input: { phase: 'waiting', line: '
|
|
107
|
+
return { input: { phase: 'waiting', line: runtime.voice.scene('blocked', nowMs) } };
|
|
87
108
|
case 'aborted':
|
|
88
109
|
// A stopped session settles to idle without a bubble: the pet
|
|
89
110
|
// visibly calms down and the session drops out of the bubble stack.
|
package/lib/types/index.d.ts
CHANGED
|
@@ -56,5 +56,6 @@ export declare function makePetSettingsSchema(fallbackPetId: string): z<Schemast
|
|
|
56
56
|
enabled: z<boolean, boolean>;
|
|
57
57
|
}>>;
|
|
58
58
|
/** Register the pet service and its API + asset routes on the context. */
|
|
59
|
-
export declare
|
|
59
|
+
export declare const apply: typeof applyImpl;
|
|
60
|
+
declare function applyImpl(ctx: Context, config?: PetConfig): void;
|
|
60
61
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/types/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAG7C,OAAO,CAAC,MAAM,aAAa,CAAA;AAC3B,OAAO,EAAsC,KAAK,SAAS,EAA2B,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAG7C,OAAO,CAAC,MAAM,aAAa,CAAA;AAC3B,OAAO,EAAsC,KAAK,SAAS,EAA2B,MAAM,cAAc,CAAA;AAM1G,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAC9D,YAAY,EACV,SAAS,EACT,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,YAAY,GACb,MAAM,cAAc,CAAA;AACrB,OAAO,EACL,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,MAAM,GACP,MAAM,eAAe,CAAA;AACtB,YAAY,EACV,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,cAAc,GACf,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,KAAK,GACN,MAAM,YAAY,CAAA;AACnB,YAAY,EACV,aAAa,EACb,YAAY,EACZ,cAAc,EACd,aAAa,EACb,gBAAgB,GACjB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,aAAa,CAAA;AACpB,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC5E,OAAO,EACL,eAAe,EACf,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,mBAAmB,GACpB,MAAM,cAAc,CAAA;AACrB,YAAY,EAAE,UAAU,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAC9E,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,YAAY,EACZ,cAAc,EACd,UAAU,EACV,cAAc,GACf,MAAM,cAAc,CAAA;AACrB,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAChE,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,EACtB,aAAa,EACb,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,cAAc,EACd,kBAAkB,GACnB,MAAM,eAAe,CAAA;AACtB,YAAY,EACV,aAAa,EACb,QAAQ,EACR,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,gBAAgB,GACjB,MAAM,eAAe,CAAA;AAEtB,OAAO,EACL,aAAa,EACb,cAAc,EACd,gBAAgB,GACjB,MAAM,aAAa,CAAA;AAEpB,sEAAsE;AACtE,eAAO,MAAM,IAAI,QAAQ,CAAA;AAEzB,+DAA+D;AAC/D,eAAO,MAAM,MAAM,UAAgB,CAAA;AAEnC;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,MAAM;;;;;;;;;;;;;;IAS1D;AAED,0EAA0E;AAC1E,eAAO,MAAM,KAAK,kBAA6C,CAAA;AAE/D,iBAAS,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,GAAE,SAAc,GAAG,IAAI,CA+D7D"}
|
package/lib/types/index.js
CHANGED
|
@@ -12,18 +12,19 @@
|
|
|
12
12
|
*/
|
|
13
13
|
import { installSettingsSection, settingsNamespace } from '@deepseek-ai/dsh-settings';
|
|
14
14
|
import z from 'schemastery';
|
|
15
|
-
import { PetService, PET_SETTINGS_NAMESPACE } from
|
|
16
|
-
import { makePetRoutes } from
|
|
17
|
-
import { loadPetRegistry, petPackageRoot } from
|
|
18
|
-
import { DISPLAY_INSET_MAX, DISPLAY_SIZE_MAX, DISPLAY_SIZE_MIN } from
|
|
19
|
-
|
|
20
|
-
export {
|
|
21
|
-
export {
|
|
22
|
-
export {
|
|
23
|
-
export {
|
|
24
|
-
export {
|
|
25
|
-
export {
|
|
26
|
-
export {
|
|
15
|
+
import { PetService, PET_SETTINGS_NAMESPACE } from './service.js';
|
|
16
|
+
import { makePetRoutes } from './routes.js';
|
|
17
|
+
import { loadPetRegistry, petPackageRoot } from './registry.js';
|
|
18
|
+
import { DISPLAY_INSET_MAX, DISPLAY_SIZE_MAX, DISPLAY_SIZE_MIN } from './persist.js';
|
|
19
|
+
import { mountOnce } from './mount-once.js';
|
|
20
|
+
export { PetService, MAX_SESSION_BUBBLES } from './service.js';
|
|
21
|
+
export { AFFINITY_MAX, AFFINITY_RANKS, applyInteraction, applyTurnReward, emptyAffinity, rankOf, } from './affinity.js';
|
|
22
|
+
export { animationForPhase, PetStateMachine, rowOf, } from './state.js';
|
|
23
|
+
export { consumeTreat, defaultTreatConfig, emptyTreatLedger, settleTreatGrants, } from './treats.js';
|
|
24
|
+
export { BUILTIN_REMARKS, REMARK_KINDS, REMARK_LINE_MAX, REMARK_LINES_MAX, RemarkPicker, builtinRemark, normalizePetRemarks, } from './remarks.js';
|
|
25
|
+
export { DEFAULT_PET_ID, DEFAULT_PET_NAME, PET_NAME_MAX_LENGTH, defaultDisplayConfig, emptyPersist, loadPetPersist, petHomeDir, savePetPersist, } from './persist.js';
|
|
26
|
+
export { DEFAULT_FRAME_COUNTS, DEFAULT_PET_CELL, DEFAULT_PET_COLUMNS, DEFAULT_PET_ROW_COUNT, DEFAULT_TRACK_PATTERNS, PET_ROW_ORDER, codexPetsDir, loadPetRegistry, petEntryView, petPackageRoot, resolvePetManifest, } from './registry.js';
|
|
27
|
+
export { makePetRoutes, PET_API_PREFIX, PET_ASSET_PREFIX, } from './routes.js';
|
|
27
28
|
/** Stable cordis plugin name (matches cordis.patch.yml insert id). */
|
|
28
29
|
export const name = 'pet';
|
|
29
30
|
/** Services required before the pet can mount its surfaces. */
|
|
@@ -47,7 +48,8 @@ export function makePetSettingsSchema(fallbackPetId) {
|
|
|
47
48
|
});
|
|
48
49
|
}
|
|
49
50
|
/** Register the pet service and its API + asset routes on the context. */
|
|
50
|
-
export
|
|
51
|
+
export const apply = mountOnce('@linxin666/dsh-pet', applyImpl);
|
|
52
|
+
function applyImpl(ctx, config = {}) {
|
|
51
53
|
const registry = config.registry
|
|
52
54
|
?? loadPetRegistry({
|
|
53
55
|
packageRoot: petPackageRoot(import.meta.url),
|
package/lib/types/invariant.js
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* host side. Mirrors the pattern used by other dsh plugin packages.
|
|
4
4
|
* @module @linxin666/dsh-pet/invariant
|
|
5
5
|
*/
|
|
6
|
-
import { AFFINITY_MAX, AFFINITY_RANKS, defaultAffinityConfig } from
|
|
7
|
-
import { animationForPhase } from
|
|
6
|
+
import { AFFINITY_MAX, AFFINITY_RANKS, defaultAffinityConfig } from './affinity.js';
|
|
7
|
+
import { animationForPhase } from './state.js';
|
|
8
8
|
/** Assert a condition; throws a descriptive Error when violated. */
|
|
9
9
|
export function invariant(condition, message) {
|
|
10
10
|
if (!condition) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ledger.d.ts","sourceRoot":"","sources":["../../src/ledger.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAKL,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,cAAc,EACpB,MAAM,eAAe,CAAA;AACtB,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,cAAc,CAAA;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAEhE,iDAAiD;AACjD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;IAClC,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;IAC7B,mFAAmF;IACnF,OAAO,CAAC,EAAE,UAAU,CAAA;CACrB;AAED,wEAAwE;AACxE,MAAM,WAAW,uBAAuB;IACtC,4BAA4B;IAC5B,QAAQ,EAAE,MAAM,CAAA;IAChB,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAA;IACb,6DAA6D;IAC7D,QAAQ,EAAE,eAAe,CAAA;CAC1B;AAED;;;;GAIG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAC/C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,0EAA0E;IAC1E,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,OAAO,CAAY;IAC3B,oFAAoF;IACpF,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,sBAAsB,CAAI;IAClC,OAAO,CAAC,KAAK,CAAQ;
|
|
1
|
+
{"version":3,"file":"ledger.d.ts","sourceRoot":"","sources":["../../src/ledger.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAKL,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,cAAc,EACpB,MAAM,eAAe,CAAA;AACtB,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,cAAc,CAAA;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAEhE,iDAAiD;AACjD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;IAClC,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;IAC7B,mFAAmF;IACnF,OAAO,CAAC,EAAE,UAAU,CAAA;CACrB;AAED,wEAAwE;AACxE,MAAM,WAAW,uBAAuB;IACtC,4BAA4B;IAC5B,QAAQ,EAAE,MAAM,CAAA;IAChB,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAA;IACb,6DAA6D;IAC7D,QAAQ,EAAE,eAAe,CAAA;CAC1B;AAED;;;;GAIG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAC/C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,0EAA0E;IAC1E,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,OAAO,CAAY;IAC3B,oFAAoF;IACpF,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,sBAAsB,CAAI;IAClC,OAAO,CAAC,KAAK,CAAQ;IAErB,YAAY,OAAO,EAAE,UAAU,EAAE,MAAM,GAAE,YAAiB,EAKzD;IAED,iDAAiD;IACjD,IAAI,QAAQ,IAAI,cAAc,CAE7B;IAED,qEAAqE;IACrE,IAAI,QAAQ,IAAI,UAAU,CAEzB;IAED,qCAAqC;IACrC,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,+DAA+D;IAC/D,SAAS,IAAI,OAAO,CAInB;IAED;;;OAGG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAErC;IAED,mEAAmE;IACnE,UAAU,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAG1C;IAED,uEAAuE;IACvE,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAI5B;IAED,0EAA0E;IAC1E,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAG5C;IAED;;;OAGG;IACH,UAAU,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,CAErC;IAED;;;;;OAKG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAWnC;IAED;;;;OAIG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAOlE;IAED,8EAA8E;IAC9E,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAOvC;IAED,OAAO,CAAC,eAAe;IASvB;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,uBAAuB,CAsCrE;IAED,kDAAkD;IAClD,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,CAE3C;CACF"}
|