codedeck 0.6.0 → 0.7.1
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.md +50 -35
- package/dist/cli/commands/claims.js +3 -2
- package/dist/cli/commands/claims.js.map +1 -1
- package/dist/cli/commands/doctor.js +8 -40
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/logs.js +2 -2
- package/dist/cli/commands/logs.js.map +1 -1
- package/dist/cli/commands/open.js +102 -11
- package/dist/cli/commands/open.js.map +1 -1
- package/dist/cli/commands/ps.js +6 -6
- package/dist/cli/commands/ps.js.map +1 -1
- package/dist/cli/commands/review.js +36 -58
- package/dist/cli/commands/review.js.map +1 -1
- package/dist/cli/commands/run.js +27 -27
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/setup.js +96 -314
- package/dist/cli/commands/setup.js.map +1 -1
- package/dist/cli/commands/show.js +2 -1
- package/dist/cli/commands/show.js.map +1 -1
- package/dist/cli/commands/ui.js +61 -0
- package/dist/cli/commands/ui.js.map +1 -0
- package/dist/cli/commands/usage-backfill.js +149 -0
- package/dist/cli/commands/usage-backfill.js.map +1 -0
- package/dist/cli/commands/usage.js +113 -45
- package/dist/cli/commands/usage.js.map +1 -1
- package/dist/cli/commands/wait.js +3 -2
- package/dist/cli/commands/wait.js.map +1 -1
- package/dist/cli/index.js +55 -39
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/web-launch.js +126 -0
- package/dist/cli/web-launch.js.map +1 -0
- package/dist/config/config.js +0 -70
- package/dist/config/config.js.map +1 -1
- package/dist/config/paths.js +1 -0
- package/dist/config/paths.js.map +1 -1
- package/dist/config/setup.js +248 -0
- package/dist/config/setup.js.map +1 -0
- package/dist/config/web-host.js +31 -0
- package/dist/config/web-host.js.map +1 -0
- package/dist/config/web-port.js +24 -0
- package/dist/config/web-port.js.map +1 -0
- package/dist/core/claude-transcript.js +226 -0
- package/dist/core/claude-transcript.js.map +1 -0
- package/dist/core/errors.js +17 -0
- package/dist/core/errors.js.map +1 -1
- package/dist/core/models.js +4 -1
- package/dist/core/models.js.map +1 -1
- package/dist/core/pricing.js +87 -55
- package/dist/core/pricing.js.map +1 -1
- package/dist/core/roles.js +6 -5
- package/dist/core/roles.js.map +1 -1
- package/dist/core/run-skills.js +114 -0
- package/dist/core/run-skills.js.map +1 -0
- package/dist/core/run-usage.js +56 -10
- package/dist/core/run-usage.js.map +1 -1
- package/dist/core/session.js +6 -16
- package/dist/core/session.js.map +1 -1
- package/dist/core/usage-query.js +41 -0
- package/dist/core/usage-query.js.map +1 -0
- package/dist/core/usage-source.js +17 -0
- package/dist/core/usage-source.js.map +1 -0
- package/dist/daemon/build-id.js +30 -0
- package/dist/daemon/build-id.js.map +1 -0
- package/dist/daemon/daemon.js +1257 -700
- package/dist/daemon/daemon.js.map +1 -1
- package/dist/daemon/instance-lock.js +48 -0
- package/dist/daemon/instance-lock.js.map +1 -0
- package/dist/daemon/ipc.js +4 -3
- package/dist/daemon/ipc.js.map +1 -1
- package/dist/daemon/web-supervisor.js +251 -0
- package/dist/daemon/web-supervisor.js.map +1 -0
- package/dist/drivers/claude/driver.js +1 -0
- package/dist/drivers/claude/driver.js.map +1 -1
- package/dist/drivers/codex/driver.js +14 -3
- package/dist/drivers/codex/driver.js.map +1 -1
- package/dist/drivers/codex/host-skills.js +57 -0
- package/dist/drivers/codex/host-skills.js.map +1 -0
- package/dist/drivers/opencode/driver.js +6 -2
- package/dist/drivers/opencode/driver.js.map +1 -1
- package/dist/drivers/session-driver.js +7 -1
- package/dist/drivers/session-driver.js.map +1 -1
- package/dist/drivers/session-runtime.js +2 -0
- package/dist/drivers/session-runtime.js.map +1 -1
- package/dist/drivers/terminal.js +15 -0
- package/dist/drivers/terminal.js.map +1 -1
- package/dist/git/diff.js +29 -4
- package/dist/git/diff.js.map +1 -1
- package/dist/open/contract.js.map +1 -1
- package/dist/open/launchers/claude.js +78 -2
- package/dist/open/launchers/claude.js.map +1 -1
- package/dist/open/link-watcher.js +44 -0
- package/dist/open/link-watcher.js.map +1 -0
- package/dist/open/pty.js +330 -5
- package/dist/open/pty.js.map +1 -1
- package/dist/open/runtime.js +15 -12
- package/dist/open/runtime.js.map +1 -1
- package/dist/plugin/agents/general.md +33 -6
- package/dist/plugin/hooks/pane-ticker.ts +102 -0
- package/dist/plugin/hooks/register.tsx +39 -18
- package/dist/plugin/hooks/session-id.sh +1 -1
- package/dist/plugin/mods/agents/pane.ts +285 -156
- package/dist/plugin/mods/agents/types.ts +23 -3
- package/dist/plugin/statusline.sh +57 -32
- package/dist/store/database.js +49 -1
- package/dist/store/database.js.map +1 -1
- package/dist/store/native-links.js +80 -0
- package/dist/store/native-links.js.map +1 -0
- package/dist/store/sessions.js +166 -51
- package/dist/store/sessions.js.map +1 -1
- package/dist/store/usage-ledger.js +153 -0
- package/dist/store/usage-ledger.js.map +1 -0
- package/dist/utils/process.js +2 -16
- package/dist/utils/process.js.map +1 -1
- package/dist/web/brand.js +59 -0
- package/dist/web/brand.js.map +1 -0
- package/dist/web/child.js +67 -0
- package/dist/web/child.js.map +1 -0
- package/dist/web/home-page.js +48 -0
- package/dist/web/home-page.js.map +1 -0
- package/dist/web/review-page.js +12 -5
- package/dist/web/review-page.js.map +1 -1
- package/dist/web/security.js +170 -0
- package/dist/web/security.js.map +1 -0
- package/dist/web/server.js +198 -0
- package/dist/web/server.js.map +1 -0
- package/dist/web/setup-icons.js +37 -0
- package/dist/web/setup-icons.js.map +1 -0
- package/dist/web/setup-page.js +1795 -0
- package/dist/web/setup-page.js.map +1 -0
- package/dist/web/setup-routes.js +475 -0
- package/dist/web/setup-routes.js.map +1 -0
- package/dist/web/usage-page.js +609 -0
- package/dist/web/usage-page.js.map +1 -0
- package/dist/web/usage-routes.js +88 -0
- package/dist/web/usage-routes.js.map +1 -0
- package/dist/web/web-token.js +56 -0
- package/dist/web/web-token.js.map +1 -0
- package/package.json +1 -1
- package/dist/plugin/prompts/_partials/commit.md +0 -145
- package/dist/plugin/prompts/_partials/pr-writer.md +0 -186
package/dist/core/roles.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { composeRunSection } from "./run-skills.js";
|
|
4
5
|
/**
|
|
5
6
|
* Resolve the bundled plugin from this module, not from the caller's cwd.
|
|
6
7
|
* Source files live below src/core; built files live below dist/core, and the
|
|
@@ -75,12 +76,12 @@ export function readCore(pluginDir) {
|
|
|
75
76
|
return fs.readFileSync(coreFile, "utf8");
|
|
76
77
|
}
|
|
77
78
|
/**
|
|
78
|
-
* The run-path composer: core first, then the role body,
|
|
79
|
-
* Core-first is deliberate: the inviolables take precedence
|
|
80
|
-
* and the shared prefix aids cache reuse across roles.
|
|
79
|
+
* The run-path composer: core first, then the role body, run instructions,
|
|
80
|
+
* and the task. Core-first is deliberate: the inviolables take precedence
|
|
81
|
+
* over role detail and the shared prefix aids cache reuse across roles.
|
|
81
82
|
*/
|
|
82
83
|
export function composeRunPrompt(pluginDir, role, prompt) {
|
|
83
|
-
return `${readCore(pluginDir).trimEnd()}\n\n---\n\n${roleBody(pluginDir, role)}\n\n---\n\n${prompt}`;
|
|
84
|
+
return `${readCore(pluginDir).trimEnd()}\n\n---\n\n${roleBody(pluginDir, role)}\n\n---\n\n${composeRunSection(pluginDir)}\n\n---\n\n${prompt}`;
|
|
84
85
|
}
|
|
85
86
|
/**
|
|
86
87
|
* Turns whatever `--role` carried into the prompt a worker receives.
|
|
@@ -92,7 +93,7 @@ export function composeRunPrompt(pluginDir, role, prompt) {
|
|
|
92
93
|
*/
|
|
93
94
|
export function resolveRolePrompt(pluginDir, roleInput, prompt) {
|
|
94
95
|
if (roleInput === undefined)
|
|
95
|
-
return prompt
|
|
96
|
+
return `${composeRunSection(pluginDir)}\n\n---\n\n${prompt}`;
|
|
96
97
|
const role = parseRole(roleInput);
|
|
97
98
|
if (!role) {
|
|
98
99
|
throw new Error(`Invalid role "${roleInput}". Available roles: ${ROLES.join(", ")}`);
|
package/dist/core/roles.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roles.js","sourceRoot":"","sources":["../../src/core/roles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"roles.js","sourceRoot":"","sources":["../../src/core/roles.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
const FRONTMATTER = /^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/;
|
|
4
|
+
function parseScalar(value) {
|
|
5
|
+
const trimmed = value.trim();
|
|
6
|
+
if (!trimmed)
|
|
7
|
+
return "";
|
|
8
|
+
if (trimmed.startsWith("'")) {
|
|
9
|
+
const quoted = /^('(?:''|[^'])*')(?:\s+#.*)?$/.exec(trimmed)?.[1];
|
|
10
|
+
if (!quoted)
|
|
11
|
+
return undefined;
|
|
12
|
+
return quoted.slice(1, -1).replace(/''/g, "'");
|
|
13
|
+
}
|
|
14
|
+
if (trimmed.startsWith('"')) {
|
|
15
|
+
const quoted = /^("(?:\\.|[^"\\])*")(?:\s+#.*)?$/.exec(trimmed)?.[1];
|
|
16
|
+
if (!quoted)
|
|
17
|
+
return undefined;
|
|
18
|
+
try {
|
|
19
|
+
const parsed = JSON.parse(quoted);
|
|
20
|
+
return typeof parsed === "string" ? parsed : undefined;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
const commentStart = trimmed.search(/\s#/);
|
|
27
|
+
return (commentStart === -1 ? trimmed : trimmed.slice(0, commentStart)).trimEnd();
|
|
28
|
+
}
|
|
29
|
+
function parseSkillFrontmatter(source) {
|
|
30
|
+
const match = FRONTMATTER.exec(source);
|
|
31
|
+
if (!match)
|
|
32
|
+
return undefined;
|
|
33
|
+
let name;
|
|
34
|
+
let description;
|
|
35
|
+
const lines = match[1].split(/\r?\n/);
|
|
36
|
+
let index = 0;
|
|
37
|
+
while (index < lines.length) {
|
|
38
|
+
const line = lines[index];
|
|
39
|
+
const field = /^(name|description):(.*)$/.exec(line);
|
|
40
|
+
if (!field) {
|
|
41
|
+
index++;
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
const rawValue = field[2] ?? "";
|
|
45
|
+
if (field[1] === "description") {
|
|
46
|
+
const block = /^([>|])[+-]?$/.exec(rawValue.trim());
|
|
47
|
+
if (block) {
|
|
48
|
+
const content = [];
|
|
49
|
+
let next = index + 1;
|
|
50
|
+
while (next < lines.length && (lines[next] === "" || /^[ \t]/.test(lines[next]))) {
|
|
51
|
+
content.push(lines[next].replace(/^[ \t]+/, ""));
|
|
52
|
+
next++;
|
|
53
|
+
}
|
|
54
|
+
const joined = block[1] === ">" ? content.join(" ") : content.join("\n");
|
|
55
|
+
description = joined.replace(/\s+/g, " ").trim();
|
|
56
|
+
index = next;
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const value = parseScalar(rawValue);
|
|
61
|
+
if (field[1] === "name")
|
|
62
|
+
name = value;
|
|
63
|
+
else
|
|
64
|
+
description = value;
|
|
65
|
+
index++;
|
|
66
|
+
}
|
|
67
|
+
if (!name)
|
|
68
|
+
return undefined;
|
|
69
|
+
return { name, description: description ?? "" };
|
|
70
|
+
}
|
|
71
|
+
export function readRunSkills(pluginDir) {
|
|
72
|
+
const skillsDir = path.join(pluginDir, "skills");
|
|
73
|
+
let entries;
|
|
74
|
+
try {
|
|
75
|
+
entries = fs.readdirSync(skillsDir);
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return [];
|
|
79
|
+
}
|
|
80
|
+
const skills = [];
|
|
81
|
+
for (const entry of entries) {
|
|
82
|
+
const skillPath = path.resolve(skillsDir, entry, "SKILL.md");
|
|
83
|
+
try {
|
|
84
|
+
if (!fs.statSync(skillPath).isFile())
|
|
85
|
+
continue;
|
|
86
|
+
const parsed = parseSkillFrontmatter(fs.readFileSync(skillPath, "utf8"));
|
|
87
|
+
if (!parsed)
|
|
88
|
+
continue;
|
|
89
|
+
skills.push({ ...parsed, path: skillPath });
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
// One malformed or unreadable skill must not prevent a run prompt.
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return skills.sort((left, right) => left.name < right.name ? -1 : left.name > right.name ? 1 : 0);
|
|
96
|
+
}
|
|
97
|
+
export function composeRunSection(pluginDir) {
|
|
98
|
+
const lines = [
|
|
99
|
+
"## Run instructions",
|
|
100
|
+
"This worker runs non-interactively in the background.",
|
|
101
|
+
"Nobody answers approval, direction, or confirmation questions during this run.",
|
|
102
|
+
"When a skill or habit says to ask before implementing, make the reasonable call, record the assumption in the final report, and deliver.",
|
|
103
|
+
"Report a real blocker, such as a missing credential, a change outside the owned files, or a stop condition in the briefing, then stop. Follow the briefing's stop conditions.",
|
|
104
|
+
];
|
|
105
|
+
const skills = readRunSkills(pluginDir);
|
|
106
|
+
if (skills.length === 0)
|
|
107
|
+
return lines.join("\n");
|
|
108
|
+
lines.push("", "## CodeDeck skills", "When the prompt asks for a skill by one of these names, read its `SKILL.md` and follow it. Resolve relative references against that file's directory.");
|
|
109
|
+
for (const skill of skills) {
|
|
110
|
+
lines.push(`- ${skill.name}: ${skill.description}`, ` ${skill.path}`);
|
|
111
|
+
}
|
|
112
|
+
return lines.join("\n");
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=run-skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-skills.js","sourceRoot":"","sources":["../../src/core/run-skills.ts"],"names":[],"mappings":"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"}
|
package/dist/core/run-usage.js
CHANGED
|
@@ -1,31 +1,49 @@
|
|
|
1
|
-
import { computeSessionCost } from "./pricing.js";
|
|
1
|
+
import { cachedInInputFor, computeSessionCost, totalTokensFor } from "./pricing.js";
|
|
2
2
|
import { isActiveStatus } from "./session.js";
|
|
3
3
|
/**
|
|
4
4
|
* Aggregates the last persisted usage value for each session in a run.
|
|
5
5
|
* An empty run is complete because it has no session without a known cost.
|
|
6
6
|
*/
|
|
7
|
-
export function aggregateRunUsage(runId, sessions) {
|
|
7
|
+
export function aggregateRunUsage(runId, sessions, attributions = [], linkStates = []) {
|
|
8
8
|
const uniqueSessions = new Map();
|
|
9
9
|
for (const session of sessions)
|
|
10
10
|
uniqueSessions.set(session.id, session);
|
|
11
|
+
const orchestratorSessions = new Set([...uniqueSessions.values()]
|
|
12
|
+
.filter((session) => session.origin === "open")
|
|
13
|
+
.map((session) => session.id));
|
|
11
14
|
const summary = {
|
|
12
15
|
runId,
|
|
13
16
|
inputTokens: 0,
|
|
14
17
|
outputTokens: 0,
|
|
15
18
|
cachedTokens: 0,
|
|
19
|
+
totalTokens: 0,
|
|
16
20
|
costUsd: 0,
|
|
17
|
-
sessionCount:
|
|
18
|
-
activeSessionCount:
|
|
21
|
+
sessionCount: 0,
|
|
22
|
+
activeSessionCount: 0,
|
|
19
23
|
costComplete: true,
|
|
20
24
|
sessionsWithoutCost: 0,
|
|
25
|
+
orchestrator: {
|
|
26
|
+
costUsd: 0,
|
|
27
|
+
costComplete: true,
|
|
28
|
+
inputTokens: 0,
|
|
29
|
+
outputTokens: 0,
|
|
30
|
+
cachedTokens: 0,
|
|
31
|
+
totalTokens: 0,
|
|
32
|
+
sources: [],
|
|
33
|
+
},
|
|
34
|
+
total: { costUsd: 0 },
|
|
21
35
|
};
|
|
22
36
|
for (const session of uniqueSessions.values()) {
|
|
37
|
+
const isOrchestrator = session.origin === "open";
|
|
23
38
|
const usage = session.usage;
|
|
24
|
-
summary.
|
|
25
|
-
|
|
26
|
-
|
|
39
|
+
const target = isOrchestrator ? summary.orchestrator : summary;
|
|
40
|
+
target.inputTokens += usage?.inputTokens ?? 0;
|
|
41
|
+
target.outputTokens += usage?.outputTokens ?? 0;
|
|
42
|
+
target.cachedTokens += usage?.cachedTokens ?? 0;
|
|
43
|
+
target.totalTokens += totalTokensFor(session.agent, usage);
|
|
27
44
|
const costUsd = computeSessionCost({
|
|
28
45
|
model: session.model,
|
|
46
|
+
cachedInInput: cachedInInputFor(session.agent),
|
|
29
47
|
reportedCost: usage?.cost,
|
|
30
48
|
usage: {
|
|
31
49
|
inputTokens: usage?.inputTokens,
|
|
@@ -34,13 +52,41 @@ export function aggregateRunUsage(runId, sessions) {
|
|
|
34
52
|
},
|
|
35
53
|
});
|
|
36
54
|
if (costUsd === null) {
|
|
37
|
-
|
|
38
|
-
|
|
55
|
+
if (isOrchestrator) {
|
|
56
|
+
summary.orchestrator.costComplete = false;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
summary.costComplete = false;
|
|
60
|
+
summary.sessionsWithoutCost += 1;
|
|
61
|
+
}
|
|
39
62
|
}
|
|
40
63
|
else {
|
|
41
|
-
|
|
64
|
+
target.costUsd += costUsd;
|
|
42
65
|
}
|
|
66
|
+
if (!isOrchestrator) {
|
|
67
|
+
summary.sessionCount++;
|
|
68
|
+
if (isActiveStatus(session.status))
|
|
69
|
+
summary.activeSessionCount++;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
for (const linkState of linkStates) {
|
|
73
|
+
if (orchestratorSessions.has(linkState.sessionId) &&
|
|
74
|
+
(linkState.state === "missing" || linkState.state === "no-price")) {
|
|
75
|
+
summary.orchestrator.costComplete = false;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
const sourceCosts = new Map();
|
|
79
|
+
for (const attribution of attributions) {
|
|
80
|
+
if (!orchestratorSessions.has(attribution.sessionId))
|
|
81
|
+
continue;
|
|
82
|
+
const cost = attribution.cost ?? 0;
|
|
83
|
+
sourceCosts.set(attribution.sourceKey, (sourceCosts.get(attribution.sourceKey) ?? 0) + cost);
|
|
43
84
|
}
|
|
85
|
+
summary.orchestrator.sources = [...sourceCosts].map(([sourceKey, costUsd]) => ({
|
|
86
|
+
nativeId: sourceKey.replace(/^claude-open:/, ""),
|
|
87
|
+
costUsd,
|
|
88
|
+
}));
|
|
89
|
+
summary.total.costUsd = summary.costUsd + summary.orchestrator.costUsd;
|
|
44
90
|
return summary;
|
|
45
91
|
}
|
|
46
92
|
//# sourceMappingURL=run-usage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-usage.js","sourceRoot":"","sources":["../../src/core/run-usage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"run-usage.js","sourceRoot":"","sources":["../../src/core/run-usage.ts"],"names":[],"mappings":"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"}
|
package/dist/core/session.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
1
2
|
export const AGENT_IDS = ["claude", "codex", "opencode", "omp", "antigravity"];
|
|
2
3
|
export function normalizeAgentId(value) {
|
|
3
4
|
if (typeof value !== "string")
|
|
@@ -11,6 +12,10 @@ export function normalizeAgentId(value) {
|
|
|
11
12
|
export function isAgentId(value) {
|
|
12
13
|
return typeof value === "string" && AGENT_IDS.includes(value);
|
|
13
14
|
}
|
|
15
|
+
export const SESSION_ID_DISPLAY_LENGTH = 8;
|
|
16
|
+
export function shortSessionId(id) {
|
|
17
|
+
return id.slice(0, SESSION_ID_DISPLAY_LENGTH);
|
|
18
|
+
}
|
|
14
19
|
export function isTerminalStatus(status) {
|
|
15
20
|
return status === "completed" || status === "failed" || status === "stopped" || status === "orphaned" || status === "interrupted";
|
|
16
21
|
}
|
|
@@ -23,22 +28,7 @@ export function liveStatus(status, pid, alive) {
|
|
|
23
28
|
return status;
|
|
24
29
|
}
|
|
25
30
|
export function generateSessionId() {
|
|
26
|
-
|
|
27
|
-
// Use 8 hex chars, display first 4 but store full
|
|
28
|
-
const bytes = new Uint8Array(4);
|
|
29
|
-
// Node crypto
|
|
30
|
-
// Use simple random for now; crypto available globally
|
|
31
|
-
try {
|
|
32
|
-
// @ts-ignore
|
|
33
|
-
globalThis.crypto?.getRandomValues?.(bytes);
|
|
34
|
-
if (bytes[0] === 0 && bytes[1] === 0 && bytes[2] === 0 && bytes[3] === 0)
|
|
35
|
-
throw new Error("zero");
|
|
36
|
-
}
|
|
37
|
-
catch {
|
|
38
|
-
for (let i = 0; i < 4; i++)
|
|
39
|
-
bytes[i] = Math.floor(Math.random() * 256);
|
|
40
|
-
}
|
|
41
|
-
return Array.from(bytes).map((b) => b.toString(16).padStart(2, "0")).join("").slice(0, 4);
|
|
31
|
+
return randomBytes(8).toString("hex");
|
|
42
32
|
}
|
|
43
33
|
export function generateBranchName(slug, sessionId) {
|
|
44
34
|
const clean = slug
|
package/dist/core/session.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/core/session.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/core/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1C,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,CAAU,CAAC;AAGxF,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9C,IAAI,UAAU,KAAK,KAAK;QAAE,OAAO,aAAa,CAAC;IAC/C,OAAO,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;AACxD,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,SAA+B,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC;AAE3C,MAAM,UAAU,cAAc,CAAC,EAAU;IACvC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,yBAAyB,CAAC,CAAC;AAChD,CAAC;AAiFD,MAAM,UAAU,gBAAgB,CAAC,MAAqB;IACpD,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,aAAa,CAAC;AACpI,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAqB;IAClD,OAAO,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,aAAa,IAAI,MAAM,KAAK,MAAM,CAAC;AACxG,CAAC;AAOD,MAAM,UAAU,UAAU,CACxB,MAAqB,EACrB,GAA8B,EAC9B,KAAc;IAEd,IAAI,cAAc,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC,KAAK;QAAE,OAAO,MAAM,CAAC;IACnE,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,SAAiB;IAChE,MAAM,KAAK,GAAG,IAAI;SACf,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC;IAC1B,OAAO,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export function buildUsageQueryParams(opts, cwd, now) {
|
|
2
|
+
let period;
|
|
3
|
+
let since = opts.since;
|
|
4
|
+
const until = opts.until;
|
|
5
|
+
if (opts.all) {
|
|
6
|
+
period = "all";
|
|
7
|
+
}
|
|
8
|
+
else if (opts.today) {
|
|
9
|
+
period = "today";
|
|
10
|
+
}
|
|
11
|
+
else if (opts.days) {
|
|
12
|
+
const days = parseInt(opts.days, 10);
|
|
13
|
+
if (days === 3)
|
|
14
|
+
period = "3d";
|
|
15
|
+
else if (days === 7)
|
|
16
|
+
period = "7d";
|
|
17
|
+
else if (days === 30)
|
|
18
|
+
period = "30d";
|
|
19
|
+
else if (!isNaN(days) && days > 0) {
|
|
20
|
+
const sinceDate = new Date(now.getFullYear(), now.getMonth(), now.getDate() - (days - 1), 0, 0, 0, 0);
|
|
21
|
+
since = sinceDate.toISOString();
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
else if (!since) {
|
|
25
|
+
// Default to today if no temporal flags provided
|
|
26
|
+
period = "today";
|
|
27
|
+
}
|
|
28
|
+
let repository = opts.repo;
|
|
29
|
+
if (opts.current) {
|
|
30
|
+
repository = cwd;
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
period,
|
|
34
|
+
since,
|
|
35
|
+
until,
|
|
36
|
+
repository,
|
|
37
|
+
model: opts.model,
|
|
38
|
+
agent: opts.agent,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=usage-query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-query.js","sourceRoot":"","sources":["../../src/core/usage-query.ts"],"names":[],"mappings":"AAeA,MAAM,UAAU,qBAAqB,CACnC,IAAuB,EACvB,GAAW,EACX,GAAS;IAET,IAAI,MAA+B,CAAC;IACpC,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACvB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IAEzB,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,KAAK,CAAC;IACjB,CAAC;SAAM,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACtB,MAAM,GAAG,OAAO,CAAC;IACnB,CAAC;SAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACrC,IAAI,IAAI,KAAK,CAAC;YAAE,MAAM,GAAG,IAAI,CAAC;aACzB,IAAI,IAAI,KAAK,CAAC;YAAE,MAAM,GAAG,IAAI,CAAC;aAC9B,IAAI,IAAI,KAAK,EAAE;YAAE,MAAM,GAAG,KAAK,CAAC;aAChC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;YAClC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACtG,KAAK,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;QAClC,CAAC;IACH,CAAC;SAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QAClB,iDAAiD;QACjD,MAAM,GAAG,OAAO,CAAC;IACnB,CAAC;IAED,IAAI,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC;IAC3B,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,UAAU,GAAG,GAAG,CAAC;IACnB,CAAC;IAED,OAAO;QACL,MAAM;QACN,KAAK;QACL,KAAK;QACL,UAAU;QACV,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,KAAK,EAAE,IAAI,CAAC,KAA4B;KACzC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export function workerSourceKey(session, processOrdinal) {
|
|
2
|
+
switch (session.agent) {
|
|
3
|
+
case "claude":
|
|
4
|
+
return `claude:${session.nativeSessionId ?? session.id}#${processOrdinal}`;
|
|
5
|
+
case "codex":
|
|
6
|
+
return `codex:${session.nativeSessionId ?? session.id}`;
|
|
7
|
+
case "antigravity":
|
|
8
|
+
case "omp":
|
|
9
|
+
return `session:${session.id}`;
|
|
10
|
+
case "opencode":
|
|
11
|
+
break;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export function openSourceKey(nativeId) {
|
|
15
|
+
return `claude-open:${nativeId}`;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=usage-source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-source.js","sourceRoot":"","sources":["../../src/core/usage-source.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,eAAe,CAC7B,OAA0D,EAC1D,cAAsB;IAEtB,QAAQ,OAAO,CAAC,KAAK,EAAE,CAAC;QACtB,KAAK,QAAQ;YACX,OAAO,UAAU,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC,EAAE,IAAI,cAAc,EAAE,CAAC;QAC7E,KAAK,OAAO;YACV,OAAO,SAAS,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;QAC1D,KAAK,aAAa,CAAC;QACnB,KAAK,KAAK;YACR,OAAO,WAAW,OAAO,CAAC,EAAE,EAAE,CAAC;QACjC,KAAK,UAAU;YACb,MAAM;IACV,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,OAAO,eAAe,QAAQ,EAAE,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
/** The dist root of a compiled module: two directories above `dist/<dir>/<file>.js`. */
|
|
5
|
+
export function distRootFor(moduleUrl) {
|
|
6
|
+
return path.dirname(path.dirname(fileURLToPath(moduleUrl)));
|
|
7
|
+
}
|
|
8
|
+
/** Newest `.js` mtime under `root`, as a decimal string; `"0"` when there is none. */
|
|
9
|
+
export function computeBuildId(root) {
|
|
10
|
+
let newest = 0;
|
|
11
|
+
const walk = (dir) => {
|
|
12
|
+
let entries;
|
|
13
|
+
try {
|
|
14
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
for (const entry of entries) {
|
|
20
|
+
const full = path.join(dir, entry.name);
|
|
21
|
+
if (entry.isDirectory())
|
|
22
|
+
walk(full);
|
|
23
|
+
else if (entry.isFile() && entry.name.endsWith(".js"))
|
|
24
|
+
newest = Math.max(newest, fs.statSync(full).mtimeMs);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
walk(root);
|
|
28
|
+
return String(newest);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=build-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-id.js","sourceRoot":"","sources":["../../src/daemon/build-id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,wFAAwF;AACxF,MAAM,UAAU,WAAW,CAAC,SAAiB;IAC3C,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,IAAI,GAAG,CAAC,GAAW,EAAQ,EAAE;QACjC,IAAI,OAAoB,CAAC;QACzB,IAAI,CAAC;YACH,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,KAAK,CAAC,WAAW,EAAE;gBAAE,IAAI,CAAC,IAAI,CAAC,CAAC;iBAC/B,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;QAC9G,CAAC;IACH,CAAC,CAAC;IACF,IAAI,CAAC,IAAI,CAAC,CAAC;IACX,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;AACxB,CAAC"}
|