@danceiny/gotry 0.0.1-rc.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +267 -0
  3. package/bin/gotry-inner.js +214 -0
  4. package/bin/gotry-stdio-ask.js +59 -0
  5. package/bin/gotry.js +28 -0
  6. package/cordis.gotry-patch.yml +86 -0
  7. package/data/flights_2026.json +218 -0
  8. package/data/golden_erhai.json +92 -0
  9. package/data/golden_trip_2026.json +75 -0
  10. package/data/hotels_2026.json +151 -0
  11. package/data/openflights-skeleton.json +895 -0
  12. package/data/time-slot-eval.json +384 -0
  13. package/data/yunnan-pack.json +202 -0
  14. package/dist/capabilities/agent-reach-bridge.py +90 -0
  15. package/dist/capabilities/agent-reach-deep.js +172 -0
  16. package/dist/capabilities/agent-reach.js +204 -0
  17. package/dist/capabilities/anything.js +139 -0
  18. package/dist/capabilities/flyai.js +131 -0
  19. package/dist/capabilities/hbcli.js +143 -0
  20. package/dist/capabilities/incident-log.js +100 -0
  21. package/dist/capabilities/opensky.js +74 -0
  22. package/dist/capabilities/session/action-cache.js +120 -0
  23. package/dist/capabilities/session/adapters/ctrip-flight.js +83 -0
  24. package/dist/capabilities/session/adapters/meituan-local.js +73 -0
  25. package/dist/capabilities/session/extract.js +40 -0
  26. package/dist/capabilities/session/read-guard.js +99 -0
  27. package/dist/capabilities/session/transport.js +101 -0
  28. package/dist/capabilities/session-search.js +93 -0
  29. package/dist/capabilities/weather.js +180 -0
  30. package/dist/scripts/action-cache-tests.js +107 -0
  31. package/dist/scripts/agent-reach-deep-tests.js +54 -0
  32. package/dist/scripts/agent-reach-tests.js +38 -0
  33. package/dist/scripts/agent-reach-wrapper-tests.js +79 -0
  34. package/dist/scripts/anything-tests.js +95 -0
  35. package/dist/scripts/async-collect.js +37 -0
  36. package/dist/scripts/companion-tests.js +112 -0
  37. package/dist/scripts/diff-test.js +39 -0
  38. package/dist/scripts/engine-run.js +14 -0
  39. package/dist/scripts/engine-tests.js +45 -0
  40. package/dist/scripts/hbcli-tests.js +101 -0
  41. package/dist/scripts/incident-tests.js +96 -0
  42. package/dist/scripts/journey-tests.js +45 -0
  43. package/dist/scripts/ledger-tests.js +365 -0
  44. package/dist/scripts/ledger-workflow-crash.js +42 -0
  45. package/dist/scripts/memory-capture-tests.js +77 -0
  46. package/dist/scripts/memory-decay-tests.js +83 -0
  47. package/dist/scripts/memory-metrics.js +24 -0
  48. package/dist/scripts/nudge-digest.js +83 -0
  49. package/dist/scripts/opensky-check.js +20 -0
  50. package/dist/scripts/opensky-tests.js +52 -0
  51. package/dist/scripts/probe-poi-tests.js +88 -0
  52. package/dist/scripts/publish-preverify.js +68 -0
  53. package/dist/scripts/replay-async.js +44 -0
  54. package/dist/scripts/replay-real.js +38 -0
  55. package/dist/scripts/replay.js +116 -0
  56. package/dist/scripts/session-attach-diagnose.js +27 -0
  57. package/dist/scripts/session-attach-poc.js +65 -0
  58. package/dist/scripts/session-extract-tests.js +81 -0
  59. package/dist/scripts/session-tests.js +162 -0
  60. package/dist/scripts/skeleton-check.js +37 -0
  61. package/dist/scripts/skeleton-integration-test.js +22 -0
  62. package/dist/scripts/skills-contract-tests.js +85 -0
  63. package/dist/scripts/smoke.js +328 -0
  64. package/dist/scripts/state-cli-tests.js +136 -0
  65. package/dist/scripts/state-cli.js +248 -0
  66. package/dist/scripts/time-eval-tests.js +318 -0
  67. package/dist/scripts/travel-timeline-tests.js +123 -0
  68. package/dist/scripts/unified-tests.js +49 -0
  69. package/dist/scripts/weather-tests.js +48 -0
  70. package/dist/src/bridge.js +34 -0
  71. package/dist/src/companions.js +112 -0
  72. package/dist/src/contracts.js +64 -0
  73. package/dist/src/dsh-llm.js +174 -0
  74. package/dist/src/engine.js +331 -0
  75. package/dist/src/index.js +1239 -0
  76. package/dist/src/journey.js +147 -0
  77. package/dist/src/loop.js +360 -0
  78. package/dist/src/memory-capture.js +40 -0
  79. package/dist/src/memory-decay.js +31 -0
  80. package/dist/src/memory-utility.js +55 -0
  81. package/dist/src/mock-llm.js +103 -0
  82. package/dist/src/model.js +134 -0
  83. package/dist/src/slot-spec.js +165 -0
  84. package/dist/src/state-ledger.js +901 -0
  85. package/dist/src/time-anchor.js +100 -0
  86. package/dist/src/tool-packet.js +12 -0
  87. package/dist/src/travel-slots.js +144 -0
  88. package/dist/src/travel-timeline.js +78 -0
  89. package/dist/src/unified.js +538 -0
  90. package/dist/src/wish-pool.js +27 -0
  91. package/package.json +84 -0
  92. package/ts/capabilities/agent-reach-deep.ts +114 -0
  93. package/ts/capabilities/agent-reach.ts +158 -0
  94. package/ts/capabilities/anything.ts +201 -0
  95. package/ts/capabilities/flyai.ts +151 -0
  96. package/ts/capabilities/hbcli.ts +152 -0
  97. package/ts/capabilities/incident-log.ts +148 -0
  98. package/ts/capabilities/opensky.ts +121 -0
  99. package/ts/capabilities/session/action-cache.ts +148 -0
  100. package/ts/capabilities/session/adapters/ctrip-flight.ts +107 -0
  101. package/ts/capabilities/session/adapters/meituan-local.ts +70 -0
  102. package/ts/capabilities/session/extract.ts +54 -0
  103. package/ts/capabilities/session/read-guard.ts +141 -0
  104. package/ts/capabilities/session/transport.ts +114 -0
  105. package/ts/capabilities/session-search.ts +129 -0
  106. package/ts/capabilities/weather.ts +176 -0
  107. package/ts/package.json +27 -0
  108. package/ts/scripts/async-collect.ts +50 -0
  109. package/ts/scripts/skeleton-check.ts +49 -0
  110. package/ts/scripts/skeleton-integration-test.ts +23 -0
  111. package/ts/scripts/state-cli.ts +201 -0
  112. package/ts/src/bridge.ts +44 -0
  113. package/ts/src/companions.ts +113 -0
  114. package/ts/src/contracts.ts +165 -0
  115. package/ts/src/dsh-llm.ts +155 -0
  116. package/ts/src/index.ts +968 -0
  117. package/ts/src/loop.ts +411 -0
  118. package/ts/src/memory-capture.ts +59 -0
  119. package/ts/src/memory-decay.ts +55 -0
  120. package/ts/src/memory-utility.ts +70 -0
  121. package/ts/src/mock-llm.ts +100 -0
  122. package/ts/src/model.ts +220 -0
  123. package/ts/src/slot-spec.ts +172 -0
  124. package/ts/src/state-ledger.ts +849 -0
  125. package/ts/src/time-anchor.ts +134 -0
  126. package/ts/src/tool-packet.ts +32 -0
  127. package/ts/src/travel-slots.ts +219 -0
  128. package/ts/src/travel-timeline.ts +83 -0
  129. package/ts/src/unified.ts +582 -0
  130. package/ts/src/wish-pool.ts +66 -0
@@ -0,0 +1,136 @@
1
+ import { existsSync, mkdtempSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
2
+ import { tmpdir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import { spawnSync } from 'node:child_process';
5
+ let pass = 0;
6
+ let fail = 0;
7
+ function assert(cond, msg) {
8
+ if (cond) {
9
+ pass++;
10
+ console.log(` ok - ${msg}`);
11
+ } else {
12
+ fail++;
13
+ console.error(` FAIL - ${msg}`);
14
+ }
15
+ }
16
+ function cli(args) {
17
+ return spawnSync('npx', [
18
+ 'tsx',
19
+ 'scripts/state-cli.ts',
20
+ ...args
21
+ ], {
22
+ encoding: 'utf-8'
23
+ });
24
+ }
25
+ const root = mkdtempSync(join(tmpdir(), 'gotry-cli-'));
26
+ const dir = join(root, 'gotry-state');
27
+ mkdirSync(dir, {
28
+ recursive: true
29
+ });
30
+ writeFileSync(join(dir, 'motivation-profile.json'), JSON.stringify({
31
+ weights: {
32
+ curiosity: 0.6
33
+ },
34
+ evidence: [
35
+ '原话A'
36
+ ],
37
+ hard: {}
38
+ }));
39
+ writeFileSync(join(dir, 'wish-pool.json'), JSON.stringify([
40
+ {
41
+ wish_id: 'wLEGACY1',
42
+ name: '京都',
43
+ conditions: {
44
+ days: 7
45
+ },
46
+ added_at: '2026-08-01T00:00:00Z'
47
+ }
48
+ ]));
49
+ const mig = cli([
50
+ 'migrate',
51
+ root
52
+ ]);
53
+ assert(mig.status === 0 && /账本就绪/.test(mig.stdout ?? ''), `migrate exit 0 且报告就绪(实际 ${mig.status}:${(mig.stderr ?? '').slice(0, 200)})`);
54
+ assert(existsSync(join(dir, 'gotry-state.db')), 'migrate 后账本文件存在');
55
+ assert(existsSync(join(dir, 'pre-ledger-backup', 'wish-pool.json')), 'migrate 前自动快照(pre-ledger-backup/)');
56
+ const stats = cli([
57
+ 'stats',
58
+ root
59
+ ]);
60
+ assert(stats.status === 0 && /wishes=1/.test(stats.stdout ?? '') && /events=\d+/.test(stats.stdout ?? ''), `stats 计数正确(${(stats.stdout ?? '').trim()})`);
61
+ const log = cli([
62
+ 'log',
63
+ root,
64
+ '--limit',
65
+ '3'
66
+ ]);
67
+ assert(log.status === 0 && /\bwish\.imported\b|\bmotivation\.imported\b/.test(log.stdout ?? ''), `log 呈现账本事件(append-only 审计面)`);
68
+ rmSync(join(dir, 'wish-pool.json'));
69
+ const exp = cli([
70
+ 'export',
71
+ root
72
+ ]);
73
+ assert(exp.status === 0 && existsSync(join(dir, 'wish-pool.json')), 'export 重建旧文件名视图(红线 6:可见可导出)');
74
+ const exported = JSON.parse(readFileSync(join(dir, 'wish-pool.json'), 'utf-8'));
75
+ assert(exported[0]?.wish_id === 'wLEGACY1', 'export 视图内容与账本一致');
76
+ const fg = cli([
77
+ 'forget',
78
+ root,
79
+ 'wish',
80
+ 'wLEGACY1'
81
+ ]);
82
+ assert(fg.status === 0 && /物理硬删/.test(fg.stdout ?? ''), 'forget 执行成功');
83
+ const stats2 = cli([
84
+ 'stats',
85
+ root
86
+ ]);
87
+ assert(/wishes=0/.test(stats2.stdout ?? ''), 'forget 后愿望池归零(红线 6「可删除」,D5 物理硬删)');
88
+ const log2 = cli([
89
+ 'log',
90
+ root,
91
+ '--limit',
92
+ '3'
93
+ ]);
94
+ assert(/forget\.executed/.test(log2.stdout ?? ''), 'forget 留审计一行(删除本身可溯源)');
95
+ const root2 = mkdtempSync(join(tmpdir(), 'gotry-cli2-'));
96
+ const req = cli([
97
+ 'pw-request',
98
+ root2,
99
+ 'booking:e2e-1',
100
+ 'flight-order-confirm',
101
+ '{"flight":"MU123"}'
102
+ ]);
103
+ assert(req.status === 0 && /"created":true/.test(req.stdout ?? ''), 'pw-request 登记成功(L2:只登记不执行)');
104
+ const dup = cli([
105
+ 'pw-request',
106
+ root2,
107
+ 'booking:e2e-1',
108
+ 'flight-order-confirm',
109
+ '{"flight":"MU123"}'
110
+ ]);
111
+ assert(/"created":false/.test(dup.stdout ?? ''), 'pw-request 幂等键去重');
112
+ const conf = cli([
113
+ 'pw-confirm',
114
+ root2,
115
+ 'booking:e2e-1',
116
+ 'PNR-XYZ'
117
+ ]);
118
+ assert(conf.status === 0 && /"ok":true/.test(conf.stdout ?? ''), 'pw-confirm 携 receipt 确认(L3)');
119
+ const list = cli([
120
+ 'pw-list',
121
+ root2
122
+ ]);
123
+ assert(/confirmed/.test(list.stdout ?? '') && /PNR-XYZ/.test(list.stdout ?? ''), 'pw-list 呈现终态与 receipt');
124
+ rmSync(root, {
125
+ recursive: true,
126
+ force: true
127
+ });
128
+ rmSync(root2, {
129
+ recursive: true,
130
+ force: true
131
+ });
132
+ console.log(`\nSTATE-CLI TESTS: ${pass} ok, ${fail} fail`);
133
+ if (fail > 0) process.exit(1);
134
+
135
+
136
+ //# sourceURL=/Users/bytedance/work/gotry/ts/scripts/state-cli-tests.ts
@@ -0,0 +1,248 @@
1
+ import { mkdirSync, renameSync, writeFileSync } from 'node:fs';
2
+ import { dirname, join } from 'node:path';
3
+ import { ensureLedger, openLedgerIfExists } from '../src/state-ledger.js';
4
+ import { collectDeepPlanning, makeJournaledSolvePort, settleAsyncTicket } from '../src/loop.js';
5
+ import { solveUnified } from '../src/unified.js';
6
+ const [cmd, ...rest] = process.argv.slice(2);
7
+ function rootOf(args) {
8
+ const i = args.indexOf('--state-root');
9
+ if (i >= 0 && args[i + 1]) return args[i + 1];
10
+ const first = args.find((a)=>!a.startsWith('--') && !/^[\d]+$/.test(a));
11
+ return first ?? '.';
12
+ }
13
+ function tenantOf(args) {
14
+ const i = args.indexOf('--tenant');
15
+ return i >= 0 && args[i + 1] ? args[i + 1] : 'local';
16
+ }
17
+ function arg(name, fallback) {
18
+ const i = process.argv.indexOf(name);
19
+ return i >= 0 ? process.argv[i + 1] : fallback;
20
+ }
21
+ function atomicWrite(path, text) {
22
+ const tmp = `${path}.tmp`;
23
+ writeFileSync(tmp, text, 'utf-8');
24
+ renameSync(tmp, path);
25
+ }
26
+ const HELP = '用法见文件头注释(npx tsx scripts/state-cli.ts <cmd> [root] ...)';
27
+ switch(cmd){
28
+ case 'migrate':
29
+ {
30
+ const root = rootOf(rest);
31
+ const tenant = tenantOf(rest);
32
+ const before = openLedgerIfExists(root, tenant)?.countEvents() ?? 0;
33
+ const ledger = ensureLedger(root, tenant);
34
+ const backupDir = join(root, 'gotry-state', 'pre-ledger-backup');
35
+ console.log(`账本就绪:${ledger.dbPath}(events ${before} → ${ledger.countEvents()};存在旧文件时已快照至 ${backupDir}/)`);
36
+ break;
37
+ }
38
+ case 'export':
39
+ {
40
+ const root = rootOf(rest);
41
+ const tenant = tenantOf(rest);
42
+ const ledger = ensureLedger(root, tenant);
43
+ const dir = join(root === '.' ? process.cwd() : root, 'gotry-state');
44
+ mkdirSync(dir, {
45
+ recursive: true
46
+ });
47
+ const motivation = ledger.readMotivation();
48
+ if (motivation) atomicWrite(join(dir, 'motivation-profile.json'), JSON.stringify(motivation, null, 2));
49
+ const pool = ledger.readWishPool();
50
+ if (pool.length) atomicWrite(join(dir, 'wish-pool.json'), JSON.stringify(pool, null, 2));
51
+ const companions = ledger.readCompanions();
52
+ if (companions.length) atomicWrite(join(dir, 'companions.json'), JSON.stringify(companions, null, 2));
53
+ const utility = ledger.readUtilityEvents();
54
+ if (utility.length) atomicWrite(join(dir, 'memory-utility.jsonl'), utility.map((e)=>JSON.stringify(e)).join('\n') + '\n');
55
+ const trips = ledger.readTrips();
56
+ if (trips.length) atomicWrite(join(dir, 'trips.jsonl'), trips.map((e)=>JSON.stringify(e)).join('\n') + '\n');
57
+ console.log(`视图已导出(单向,DB→文件;红线 6):${dir}/`);
58
+ break;
59
+ }
60
+ case 'log':
61
+ {
62
+ const root = rootOf(rest);
63
+ const tenant = tenantOf(rest);
64
+ const limit = Number(arg('--limit', '20'));
65
+ const ledger = openLedgerIfExists(root, tenant);
66
+ if (!ledger) {
67
+ console.log('(无账本——未迁移 root,旧文件形态)');
68
+ break;
69
+ }
70
+ for (const e of ledger.readEvents(undefined, limit)){
71
+ console.log(`${String(e.seq).padStart(5)} ${e.ts} ${e.actor.padEnd(28)} ${e.kind.padEnd(24)} ${e.subject_id}${e.idem_key ? ` #${e.idem_key}` : ''}`);
72
+ }
73
+ break;
74
+ }
75
+ case 'stats':
76
+ {
77
+ const root = rootOf(rest);
78
+ const tenant = tenantOf(rest);
79
+ const ledger = openLedgerIfExists(root, tenant);
80
+ if (!ledger) {
81
+ console.log('(无账本——未迁移 root)');
82
+ break;
83
+ }
84
+ console.log(`events=${ledger.countEvents()} wishes=${ledger.readWishPool().length} companions=${ledger.readCompanions().length} trips=${ledger.readTrips().length} utility=${ledger.readUtilityEvents().length} pendingRuns=${ledger.pendingWorkflowRuns().length} pendingWrites=${ledger.listPendingWrites().length}`);
85
+ break;
86
+ }
87
+ case 'rebuild':
88
+ case 'rewind':
89
+ {
90
+ const root = rootOf(rest);
91
+ const tenant = tenantOf(rest);
92
+ const ledger = openLedgerIfExists(root, tenant);
93
+ if (!ledger) {
94
+ console.error('无账本');
95
+ process.exit(1);
96
+ }
97
+ const toSeqRaw = rest.find((a)=>/^\d+$/.test(a));
98
+ const r = ledger.rebuildProjections(toSeqRaw ? Number(toSeqRaw) : undefined);
99
+ console.log(`fold 重建完成${toSeqRaw ? `(至 seq ${toSeqRaw};rebuild 无参即回最新)` : '(全量)'}:重放 ${r.events} 事件 → 愿望 ${r.wishes} / 同行人 ${r.companions}`);
100
+ break;
101
+ }
102
+ case 'forget':
103
+ {
104
+ const root = rootOf(rest);
105
+ const tenant = tenantOf(rest);
106
+ const ledger = openLedgerIfExists(root, tenant);
107
+ if (!ledger) {
108
+ console.error('无账本');
109
+ process.exit(1);
110
+ }
111
+ const subject = rest.find((a)=>!a.startsWith('--') && a !== root);
112
+ const id = rest[rest.indexOf(subject) + 1];
113
+ if (!subject || id === undefined) {
114
+ console.error(HELP);
115
+ process.exit(1);
116
+ }
117
+ const map = {
118
+ wish: {
119
+ kinds: [
120
+ 'wish.imported',
121
+ 'wish.added',
122
+ 'wish.updated',
123
+ 'memory_utility.event'
124
+ ],
125
+ subjectId: id
126
+ },
127
+ companion: {
128
+ kinds: [
129
+ 'companion.imported',
130
+ 'companion.saved'
131
+ ],
132
+ subjectId: id
133
+ },
134
+ motivation: {
135
+ kinds: [
136
+ 'motivation.imported',
137
+ 'motivation.patch'
138
+ ],
139
+ subjectId: 'motivation'
140
+ }
141
+ };
142
+ const spec = map[subject];
143
+ if (!spec) {
144
+ console.error(`未知主体 ${subject}(wish|companion|motivation)`);
145
+ process.exit(1);
146
+ }
147
+ const r = ledger.forgetSubject([
148
+ spec
149
+ ]);
150
+ console.log(`已物理硬删 ${r.deleted} 条事件并重建投影(审计一行留痕;红线 6「可删除」)`);
151
+ break;
152
+ }
153
+ case 'tick':
154
+ {
155
+ const root = rootOf(rest);
156
+ const tenant = tenantOf(rest);
157
+ const ledger = openLedgerIfExists(root, tenant);
158
+ if (!ledger) {
159
+ console.log('(无账本,无待办)');
160
+ break;
161
+ }
162
+ const pending = ledger.pendingWorkflowRuns();
163
+ if (pending.length === 0) {
164
+ console.log('(无 pending 工单)');
165
+ break;
166
+ }
167
+ for (const p of pending){
168
+ const run = ledger.getWorkflowRun(p.id);
169
+ const ticket = JSON.parse(run.ticket_json);
170
+ const state = JSON.parse(run.state_json);
171
+ const solve = makeJournaledSolvePort(ledger, p.id, solveUnified);
172
+ const { reply } = await collectDeepPlanning(state, ticket, solve);
173
+ await settleAsyncTicket(p.id, reply, root);
174
+ console.log(`工单 ${p.id} 已回收(durable 恢复语义:done 步骤零重执行)`);
175
+ }
176
+ break;
177
+ }
178
+ case 'whatif':
179
+ {
180
+ const root = rootOf(rest);
181
+ const tenant = tenantOf(rest);
182
+ const ledger = openLedgerIfExists(root, tenant);
183
+ if (!ledger) {
184
+ console.error('无账本');
185
+ process.exit(1);
186
+ }
187
+ const dest = rest.find((a)=>a !== root && !a.startsWith('--'));
188
+ if (!dest) {
189
+ console.error(HELP);
190
+ process.exit(1);
191
+ }
192
+ mkdirSync(dirname(dest), {
193
+ recursive: true
194
+ });
195
+ ledger.forkWhatIf(dest);
196
+ console.log(`what-if 分叉已生成:${dest}(预演在副本,正本零改动)`);
197
+ break;
198
+ }
199
+ case 'pw-list':
200
+ {
201
+ const root = rootOf(rest);
202
+ const tenant = tenantOf(rest);
203
+ const ledger = openLedgerIfExists(root, tenant);
204
+ if (!ledger) {
205
+ console.log('(无账本)');
206
+ break;
207
+ }
208
+ for (const w of ledger.listPendingWrites()){
209
+ console.log(`${w.status.padEnd(12)} ${w.idem_key} seam=${w.seam}${w.receipt ? ` receipt=${w.receipt}` : ''}`);
210
+ }
211
+ break;
212
+ }
213
+ case 'pw-request':
214
+ case 'pw-confirm':
215
+ case 'pw-compensate':
216
+ {
217
+ const root = rootOf(rest);
218
+ const tenant = tenantOf(rest);
219
+ const ledger = ensureLedger(root, tenant);
220
+ const positional = rest.filter((a)=>a !== root && !a.startsWith('--'));
221
+ if (positional.length < (cmd === 'pw-request' ? 3 : 2)) {
222
+ console.error(HELP);
223
+ process.exit(1);
224
+ }
225
+ if (cmd === 'pw-request') {
226
+ const r = ledger.requestPendingWrite({
227
+ idemKey: positional[0],
228
+ seam: positional[1],
229
+ payload: JSON.parse(positional[2])
230
+ });
231
+ console.log(`登记:${JSON.stringify(r)}(L2:只登记不执行)`);
232
+ } else if (cmd === 'pw-confirm') {
233
+ const r = ledger.confirmPendingWrite(positional[0], positional[1]);
234
+ console.log(`确认:${JSON.stringify(r)}`);
235
+ } else {
236
+ const r = ledger.compensatePendingWrite(positional[0], positional[1]);
237
+ console.log(`补偿:${JSON.stringify(r)}`);
238
+ }
239
+ break;
240
+ }
241
+ default:
242
+ console.error(cmd ? `未知命令 ${cmd}` : HELP);
243
+ console.error(HELP);
244
+ process.exit(1);
245
+ }
246
+
247
+
248
+ //# sourceURL=/Users/bytedance/work/gotry/ts/scripts/state-cli.ts