agent-shell-chat 1.2.2
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 +21 -0
- package/README.md +199 -0
- package/dist/bin/agent-shell.d.ts +15 -0
- package/dist/bin/agent-shell.d.ts.map +1 -0
- package/dist/bin/agent-shell.js +816 -0
- package/dist/bin/agent-shell.js.map +1 -0
- package/dist/package.json +54 -0
- package/dist/src/acp/agent-manager.d.ts +22 -0
- package/dist/src/acp/agent-manager.d.ts.map +1 -0
- package/dist/src/acp/agent-manager.js +79 -0
- package/dist/src/acp/agent-manager.js.map +1 -0
- package/dist/src/acp/client.d.ts +64 -0
- package/dist/src/acp/client.d.ts.map +1 -0
- package/dist/src/acp/client.js +265 -0
- package/dist/src/acp/client.js.map +1 -0
- package/dist/src/acp/session.d.ts +81 -0
- package/dist/src/acp/session.d.ts.map +1 -0
- package/dist/src/acp/session.js +339 -0
- package/dist/src/acp/session.js.map +1 -0
- package/dist/src/adapter/inbound.d.ts +39 -0
- package/dist/src/adapter/inbound.d.ts.map +1 -0
- package/dist/src/adapter/inbound.js +264 -0
- package/dist/src/adapter/inbound.js.map +1 -0
- package/dist/src/bridge.d.ts +115 -0
- package/dist/src/bridge.d.ts.map +1 -0
- package/dist/src/bridge.js +969 -0
- package/dist/src/bridge.js.map +1 -0
- package/dist/src/config.d.ts +155 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/config.js +265 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/index.d.ts +9 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +7 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/inject/monitor.d.ts +24 -0
- package/dist/src/inject/monitor.d.ts.map +1 -0
- package/dist/src/inject/monitor.js +149 -0
- package/dist/src/inject/monitor.js.map +1 -0
- package/dist/src/inject/queue.d.ts +13 -0
- package/dist/src/inject/queue.d.ts.map +1 -0
- package/dist/src/inject/queue.js +35 -0
- package/dist/src/inject/queue.js.map +1 -0
- package/dist/src/inject/types.d.ts +10 -0
- package/dist/src/inject/types.d.ts.map +1 -0
- package/dist/src/inject/types.js +2 -0
- package/dist/src/inject/types.js.map +1 -0
- package/dist/src/storage/accounts.d.ts +43 -0
- package/dist/src/storage/accounts.d.ts.map +1 -0
- package/dist/src/storage/accounts.js +289 -0
- package/dist/src/storage/accounts.js.map +1 -0
- package/dist/src/storage/runtime.d.ts +23 -0
- package/dist/src/storage/runtime.d.ts.map +1 -0
- package/dist/src/storage/runtime.js +104 -0
- package/dist/src/storage/runtime.js.map +1 -0
- package/dist/src/storage/state.d.ts +17 -0
- package/dist/src/storage/state.d.ts.map +1 -0
- package/dist/src/storage/state.js +78 -0
- package/dist/src/storage/state.js.map +1 -0
- package/dist/src/telemetry/index.d.ts +33 -0
- package/dist/src/telemetry/index.d.ts.map +1 -0
- package/dist/src/telemetry/index.js +167 -0
- package/dist/src/telemetry/index.js.map +1 -0
- package/dist/src/weixin/api.d.ts +50 -0
- package/dist/src/weixin/api.d.ts.map +1 -0
- package/dist/src/weixin/api.js +90 -0
- package/dist/src/weixin/api.js.map +1 -0
- package/dist/src/weixin/auth.d.ts +26 -0
- package/dist/src/weixin/auth.d.ts.map +1 -0
- package/dist/src/weixin/auth.js +103 -0
- package/dist/src/weixin/auth.js.map +1 -0
- package/dist/src/weixin/media.d.ts +24 -0
- package/dist/src/weixin/media.d.ts.map +1 -0
- package/dist/src/weixin/media.js +64 -0
- package/dist/src/weixin/media.js.map +1 -0
- package/dist/src/weixin/monitor.d.ts +16 -0
- package/dist/src/weixin/monitor.d.ts.map +1 -0
- package/dist/src/weixin/monitor.js +113 -0
- package/dist/src/weixin/monitor.js.map +1 -0
- package/dist/src/weixin/send.d.ts +28 -0
- package/dist/src/weixin/send.d.ts.map +1 -0
- package/dist/src/weixin/send.js +162 -0
- package/dist/src/weixin/send.js.map +1 -0
- package/dist/src/weixin/types.d.ts +149 -0
- package/dist/src/weixin/types.d.ts.map +1 -0
- package/dist/src/weixin/types.js +33 -0
- package/dist/src/weixin/types.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
const POLL_INTERVAL_MS = 2_000;
|
|
4
|
+
const INJECT_DIR_MODE = 0o700;
|
|
5
|
+
export class InjectionMonitor {
|
|
6
|
+
opts;
|
|
7
|
+
timer = null;
|
|
8
|
+
processing = false;
|
|
9
|
+
currentProcessing = null;
|
|
10
|
+
stopped = false;
|
|
11
|
+
constructor(opts) {
|
|
12
|
+
this.opts = opts;
|
|
13
|
+
}
|
|
14
|
+
async start() {
|
|
15
|
+
await this.ensureDirs();
|
|
16
|
+
await this.recoverProcessing();
|
|
17
|
+
await this.processPending();
|
|
18
|
+
this.timer = setInterval(() => {
|
|
19
|
+
this.processPending().catch((err) => {
|
|
20
|
+
this.opts.log(`[inject] monitor error: ${String(err)}`);
|
|
21
|
+
});
|
|
22
|
+
}, POLL_INTERVAL_MS);
|
|
23
|
+
this.timer.unref();
|
|
24
|
+
}
|
|
25
|
+
async stop() {
|
|
26
|
+
this.stopped = true;
|
|
27
|
+
if (this.timer) {
|
|
28
|
+
clearInterval(this.timer);
|
|
29
|
+
this.timer = null;
|
|
30
|
+
}
|
|
31
|
+
await this.currentProcessing;
|
|
32
|
+
}
|
|
33
|
+
async processPending() {
|
|
34
|
+
if (this.processing) {
|
|
35
|
+
await this.currentProcessing;
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (this.stopped)
|
|
39
|
+
return;
|
|
40
|
+
this.processing = true;
|
|
41
|
+
this.currentProcessing = this.drainPending();
|
|
42
|
+
try {
|
|
43
|
+
await this.currentProcessing;
|
|
44
|
+
}
|
|
45
|
+
finally {
|
|
46
|
+
this.processing = false;
|
|
47
|
+
this.currentProcessing = null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
async drainPending() {
|
|
51
|
+
try {
|
|
52
|
+
const pendingDir = this.dir("pending");
|
|
53
|
+
const files = (await fs.readdir(pendingDir).catch((err) => {
|
|
54
|
+
if (err.code === "ENOENT")
|
|
55
|
+
return [];
|
|
56
|
+
throw err;
|
|
57
|
+
}))
|
|
58
|
+
.filter((name) => name.endsWith(".json"))
|
|
59
|
+
.sort();
|
|
60
|
+
for (const file of files) {
|
|
61
|
+
if (this.stopped)
|
|
62
|
+
break;
|
|
63
|
+
await this.processFile(file);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
throw err;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async processFile(file) {
|
|
71
|
+
const pendingPath = path.join(this.dir("pending"), file);
|
|
72
|
+
const processingPath = path.join(this.dir("processing"), file);
|
|
73
|
+
try {
|
|
74
|
+
await fs.rename(pendingPath, processingPath);
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
if (err.code === "ENOENT")
|
|
78
|
+
return;
|
|
79
|
+
throw err;
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
const job = await this.readJob(processingPath);
|
|
83
|
+
await this.opts.onMessage(job);
|
|
84
|
+
await fs.rename(processingPath, path.join(this.dir("done"), file));
|
|
85
|
+
this.opts.log(`[inject] processed ${job.id} for ${job.target}`);
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
const failedPath = path.join(this.dir("failed"), file);
|
|
89
|
+
const raw = await fs.readFile(processingPath, "utf-8").catch(() => "");
|
|
90
|
+
const failure = {
|
|
91
|
+
failedAt: new Date().toISOString(),
|
|
92
|
+
error: String(err),
|
|
93
|
+
raw,
|
|
94
|
+
};
|
|
95
|
+
await fs.writeFile(processingPath, JSON.stringify(failure, null, 2) + "\n", "utf-8").catch(() => { });
|
|
96
|
+
await fs.rename(processingPath, failedPath).catch(() => { });
|
|
97
|
+
this.opts.log(`[inject] failed ${file}: ${String(err)}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
async readJob(filePath) {
|
|
101
|
+
const parsed = JSON.parse(await fs.readFile(filePath, "utf-8"));
|
|
102
|
+
if (typeof parsed.id !== "string" ||
|
|
103
|
+
typeof parsed.createdAt !== "string" ||
|
|
104
|
+
typeof parsed.target !== "string" ||
|
|
105
|
+
typeof parsed.text !== "string" ||
|
|
106
|
+
parsed.source !== "cli" ||
|
|
107
|
+
(parsed.contextToken !== undefined && typeof parsed.contextToken !== "string")) {
|
|
108
|
+
throw new Error(`Invalid injected message file: ${filePath}`);
|
|
109
|
+
}
|
|
110
|
+
return parsed;
|
|
111
|
+
}
|
|
112
|
+
async ensureDirs() {
|
|
113
|
+
await fs.mkdir(this.opts.injectDir, { recursive: true, mode: INJECT_DIR_MODE });
|
|
114
|
+
await fs.chmod(this.opts.injectDir, INJECT_DIR_MODE).catch(() => { });
|
|
115
|
+
const dirs = [
|
|
116
|
+
this.dir("pending"),
|
|
117
|
+
this.dir("processing"),
|
|
118
|
+
this.dir("done"),
|
|
119
|
+
this.dir("failed"),
|
|
120
|
+
];
|
|
121
|
+
await Promise.all(dirs.map(async (dir) => {
|
|
122
|
+
await fs.mkdir(dir, { recursive: true, mode: INJECT_DIR_MODE });
|
|
123
|
+
await fs.chmod(dir, INJECT_DIR_MODE).catch(() => { });
|
|
124
|
+
}));
|
|
125
|
+
}
|
|
126
|
+
async recoverProcessing() {
|
|
127
|
+
const processingDir = this.dir("processing");
|
|
128
|
+
const files = (await fs.readdir(processingDir).catch((err) => {
|
|
129
|
+
if (err.code === "ENOENT")
|
|
130
|
+
return [];
|
|
131
|
+
throw err;
|
|
132
|
+
}))
|
|
133
|
+
.filter((name) => name.endsWith(".json"))
|
|
134
|
+
.sort();
|
|
135
|
+
for (const file of files) {
|
|
136
|
+
const from = path.join(processingDir, file);
|
|
137
|
+
const to = path.join(this.dir("pending"), file);
|
|
138
|
+
await fs.rename(from, to).catch((err) => {
|
|
139
|
+
if (err.code !== "ENOENT")
|
|
140
|
+
throw err;
|
|
141
|
+
});
|
|
142
|
+
this.opts.log(`[inject] recovered stale processing job ${file}`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
dir(name) {
|
|
146
|
+
return path.join(this.opts.injectDir, name);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=monitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monitor.js","sourceRoot":"","sources":["../../../src/inject/monitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type InjectedMessage } from "./types.js";
|
|
2
|
+
export interface QueueInjectedMessageParams {
|
|
3
|
+
injectDir: string;
|
|
4
|
+
text: string;
|
|
5
|
+
target?: string;
|
|
6
|
+
contextToken?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface QueuedInjectedMessage {
|
|
9
|
+
job: InjectedMessage;
|
|
10
|
+
filePath: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function queueInjectedMessage(params: QueueInjectedMessageParams): Promise<QueuedInjectedMessage>;
|
|
13
|
+
//# sourceMappingURL=queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../../src/inject/queue.ts"],"names":[],"mappings":"AAGA,OAAO,EAA4B,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAK5E,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,eAAe,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,0BAA0B,GACjC,OAAO,CAAC,qBAAqB,CAAC,CA+BhC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
import fs from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { DEFAULT_INJECTION_TARGET } from "./types.js";
|
|
5
|
+
const INJECT_DIR_MODE = 0o700;
|
|
6
|
+
const INJECT_FILE_MODE = 0o600;
|
|
7
|
+
export async function queueInjectedMessage(params) {
|
|
8
|
+
const text = params.text.trim();
|
|
9
|
+
if (!text) {
|
|
10
|
+
throw new Error("Injected message text cannot be empty");
|
|
11
|
+
}
|
|
12
|
+
const pendingDir = path.join(params.injectDir, "pending");
|
|
13
|
+
await fs.mkdir(params.injectDir, { recursive: true, mode: INJECT_DIR_MODE });
|
|
14
|
+
await fs.chmod(params.injectDir, INJECT_DIR_MODE).catch(() => { });
|
|
15
|
+
await fs.mkdir(pendingDir, { recursive: true, mode: INJECT_DIR_MODE });
|
|
16
|
+
await fs.chmod(pendingDir, INJECT_DIR_MODE).catch(() => { });
|
|
17
|
+
const job = {
|
|
18
|
+
id: `inj_${new Date().toISOString().replace(/[:.]/g, "-")}_${crypto.randomUUID()}`,
|
|
19
|
+
createdAt: new Date().toISOString(),
|
|
20
|
+
target: params.target ?? DEFAULT_INJECTION_TARGET,
|
|
21
|
+
text,
|
|
22
|
+
source: "cli",
|
|
23
|
+
...(params.contextToken ? { contextToken: params.contextToken } : {}),
|
|
24
|
+
};
|
|
25
|
+
const tmpPath = path.join(pendingDir, `.${job.id}.tmp`);
|
|
26
|
+
const filePath = path.join(pendingDir, `${job.id}.json`);
|
|
27
|
+
await fs.writeFile(tmpPath, JSON.stringify(job, null, 2) + "\n", {
|
|
28
|
+
encoding: "utf-8",
|
|
29
|
+
mode: INJECT_FILE_MODE,
|
|
30
|
+
});
|
|
31
|
+
await fs.chmod(tmpPath, INJECT_FILE_MODE).catch(() => { });
|
|
32
|
+
await fs.rename(tmpPath, filePath);
|
|
33
|
+
return { job, filePath };
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../../src/inject/queue.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,wBAAwB,EAAwB,MAAM,YAAY,CAAC;AAE5E,MAAM,eAAe,GAAG,KAAK,CAAC;AAC9B,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAc/B,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAAkC;IAElC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAC1D,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;IAC7E,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAClE,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;IACvE,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAE5D,MAAM,GAAG,GAAoB;QAC3B,EAAE,EAAE,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,UAAU,EAAE,EAAE;QAClF,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,wBAAwB;QACjD,IAAI;QACJ,MAAM,EAAE,KAAK;QACb,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtE,CAAC;IAEF,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACzD,MAAM,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE;QAC/D,QAAQ,EAAE,OAAO;QACjB,IAAI,EAAE,gBAAgB;KACvB,CAAC,CAAC;IACH,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC1D,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAEnC,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/inject/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,wBAAwB,qBAAqB,CAAC;AAE3D,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,KAAK,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/inject/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,wBAAwB,GAAG,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type TokenData } from "../weixin/auth.js";
|
|
2
|
+
export interface AccountRecord {
|
|
3
|
+
accountKey: string;
|
|
4
|
+
accountName: string;
|
|
5
|
+
accountId: string;
|
|
6
|
+
userId: string;
|
|
7
|
+
/** Storage directory relative to the registry root, or "." for legacy data. */
|
|
8
|
+
storageDir: string;
|
|
9
|
+
createdAt: string;
|
|
10
|
+
updatedAt: string;
|
|
11
|
+
}
|
|
12
|
+
export interface AccountRegistry {
|
|
13
|
+
version: 1;
|
|
14
|
+
accounts: AccountRecord[];
|
|
15
|
+
}
|
|
16
|
+
export interface RegisteredAccount {
|
|
17
|
+
record: AccountRecord;
|
|
18
|
+
storageDir: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function validateAccountName(accountName: string): string;
|
|
21
|
+
export declare function formatAccountName(account: Pick<AccountRecord, "accountName" | "accountId">): string;
|
|
22
|
+
export declare function getAccountsPath(rootDir: string): string;
|
|
23
|
+
export declare function loadAccountRegistry(rootDir: string): AccountRegistry;
|
|
24
|
+
export declare function listAccounts(rootDir: string): RegisteredAccount[];
|
|
25
|
+
export declare function resolveAccount(rootDir: string, selector: string): RegisteredAccount;
|
|
26
|
+
/**
|
|
27
|
+
* Register the pre-multi-account token at ~/.agent-shell/token.json without
|
|
28
|
+
* moving runtime state. This makes migration additive and reversible.
|
|
29
|
+
*/
|
|
30
|
+
export declare function migrateLegacyToken(rootDir: string): RegisteredAccount | null;
|
|
31
|
+
/**
|
|
32
|
+
* Import token files created by the existing --instance implementation into
|
|
33
|
+
* the account index. Existing directories and runtime state stay in place.
|
|
34
|
+
*/
|
|
35
|
+
export declare function migrateInstanceTokens(rootDir: string): void;
|
|
36
|
+
export declare function discoverAccounts(rootDir: string): RegisteredAccount[];
|
|
37
|
+
export declare function registerAccount(params: {
|
|
38
|
+
rootDir: string;
|
|
39
|
+
token: TokenData;
|
|
40
|
+
accountName: string;
|
|
41
|
+
overwriteAccountKey?: string;
|
|
42
|
+
}): RegisteredAccount;
|
|
43
|
+
//# sourceMappingURL=accounts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../../src/storage/accounts.ts"],"names":[],"mappings":"AAGA,OAAO,EAAwB,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAKzE,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,CAAC,CAAC;IACX,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAY/D;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,aAAa,GAAG,WAAW,CAAC,GAAG,MAAM,CAEnG;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAapE;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAWjE;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,iBAAiB,CAkBnF;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAE5E;AA6BD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE3D;AAuCD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAMrE;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,GAAG,iBAAiB,CAEpB"}
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { loadToken, saveToken } from "../weixin/auth.js";
|
|
5
|
+
const REGISTRY_VERSION = 1;
|
|
6
|
+
const ACCOUNT_NAME_MAX_LENGTH = 64;
|
|
7
|
+
export function validateAccountName(accountName) {
|
|
8
|
+
const normalized = accountName.trim();
|
|
9
|
+
if (!normalized) {
|
|
10
|
+
throw new Error("Account name is required.");
|
|
11
|
+
}
|
|
12
|
+
if (normalized.length > ACCOUNT_NAME_MAX_LENGTH) {
|
|
13
|
+
throw new Error(`Account name must be at most ${ACCOUNT_NAME_MAX_LENGTH} characters.`);
|
|
14
|
+
}
|
|
15
|
+
if (/[\u0000-\u001f\u007f]/.test(normalized)) {
|
|
16
|
+
throw new Error("Account name must not contain control characters.");
|
|
17
|
+
}
|
|
18
|
+
return normalized;
|
|
19
|
+
}
|
|
20
|
+
export function formatAccountName(account) {
|
|
21
|
+
return `${account.accountName}-${account.accountId}`;
|
|
22
|
+
}
|
|
23
|
+
export function getAccountsPath(rootDir) {
|
|
24
|
+
return path.join(rootDir, "accounts.json");
|
|
25
|
+
}
|
|
26
|
+
export function loadAccountRegistry(rootDir) {
|
|
27
|
+
const registryPath = getAccountsPath(rootDir);
|
|
28
|
+
if (!fs.existsSync(registryPath)) {
|
|
29
|
+
return { version: REGISTRY_VERSION, accounts: [] };
|
|
30
|
+
}
|
|
31
|
+
const raw = JSON.parse(fs.readFileSync(registryPath, "utf-8"));
|
|
32
|
+
if (raw.version !== REGISTRY_VERSION || !Array.isArray(raw.accounts)) {
|
|
33
|
+
throw new Error(`Unsupported or invalid account registry: ${registryPath}`);
|
|
34
|
+
}
|
|
35
|
+
const accounts = raw.accounts.map((account) => validateAccountRecord(account));
|
|
36
|
+
return { version: REGISTRY_VERSION, accounts };
|
|
37
|
+
}
|
|
38
|
+
export function listAccounts(rootDir) {
|
|
39
|
+
return loadAccountRegistry(rootDir).accounts
|
|
40
|
+
.map((record) => ({
|
|
41
|
+
record,
|
|
42
|
+
storageDir: resolveStorageDir(rootDir, record.storageDir),
|
|
43
|
+
}))
|
|
44
|
+
.sort((left, right) => left.record.accountName.localeCompare(right.record.accountName, undefined, {
|
|
45
|
+
sensitivity: "base",
|
|
46
|
+
}));
|
|
47
|
+
}
|
|
48
|
+
export function resolveAccount(rootDir, selector) {
|
|
49
|
+
const normalized = selector.trim().toLocaleLowerCase();
|
|
50
|
+
const matches = listAccounts(rootDir).filter(({ record }) => record.accountKey.toLocaleLowerCase() === normalized ||
|
|
51
|
+
record.accountName.toLocaleLowerCase() === normalized ||
|
|
52
|
+
record.accountId.toLocaleLowerCase() === normalized ||
|
|
53
|
+
formatAccountName(record).toLocaleLowerCase() === normalized);
|
|
54
|
+
if (matches.length === 0) {
|
|
55
|
+
throw new Error(`Unknown account: ${JSON.stringify(selector)}`);
|
|
56
|
+
}
|
|
57
|
+
if (matches.length > 1) {
|
|
58
|
+
throw new Error(`Ambiguous account ${JSON.stringify(selector)}. Use the full name-accountId value.`);
|
|
59
|
+
}
|
|
60
|
+
return matches[0];
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Register the pre-multi-account token at ~/.agent-shell/token.json without
|
|
64
|
+
* moving runtime state. This makes migration additive and reversible.
|
|
65
|
+
*/
|
|
66
|
+
export function migrateLegacyToken(rootDir) {
|
|
67
|
+
return withRegistryLock(rootDir, () => migrateLegacyTokenUnlocked(rootDir));
|
|
68
|
+
}
|
|
69
|
+
function migrateLegacyTokenUnlocked(rootDir) {
|
|
70
|
+
const token = loadToken(rootDir);
|
|
71
|
+
if (!token)
|
|
72
|
+
return null;
|
|
73
|
+
const registry = loadAccountRegistry(rootDir);
|
|
74
|
+
const existing = registry.accounts.find((account) => account.accountId === token.accountId);
|
|
75
|
+
if (existing) {
|
|
76
|
+
return { record: existing, storageDir: resolveStorageDir(rootDir, existing.storageDir) };
|
|
77
|
+
}
|
|
78
|
+
const now = new Date().toISOString();
|
|
79
|
+
const accountName = uniqueLegacyName(registry.accounts, token.accountName ?? "default");
|
|
80
|
+
const record = {
|
|
81
|
+
accountKey: `legacy-${shortHash(token.accountId)}`,
|
|
82
|
+
accountName,
|
|
83
|
+
accountId: token.accountId,
|
|
84
|
+
userId: token.userId,
|
|
85
|
+
storageDir: ".",
|
|
86
|
+
createdAt: token.savedAt || now,
|
|
87
|
+
updatedAt: now,
|
|
88
|
+
};
|
|
89
|
+
saveToken(rootDir, { ...token, accountName });
|
|
90
|
+
writeRegistry(rootDir, { version: REGISTRY_VERSION, accounts: [...registry.accounts, record] });
|
|
91
|
+
return { record, storageDir: rootDir };
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Import token files created by the existing --instance implementation into
|
|
95
|
+
* the account index. Existing directories and runtime state stay in place.
|
|
96
|
+
*/
|
|
97
|
+
export function migrateInstanceTokens(rootDir) {
|
|
98
|
+
withRegistryLock(rootDir, () => migrateInstanceTokensUnlocked(rootDir));
|
|
99
|
+
}
|
|
100
|
+
function migrateInstanceTokensUnlocked(rootDir) {
|
|
101
|
+
const instancesDir = path.join(rootDir, "instances");
|
|
102
|
+
if (!fs.existsSync(instancesDir))
|
|
103
|
+
return;
|
|
104
|
+
for (const entry of fs.readdirSync(instancesDir, { withFileTypes: true })) {
|
|
105
|
+
if (!entry.isDirectory())
|
|
106
|
+
continue;
|
|
107
|
+
const storageDir = path.join(instancesDir, entry.name);
|
|
108
|
+
const token = loadToken(storageDir);
|
|
109
|
+
if (!token)
|
|
110
|
+
continue;
|
|
111
|
+
const registry = loadAccountRegistry(rootDir);
|
|
112
|
+
if (registry.accounts.some((account) => account.accountId === token.accountId)) {
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
const now = new Date().toISOString();
|
|
116
|
+
const accountName = uniqueLegacyName(registry.accounts, token.accountName ?? entry.name);
|
|
117
|
+
const record = {
|
|
118
|
+
accountKey: `instance-${shortHash(entry.name)}`,
|
|
119
|
+
accountName,
|
|
120
|
+
accountId: token.accountId,
|
|
121
|
+
userId: token.userId,
|
|
122
|
+
storageDir: path.join("instances", entry.name),
|
|
123
|
+
createdAt: token.savedAt || now,
|
|
124
|
+
updatedAt: now,
|
|
125
|
+
};
|
|
126
|
+
saveToken(storageDir, { ...token, accountName });
|
|
127
|
+
writeRegistry(rootDir, {
|
|
128
|
+
version: REGISTRY_VERSION,
|
|
129
|
+
accounts: [...registry.accounts, record],
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
export function discoverAccounts(rootDir) {
|
|
134
|
+
return withRegistryLock(rootDir, () => {
|
|
135
|
+
migrateLegacyTokenUnlocked(rootDir);
|
|
136
|
+
migrateInstanceTokensUnlocked(rootDir);
|
|
137
|
+
return listAccounts(rootDir);
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
export function registerAccount(params) {
|
|
141
|
+
return withRegistryLock(params.rootDir, () => registerAccountUnlocked(params));
|
|
142
|
+
}
|
|
143
|
+
function registerAccountUnlocked(params) {
|
|
144
|
+
const accountName = validateAccountName(params.accountName);
|
|
145
|
+
const registry = loadAccountRegistry(params.rootDir);
|
|
146
|
+
const byAccountId = registry.accounts.find((account) => account.accountId === params.token.accountId);
|
|
147
|
+
const overwrite = params.overwriteAccountKey
|
|
148
|
+
? registry.accounts.find((account) => account.accountKey === params.overwriteAccountKey)
|
|
149
|
+
: undefined;
|
|
150
|
+
if (params.overwriteAccountKey && !overwrite) {
|
|
151
|
+
throw new Error(`Account selected for overwrite no longer exists.`);
|
|
152
|
+
}
|
|
153
|
+
const target = byAccountId ?? overwrite;
|
|
154
|
+
const duplicateName = registry.accounts.find((account) => account.accountKey !== target?.accountKey &&
|
|
155
|
+
account.accountName.localeCompare(accountName, undefined, { sensitivity: "accent" }) === 0);
|
|
156
|
+
if (duplicateName) {
|
|
157
|
+
throw new Error(`Account name ${JSON.stringify(accountName)} is already used by ${formatAccountName(duplicateName)}.`);
|
|
158
|
+
}
|
|
159
|
+
const now = new Date().toISOString();
|
|
160
|
+
const accountKey = target?.accountKey ?? crypto.randomUUID();
|
|
161
|
+
const storageDir = target?.storageDir ?? path.join("instances", accountKey);
|
|
162
|
+
const record = {
|
|
163
|
+
accountKey,
|
|
164
|
+
accountName,
|
|
165
|
+
accountId: params.token.accountId,
|
|
166
|
+
userId: params.token.userId,
|
|
167
|
+
storageDir,
|
|
168
|
+
createdAt: target?.createdAt ?? now,
|
|
169
|
+
updatedAt: now,
|
|
170
|
+
};
|
|
171
|
+
const absoluteStorageDir = resolveStorageDir(params.rootDir, storageDir);
|
|
172
|
+
if (target && target.accountId !== params.token.accountId) {
|
|
173
|
+
resetAccountRuntimeState(absoluteStorageDir);
|
|
174
|
+
}
|
|
175
|
+
saveToken(absoluteStorageDir, { ...params.token, accountName });
|
|
176
|
+
writeRegistry(params.rootDir, {
|
|
177
|
+
version: REGISTRY_VERSION,
|
|
178
|
+
accounts: [
|
|
179
|
+
...registry.accounts.filter((account) => account.accountKey !== accountKey),
|
|
180
|
+
record,
|
|
181
|
+
],
|
|
182
|
+
});
|
|
183
|
+
return { record, storageDir: absoluteStorageDir };
|
|
184
|
+
}
|
|
185
|
+
function withRegistryLock(rootDir, action) {
|
|
186
|
+
fs.mkdirSync(rootDir, { recursive: true, mode: 0o700 });
|
|
187
|
+
const lockPath = path.join(rootDir, ".accounts.lock");
|
|
188
|
+
let fd;
|
|
189
|
+
const deadline = Date.now() + 5_000;
|
|
190
|
+
while (fd === undefined) {
|
|
191
|
+
try {
|
|
192
|
+
fd = fs.openSync(lockPath, "wx", 0o600);
|
|
193
|
+
}
|
|
194
|
+
catch (err) {
|
|
195
|
+
if (err.code !== "EEXIST")
|
|
196
|
+
throw err;
|
|
197
|
+
try {
|
|
198
|
+
const ageMs = Date.now() - fs.statSync(lockPath).mtimeMs;
|
|
199
|
+
if (ageMs > 30_000) {
|
|
200
|
+
fs.rmSync(lockPath, { force: true });
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
if (Date.now() >= deadline) {
|
|
208
|
+
throw new Error("Timed out waiting for another account registry update.");
|
|
209
|
+
}
|
|
210
|
+
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 50);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
try {
|
|
214
|
+
return action();
|
|
215
|
+
}
|
|
216
|
+
finally {
|
|
217
|
+
fs.closeSync(fd);
|
|
218
|
+
fs.rmSync(lockPath, { force: true });
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
function writeRegistry(rootDir, registry) {
|
|
222
|
+
fs.mkdirSync(rootDir, { recursive: true, mode: 0o700 });
|
|
223
|
+
const registryPath = getAccountsPath(rootDir);
|
|
224
|
+
const tmpPath = path.join(rootDir, `.accounts-${process.pid}-${Date.now()}.tmp`);
|
|
225
|
+
fs.writeFileSync(tmpPath, JSON.stringify(registry, null, 2) + "\n", {
|
|
226
|
+
encoding: "utf-8",
|
|
227
|
+
mode: 0o600,
|
|
228
|
+
});
|
|
229
|
+
try {
|
|
230
|
+
fs.renameSync(tmpPath, registryPath);
|
|
231
|
+
}
|
|
232
|
+
catch (err) {
|
|
233
|
+
const code = err.code;
|
|
234
|
+
if (process.platform !== "win32" || (code !== "EEXIST" && code !== "EPERM")) {
|
|
235
|
+
throw err;
|
|
236
|
+
}
|
|
237
|
+
fs.rmSync(registryPath, { force: true });
|
|
238
|
+
fs.renameSync(tmpPath, registryPath);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
function validateAccountRecord(value) {
|
|
242
|
+
if (!value || typeof value !== "object") {
|
|
243
|
+
throw new Error("Invalid account record.");
|
|
244
|
+
}
|
|
245
|
+
const account = value;
|
|
246
|
+
for (const field of [
|
|
247
|
+
"accountKey",
|
|
248
|
+
"accountName",
|
|
249
|
+
"accountId",
|
|
250
|
+
"userId",
|
|
251
|
+
"storageDir",
|
|
252
|
+
"createdAt",
|
|
253
|
+
"updatedAt",
|
|
254
|
+
]) {
|
|
255
|
+
if (typeof account[field] !== "string" || !account[field]) {
|
|
256
|
+
throw new Error(`Invalid account record field: ${field}`);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
validateAccountName(account.accountName);
|
|
260
|
+
return account;
|
|
261
|
+
}
|
|
262
|
+
function resolveStorageDir(rootDir, relativeDir) {
|
|
263
|
+
const resolvedRoot = path.resolve(rootDir);
|
|
264
|
+
const resolved = path.resolve(rootDir, relativeDir);
|
|
265
|
+
const relative = path.relative(resolvedRoot, resolved);
|
|
266
|
+
if (relative.startsWith("..") || path.isAbsolute(relative)) {
|
|
267
|
+
throw new Error(`Account storage directory escapes registry root: ${relativeDir}`);
|
|
268
|
+
}
|
|
269
|
+
return resolved;
|
|
270
|
+
}
|
|
271
|
+
function uniqueLegacyName(accounts, preferred) {
|
|
272
|
+
const base = validateAccountName(preferred);
|
|
273
|
+
let candidate = base;
|
|
274
|
+
let suffix = 2;
|
|
275
|
+
while (accounts.some((account) => account.accountName.localeCompare(candidate, undefined, { sensitivity: "accent" }) === 0)) {
|
|
276
|
+
candidate = `${base}-${suffix++}`;
|
|
277
|
+
}
|
|
278
|
+
return candidate;
|
|
279
|
+
}
|
|
280
|
+
function shortHash(value) {
|
|
281
|
+
return crypto.createHash("sha256").update(value).digest("hex").slice(0, 12);
|
|
282
|
+
}
|
|
283
|
+
function resetAccountRuntimeState(storageDir) {
|
|
284
|
+
for (const fileName of ["sync-buf.json", "state.json", "runtime.json", "daemon.pid"]) {
|
|
285
|
+
fs.rmSync(path.join(storageDir, fileName), { force: true });
|
|
286
|
+
}
|
|
287
|
+
fs.rmSync(path.join(storageDir, "inject"), { recursive: true, force: true });
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=accounts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../../src/storage/accounts.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,SAAS,EAAkB,MAAM,mBAAmB,CAAC;AAEzE,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAC3B,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAuBnC,MAAM,UAAU,mBAAmB,CAAC,WAAmB;IACrD,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;IACtC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,GAAG,uBAAuB,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,gCAAgC,uBAAuB,cAAc,CAAC,CAAC;IACzF,CAAC;IACD,IAAI,uBAAuB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAyD;IACzF,OAAO,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IACrD,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAA6B,CAAC;IAC3F,IAAI,GAAG,CAAC,OAAO,KAAK,gBAAgB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,4CAA4C,YAAY,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/E,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,OAAO,mBAAmB,CAAC,OAAO,CAAC,CAAC,QAAQ;SACzC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAChB,MAAM;QACN,UAAU,EAAE,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC;KAC1D,CAAC,CAAC;SACF,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACpB,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,SAAS,EAAE;QACzE,WAAW,EAAE,MAAM;KACpB,CAAC,CACH,CAAC;AACN,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,QAAgB;IAC9D,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,iBAAiB,EAAE,CAAC;IACvD,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAC1D,MAAM,CAAC,UAAU,CAAC,iBAAiB,EAAE,KAAK,UAAU;QACpD,MAAM,CAAC,WAAW,CAAC,iBAAiB,EAAE,KAAK,UAAU;QACrD,MAAM,CAAC,SAAS,CAAC,iBAAiB,EAAE,KAAK,UAAU;QACnD,iBAAiB,CAAC,MAAM,CAAC,CAAC,iBAAiB,EAAE,KAAK,UAAU,CAC7D,CAAC;IAEF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,qBAAqB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,sCAAsC,CACpF,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,OAAO,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,0BAA0B,CAAC,OAAe;IACjD,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IACjC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,CAAC,CAAC;IAC5F,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;IAC3F,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,WAAW,GAAG,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,WAAW,IAAI,SAAS,CAAC,CAAC;IACxF,MAAM,MAAM,GAAkB;QAC5B,UAAU,EAAE,UAAU,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;QAClD,WAAW;QACX,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,UAAU,EAAE,GAAG;QACf,SAAS,EAAE,KAAK,CAAC,OAAO,IAAI,GAAG;QAC/B,SAAS,EAAE,GAAG;KACf,CAAC;IAEF,SAAS,CAAC,OAAO,EAAE,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;IAC9C,aAAa,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IAChG,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;AACzC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,6BAA6B,CAAC,OAAO,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,6BAA6B,CAAC,OAAe;IACpD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IACrD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO;IAEzC,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,YAAY,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC1E,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;YAAE,SAAS;QACnC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK;YAAE,SAAS;QAErB,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/E,SAAS;QACX,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,WAAW,GAAG,gBAAgB,CAClC,QAAQ,CAAC,QAAQ,EACjB,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,IAAI,CAChC,CAAC;QACF,MAAM,MAAM,GAAkB;YAC5B,UAAU,EAAE,YAAY,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;YAC/C,WAAW;YACX,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC;YAC9C,SAAS,EAAE,KAAK,CAAC,OAAO,IAAI,GAAG;YAC/B,SAAS,EAAE,GAAG;SACf,CAAC;QACF,SAAS,CAAC,UAAU,EAAE,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QACjD,aAAa,CAAC,OAAO,EAAE;YACrB,OAAO,EAAE,gBAAgB;YACzB,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;SACzC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,OAAO,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;QACpC,0BAA0B,CAAC,OAAO,CAAC,CAAC;QACpC,6BAA6B,CAAC,OAAO,CAAC,CAAC;QACvC,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAK/B;IACC,OAAO,gBAAgB,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,uBAAuB,CAAC,MAKhC;IACC,MAAM,WAAW,GAAG,mBAAmB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACrD,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CACxC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,KAAK,MAAM,CAAC,KAAK,CAAC,SAAS,CAC1D,CAAC;IACF,MAAM,SAAS,GAAG,MAAM,CAAC,mBAAmB;QAC1C,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,KAAK,MAAM,CAAC,mBAAmB,CAAC;QACxF,CAAC,CAAC,SAAS,CAAC;IAEd,IAAI,MAAM,CAAC,mBAAmB,IAAI,CAAC,SAAS,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,MAAM,GAAG,WAAW,IAAI,SAAS,CAAC;IACxC,MAAM,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAC1C,CAAC,OAAO,EAAE,EAAE,CACV,OAAO,CAAC,UAAU,KAAK,MAAM,EAAE,UAAU;QACzC,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,WAAW,EAAE,SAAS,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,CAC7F,CAAC;IACF,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CACb,gBAAgB,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,uBAAuB,iBAAiB,CAAC,aAAa,CAAC,GAAG,CACtG,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,UAAU,GAAG,MAAM,EAAE,UAAU,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;IAC7D,MAAM,UAAU,GAAG,MAAM,EAAE,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IAC5E,MAAM,MAAM,GAAkB;QAC5B,UAAU;QACV,WAAW;QACX,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS;QACjC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM;QAC3B,UAAU;QACV,SAAS,EAAE,MAAM,EAAE,SAAS,IAAI,GAAG;QACnC,SAAS,EAAE,GAAG;KACf,CAAC;IACF,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAEzE,IAAI,MAAM,IAAI,MAAM,CAAC,SAAS,KAAK,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QAC1D,wBAAwB,CAAC,kBAAkB,CAAC,CAAC;IAC/C,CAAC;IACD,SAAS,CAAC,kBAAkB,EAAE,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;IAChE,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE;QAC5B,OAAO,EAAE,gBAAgB;QACzB,QAAQ,EAAE;YACR,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,KAAK,UAAU,CAAC;YAC3E,MAAM;SACP;KACF,CAAC,CAAC;IAEH,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,kBAAkB,EAAE,CAAC;AACpD,CAAC;AAED,SAAS,gBAAgB,CAAI,OAAe,EAAE,MAAe;IAC3D,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IACtD,IAAI,EAAsB,CAAC;IAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;IAEpC,OAAO,EAAE,KAAK,SAAS,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,GAAG,CAAC;YAChE,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC;gBACzD,IAAI,KAAK,GAAG,MAAM,EAAE,CAAC;oBACnB,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;oBACrC,SAAS;gBACX,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YACD,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;YAC5E,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACjB,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,OAAe,EAAE,QAAyB;IAC/D,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACxD,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACjF,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE;QAClE,QAAQ,EAAE,OAAO;QACjB,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;IACH,IAAI,CAAC;QACH,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,GAAI,GAA6B,CAAC,IAAI,CAAC;QACjD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,OAAO,CAAC,EAAE,CAAC;YAC5E,MAAM,GAAG,CAAC;QACZ,CAAC;QACD,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAc;IAC3C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;IACD,MAAM,OAAO,GAAG,KAA+B,CAAC;IAChD,KAAK,MAAM,KAAK,IAAI;QAClB,YAAY;QACZ,aAAa;QACb,WAAW;QACX,QAAQ;QACR,YAAY;QACZ,WAAW;QACX,WAAW;KACH,EAAE,CAAC;QACX,IAAI,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IACD,mBAAmB,CAAC,OAAO,CAAC,WAAqB,CAAC,CAAC;IACnD,OAAO,OAAwB,CAAC;AAClC,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAe,EAAE,WAAmB;IAC7D,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IACvD,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,oDAAoD,WAAW,EAAE,CAAC,CAAC;IACrF,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAyB,EAAE,SAAiB;IACpE,MAAM,IAAI,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAC5C,IAAI,SAAS,GAAG,IAAI,CAAC;IACrB,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,OACE,QAAQ,CAAC,IAAI,CACX,CAAC,OAAO,EAAE,EAAE,CACV,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,CAC3F,EACD,CAAC;QACD,SAAS,GAAG,GAAG,IAAI,IAAI,MAAM,EAAE,EAAE,CAAC;IACpC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,wBAAwB,CAAC,UAAkB;IAClD,KAAK,MAAM,QAAQ,IAAI,CAAC,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,CAAC,EAAE,CAAC;QACrF,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC/E,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface RuntimeRecord {
|
|
2
|
+
pid: number;
|
|
3
|
+
accountKey: string;
|
|
4
|
+
accountName: string;
|
|
5
|
+
accountId: string;
|
|
6
|
+
agent: string;
|
|
7
|
+
cwd: string;
|
|
8
|
+
startedAt: string;
|
|
9
|
+
daemon: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface RuntimeStatus {
|
|
12
|
+
running: boolean;
|
|
13
|
+
pid?: number;
|
|
14
|
+
runtime?: RuntimeRecord;
|
|
15
|
+
stale: boolean;
|
|
16
|
+
}
|
|
17
|
+
export declare function getPidPath(storageDir: string): string;
|
|
18
|
+
export declare function getRuntimePath(storageDir: string): string;
|
|
19
|
+
export declare function inspectRuntime(storageDir: string, cleanupStale?: boolean): RuntimeStatus;
|
|
20
|
+
export declare function claimRuntime(storageDir: string, runtime: RuntimeRecord): void;
|
|
21
|
+
export declare function releaseRuntime(storageDir: string, pid: number): void;
|
|
22
|
+
export declare function isProcessRunning(pid: number): boolean;
|
|
23
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/storage/runtime.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,UAAQ,GAAG,aAAa,CA8BtF;AAED,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CA+B7E;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAKpE;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOrD"}
|