@shardworks/nexus-core 0.1.99 → 0.1.101
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 +95 -166
- package/dist/guild-config.d.ts +14 -52
- package/dist/guild-config.d.ts.map +1 -1
- package/dist/guild-config.js +7 -10
- package/dist/guild-config.js.map +1 -1
- package/dist/guild.d.ts +83 -0
- package/dist/guild.d.ts.map +1 -0
- package/dist/guild.js +45 -0
- package/dist/guild.js.map +1 -0
- package/dist/id.d.ts +14 -0
- package/dist/id.d.ts.map +1 -0
- package/dist/id.js +19 -0
- package/dist/id.js.map +1 -0
- package/dist/index.d.ts +6 -30
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -32
- package/dist/index.js.map +1 -1
- package/dist/nexus-home.d.ts +0 -4
- package/dist/nexus-home.d.ts.map +1 -1
- package/dist/nexus-home.js +1 -9
- package/dist/nexus-home.js.map +1 -1
- package/dist/plugin.d.ts +115 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +39 -0
- package/dist/plugin.js.map +1 -0
- package/dist/resolve-package.d.ts +58 -0
- package/dist/resolve-package.d.ts.map +1 -0
- package/dist/resolve-package.js +123 -0
- package/dist/resolve-package.js.map +1 -0
- package/package.json +5 -14
- package/dist/book.d.ts +0 -110
- package/dist/book.d.ts.map +0 -1
- package/dist/book.js +0 -16
- package/dist/book.js.map +0 -1
- package/dist/legacy/1/anima.d.ts +0 -79
- package/dist/legacy/1/anima.d.ts.map +0 -1
- package/dist/legacy/1/anima.js +0 -285
- package/dist/legacy/1/anima.js.map +0 -1
- package/dist/legacy/1/audit.d.ts +0 -23
- package/dist/legacy/1/audit.d.ts.map +0 -1
- package/dist/legacy/1/audit.js +0 -61
- package/dist/legacy/1/audit.js.map +0 -1
- package/dist/legacy/1/bundle.d.ts +0 -111
- package/dist/legacy/1/bundle.d.ts.map +0 -1
- package/dist/legacy/1/bundle.js +0 -452
- package/dist/legacy/1/bundle.js.map +0 -1
- package/dist/legacy/1/clock-daemon.d.ts +0 -2
- package/dist/legacy/1/clock-daemon.d.ts.map +0 -1
- package/dist/legacy/1/clock-daemon.js +0 -72
- package/dist/legacy/1/clock-daemon.js.map +0 -1
- package/dist/legacy/1/clockworks.d.ts +0 -98
- package/dist/legacy/1/clockworks.d.ts.map +0 -1
- package/dist/legacy/1/clockworks.js +0 -359
- package/dist/legacy/1/clockworks.js.map +0 -1
- package/dist/legacy/1/conversation.d.ts +0 -165
- package/dist/legacy/1/conversation.d.ts.map +0 -1
- package/dist/legacy/1/conversation.js +0 -457
- package/dist/legacy/1/conversation.js.map +0 -1
- package/dist/legacy/1/engine.d.ts +0 -90
- package/dist/legacy/1/engine.d.ts.map +0 -1
- package/dist/legacy/1/engine.js +0 -89
- package/dist/legacy/1/engine.js.map +0 -1
- package/dist/legacy/1/events.d.ts +0 -88
- package/dist/legacy/1/events.d.ts.map +0 -1
- package/dist/legacy/1/events.js +0 -239
- package/dist/legacy/1/events.js.map +0 -1
- package/dist/legacy/1/guild-config.d.ts +0 -74
- package/dist/legacy/1/guild-config.d.ts.map +0 -1
- package/dist/legacy/1/guild-config.js +0 -51
- package/dist/legacy/1/guild-config.js.map +0 -1
- package/dist/legacy/1/id.d.ts +0 -8
- package/dist/legacy/1/id.d.ts.map +0 -1
- package/dist/legacy/1/id.js +0 -27
- package/dist/legacy/1/id.js.map +0 -1
- package/dist/legacy/1/index.d.ts +0 -28
- package/dist/legacy/1/index.d.ts.map +0 -1
- package/dist/legacy/1/index.js +0 -32
- package/dist/legacy/1/index.js.map +0 -1
- package/dist/legacy/1/init-guild.d.ts +0 -24
- package/dist/legacy/1/init-guild.d.ts.map +0 -1
- package/dist/legacy/1/init-guild.js +0 -230
- package/dist/legacy/1/init-guild.js.map +0 -1
- package/dist/legacy/1/install-tool.d.ts +0 -73
- package/dist/legacy/1/install-tool.d.ts.map +0 -1
- package/dist/legacy/1/install-tool.js +0 -436
- package/dist/legacy/1/install-tool.js.map +0 -1
- package/dist/legacy/1/instantiate.d.ts +0 -33
- package/dist/legacy/1/instantiate.d.ts.map +0 -1
- package/dist/legacy/1/instantiate.js +0 -137
- package/dist/legacy/1/instantiate.js.map +0 -1
- package/dist/legacy/1/manifest.d.ts +0 -132
- package/dist/legacy/1/manifest.d.ts.map +0 -1
- package/dist/legacy/1/manifest.js +0 -321
- package/dist/legacy/1/manifest.js.map +0 -1
- package/dist/legacy/1/migrate.d.ts +0 -84
- package/dist/legacy/1/migrate.d.ts.map +0 -1
- package/dist/legacy/1/migrate.js +0 -228
- package/dist/legacy/1/migrate.js.map +0 -1
- package/dist/legacy/1/nexus-home.d.ts +0 -11
- package/dist/legacy/1/nexus-home.d.ts.map +0 -1
- package/dist/legacy/1/nexus-home.js +0 -16
- package/dist/legacy/1/nexus-home.js.map +0 -1
- package/dist/legacy/1/plugin-descriptor.d.ts +0 -3
- package/dist/legacy/1/plugin-descriptor.d.ts.map +0 -1
- package/dist/legacy/1/plugin-descriptor.js +0 -2
- package/dist/legacy/1/plugin-descriptor.js.map +0 -1
- package/dist/legacy/1/preconditions.d.ts +0 -100
- package/dist/legacy/1/preconditions.d.ts.map +0 -1
- package/dist/legacy/1/preconditions.js +0 -189
- package/dist/legacy/1/preconditions.js.map +0 -1
- package/dist/legacy/1/rehydrate.d.ts +0 -22
- package/dist/legacy/1/rehydrate.d.ts.map +0 -1
- package/dist/legacy/1/rehydrate.js +0 -109
- package/dist/legacy/1/rehydrate.js.map +0 -1
- package/dist/legacy/1/remove-tool.d.ts +0 -19
- package/dist/legacy/1/remove-tool.d.ts.map +0 -1
- package/dist/legacy/1/remove-tool.js +0 -105
- package/dist/legacy/1/remove-tool.js.map +0 -1
- package/dist/legacy/1/session.d.ts +0 -343
- package/dist/legacy/1/session.d.ts.map +0 -1
- package/dist/legacy/1/session.js +0 -499
- package/dist/legacy/1/session.js.map +0 -1
- package/dist/legacy/1/tool-registry.d.ts +0 -12
- package/dist/legacy/1/tool-registry.d.ts.map +0 -1
- package/dist/legacy/1/tool-registry.js +0 -28
- package/dist/legacy/1/tool-registry.js.map +0 -1
- package/dist/legacy/1/tool.d.ts +0 -10
- package/dist/legacy/1/tool.d.ts.map +0 -1
- package/dist/legacy/1/tool.js +0 -2
- package/dist/legacy/1/tool.js.map +0 -1
- package/dist/legacy/1/upgrade.d.ts +0 -129
- package/dist/legacy/1/upgrade.d.ts.map +0 -1
- package/dist/legacy/1/upgrade.js +0 -355
- package/dist/legacy/1/upgrade.js.map +0 -1
- package/dist/legacy/1/workshop.d.ts +0 -95
- package/dist/legacy/1/workshop.d.ts.map +0 -1
- package/dist/legacy/1/workshop.js +0 -229
- package/dist/legacy/1/workshop.js.map +0 -1
- package/dist/legacy/1/worktree.d.ts +0 -67
- package/dist/legacy/1/worktree.d.ts.map +0 -1
- package/dist/legacy/1/worktree.js +0 -117
- package/dist/legacy/1/worktree.js.map +0 -1
- package/dist/legacy/1/writ.d.ts +0 -130
- package/dist/legacy/1/writ.d.ts.map +0 -1
- package/dist/legacy/1/writ.js +0 -599
- package/dist/legacy/1/writ.js.map +0 -1
- package/dist/rig-context.d.ts +0 -47
- package/dist/rig-context.d.ts.map +0 -1
- package/dist/rig-context.js +0 -11
- package/dist/rig-context.js.map +0 -1
- package/dist/rig-descriptor.d.ts +0 -39
- package/dist/rig-descriptor.d.ts.map +0 -1
- package/dist/rig-descriptor.js +0 -12
- package/dist/rig-descriptor.js.map +0 -1
- package/dist/rig.d.ts +0 -70
- package/dist/rig.d.ts.map +0 -1
- package/dist/rig.js +0 -14
- package/dist/rig.js.map +0 -1
- package/dist/tool.d.ts +0 -136
- package/dist/tool.d.ts.map +0 -1
- package/dist/tool.js +0 -135
- package/dist/tool.js.map +0 -1
- package/migrations/001-schema.sql +0 -177
- package/migrations/002-writs.sql +0 -44
- package/migrations/003-conversations.sql +0 -43
- package/migrations/004-remove-commissions.sql +0 -24
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* rehydrate — reconstruct runtime state from git-tracked guild state.
|
|
3
|
-
*
|
|
4
|
-
* After a fresh clone, the guild's node_modules is empty and workshop bare
|
|
5
|
-
* clones are missing. This function:
|
|
6
|
-
* 1. Re-clones workshop bare repos from their remote URLs in guild.json
|
|
7
|
-
* 2. Runs `npm install` to resolve registry/git-url deps from package.json
|
|
8
|
-
* 3. For each tool with full source on disk (workshop/tarball), runs
|
|
9
|
-
* `npm install --no-save <tool-path>` to install from the tracked source
|
|
10
|
-
* 4. Reports any linked tools that need to be re-linked manually
|
|
11
|
-
*/
|
|
12
|
-
import fs from 'node:fs';
|
|
13
|
-
import path from 'node:path';
|
|
14
|
-
import { execFileSync } from 'node:child_process';
|
|
15
|
-
import { readGuildConfig } from "./guild-config.js";
|
|
16
|
-
import { workshopBarePath, workshopsPath } from "./nexus-home.js";
|
|
17
|
-
/** Map category -> on-disk parent directory (relative to guild root). */
|
|
18
|
-
const DIR_MAP = {
|
|
19
|
-
tools: 'tools',
|
|
20
|
-
engines: 'engines',
|
|
21
|
-
curricula: 'training/curricula',
|
|
22
|
-
temperaments: 'training/temperaments',
|
|
23
|
-
};
|
|
24
|
-
/**
|
|
25
|
-
* Rehydrate a guild's node_modules from tracked state.
|
|
26
|
-
*
|
|
27
|
-
* Idempotent and safe to run at any time.
|
|
28
|
-
*/
|
|
29
|
-
export function rehydrate(home) {
|
|
30
|
-
const result = {
|
|
31
|
-
workshopsCloned: [],
|
|
32
|
-
workshopsFailed: [],
|
|
33
|
-
fromPackageJson: 0,
|
|
34
|
-
fromSlotSource: [],
|
|
35
|
-
needsRelink: [],
|
|
36
|
-
};
|
|
37
|
-
// 1. Re-clone workshop bare repos from guild.json remote URLs
|
|
38
|
-
const config = readGuildConfig(home);
|
|
39
|
-
const wsDir = workshopsPath(home);
|
|
40
|
-
fs.mkdirSync(wsDir, { recursive: true });
|
|
41
|
-
for (const [name, entry] of Object.entries(config.workshops)) {
|
|
42
|
-
const barePath = workshopBarePath(home, name);
|
|
43
|
-
if (fs.existsSync(barePath))
|
|
44
|
-
continue; // already cloned
|
|
45
|
-
try {
|
|
46
|
-
execFileSync('git', ['clone', '--bare', entry.remoteUrl, barePath], {
|
|
47
|
-
stdio: 'pipe',
|
|
48
|
-
});
|
|
49
|
-
result.workshopsCloned.push(name);
|
|
50
|
-
}
|
|
51
|
-
catch (err) {
|
|
52
|
-
result.workshopsFailed.push({
|
|
53
|
-
name,
|
|
54
|
-
error: err.message,
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
// 2. Run npm install to resolve registry/git-url deps from package.json
|
|
59
|
-
const pkgPath = path.join(home, 'package.json');
|
|
60
|
-
if (fs.existsSync(pkgPath)) {
|
|
61
|
-
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
|
|
62
|
-
const depCount = Object.keys(pkg.dependencies ?? {}).length;
|
|
63
|
-
if (depCount > 0) {
|
|
64
|
-
execFileSync('npm', ['install'], { cwd: home, stdio: 'pipe' });
|
|
65
|
-
result.fromPackageJson = depCount;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
// 3. Scan guild.json for tools that have full source on disk
|
|
69
|
-
for (const [category, registry] of Object.entries({
|
|
70
|
-
tools: config.tools,
|
|
71
|
-
engines: config.engines,
|
|
72
|
-
})) {
|
|
73
|
-
for (const [name, entry] of Object.entries(registry)) {
|
|
74
|
-
const toolEntry = entry;
|
|
75
|
-
const upstream = toolEntry.upstream;
|
|
76
|
-
const parentDir = DIR_MAP[category];
|
|
77
|
-
const toolDir = path.join(home, parentDir, name);
|
|
78
|
-
// Check if this is a workshop/tarball tool with full source on disk
|
|
79
|
-
if (upstream === null || (upstream && upstream.startsWith('workshop:'))) {
|
|
80
|
-
// Check if tool dir has a package.json (indicating full source)
|
|
81
|
-
const toolPkgPath = path.join(toolDir, 'package.json');
|
|
82
|
-
if (fs.existsSync(toolPkgPath)) {
|
|
83
|
-
// Install from tool source
|
|
84
|
-
try {
|
|
85
|
-
execFileSync('npm', ['install', '--no-save', toolDir], {
|
|
86
|
-
cwd: home,
|
|
87
|
-
stdio: 'pipe',
|
|
88
|
-
});
|
|
89
|
-
result.fromSlotSource.push(name);
|
|
90
|
-
}
|
|
91
|
-
catch {
|
|
92
|
-
// If install fails, the tool may need manual intervention
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
// Check if this was a linked tool (no upstream, no full source,
|
|
97
|
-
// but has a package field in the descriptor)
|
|
98
|
-
if (upstream === null) {
|
|
99
|
-
const hasFullSource = fs.existsSync(path.join(toolDir, 'package.json'));
|
|
100
|
-
if (!hasFullSource) {
|
|
101
|
-
// This was likely a linked tool — needs manual re-linking
|
|
102
|
-
result.needsRelink.push(name);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
return result;
|
|
108
|
-
}
|
|
109
|
-
//# sourceMappingURL=rehydrate.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rehydrate.js","sourceRoot":"","sources":["../../../src/legacy/1/rehydrate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAElE,yEAAyE;AACzE,MAAM,OAAO,GAA2B;IACtC,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,oBAAoB;IAC/B,YAAY,EAAE,uBAAuB;CACtC,CAAC;AAeF;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,MAAM,MAAM,GAAoB;QAC9B,eAAe,EAAE,EAAE;QACnB,eAAe,EAAE,EAAE;QACnB,eAAe,EAAE,CAAC;QAClB,cAAc,EAAE,EAAE;QAClB,WAAW,EAAE,EAAE;KAChB,CAAC;IAEF,8DAA8D;IAC9D,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAClC,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEzC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7D,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC9C,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,SAAS,CAAC,iBAAiB;QAExD,IAAI,CAAC;YACH,YAAY,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE;gBAClE,KAAK,EAAE,MAAM;aACd,CAAC,CAAC;YACH,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC;gBAC1B,IAAI;gBACJ,KAAK,EAAG,GAAa,CAAC,OAAO;aAC9B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,wEAAwE;IACxE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAChD,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QAC5D,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YACjB,YAAY,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAC/D,MAAM,CAAC,eAAe,GAAG,QAAQ,CAAC;QACpC,CAAC;IACH,CAAC;IAED,6DAA6D;IAC7D,KAAK,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC;QAChD,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC,EAAE,CAAC;QACH,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrD,MAAM,SAAS,GAAG,KAAkB,CAAC;YACrC,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC;YACpC,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAE,CAAC;YACrC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;YAEjD,oEAAoE;YACpE,IAAI,QAAQ,KAAK,IAAI,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;gBACxE,gEAAgE;gBAChE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;gBACvD,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;oBAC/B,2BAA2B;oBAC3B,IAAI,CAAC;wBACH,YAAY,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE;4BACrD,GAAG,EAAE,IAAI;4BACT,KAAK,EAAE,MAAM;yBACd,CAAC,CAAC;wBACH,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACnC,CAAC;oBAAC,MAAM,CAAC;wBACP,0DAA0D;oBAC5D,CAAC;gBACH,CAAC;YACH,CAAC;YAED,gEAAgE;YAChE,6CAA6C;YAC7C,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACtB,MAAM,aAAa,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;gBACxE,IAAI,CAAC,aAAa,EAAE,CAAC;oBACnB,0DAA0D;oBAC1D,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAChC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
export interface RemoveToolOptions {
|
|
2
|
-
home: string;
|
|
3
|
-
name: string;
|
|
4
|
-
/** Restrict to a specific category. If omitted, searches all registries. */
|
|
5
|
-
category?: 'tools' | 'engines' | 'curricula' | 'temperaments';
|
|
6
|
-
}
|
|
7
|
-
export interface RemoveResult {
|
|
8
|
-
category: 'tools' | 'engines' | 'curricula' | 'temperaments';
|
|
9
|
-
name: string;
|
|
10
|
-
removedFrom: string;
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Remove a tool from the guild — deregister from guild.json and delete from disk.
|
|
14
|
-
*
|
|
15
|
-
* For npm-installed tools, also runs `npm uninstall` to clean up node_modules.
|
|
16
|
-
* For linked tools, removes the symlink from node_modules.
|
|
17
|
-
*/
|
|
18
|
-
export declare function removeTool(opts: RemoveToolOptions): RemoveResult;
|
|
19
|
-
//# sourceMappingURL=remove-tool.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"remove-tool.d.ts","sourceRoot":"","sources":["../../../src/legacy/1/remove-tool.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,WAAW,GAAG,cAAc,CAAC;CAC/D;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,WAAW,GAAG,cAAc,CAAC;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAcD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,iBAAiB,GAAG,YAAY,CAqFhE"}
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import { execFileSync } from 'node:child_process';
|
|
4
|
-
import { readGuildConfig, writeGuildConfig } from "./guild-config.js";
|
|
5
|
-
const DIR_MAP = {
|
|
6
|
-
tools: 'tools',
|
|
7
|
-
engines: 'engines',
|
|
8
|
-
curricula: 'training/curricula',
|
|
9
|
-
temperaments: 'training/temperaments',
|
|
10
|
-
};
|
|
11
|
-
/** The registries in guild.json that can contain tools, in search order. */
|
|
12
|
-
const REGISTRIES = ['tools', 'engines', 'curricula', 'temperaments'];
|
|
13
|
-
function git(args, cwd) {
|
|
14
|
-
execFileSync('git', args, { cwd, stdio: 'pipe' });
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Read the npm package name from a tool's guild.json entry.
|
|
18
|
-
* Returns null if the tool has no package field (e.g. script-only tools).
|
|
19
|
-
*/
|
|
20
|
-
function getPackageName(entry) {
|
|
21
|
-
return entry['package'] ?? null;
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Remove a tool from the guild — deregister from guild.json and delete from disk.
|
|
25
|
-
*
|
|
26
|
-
* For npm-installed tools, also runs `npm uninstall` to clean up node_modules.
|
|
27
|
-
* For linked tools, removes the symlink from node_modules.
|
|
28
|
-
*/
|
|
29
|
-
export function removeTool(opts) {
|
|
30
|
-
const { home, name } = opts;
|
|
31
|
-
const config = readGuildConfig(home);
|
|
32
|
-
// Find the tool in guild.json
|
|
33
|
-
const searchIn = opts.category ? [opts.category] : REGISTRIES;
|
|
34
|
-
let foundCategory;
|
|
35
|
-
for (const cat of searchIn) {
|
|
36
|
-
if (config[cat][name]) {
|
|
37
|
-
foundCategory = cat;
|
|
38
|
-
break;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
if (!foundCategory) {
|
|
42
|
-
throw new Error(`Tool "${name}" not found in guild.json.`);
|
|
43
|
-
}
|
|
44
|
-
const entry = config[foundCategory][name];
|
|
45
|
-
// Clean up npm-installed packages from node_modules
|
|
46
|
-
const packageName = getPackageName(entry);
|
|
47
|
-
const upstream = 'upstream' in entry ? entry.upstream : null;
|
|
48
|
-
if (packageName) {
|
|
49
|
-
const linkPath = path.join(home, 'node_modules', packageName);
|
|
50
|
-
if (fs.existsSync(linkPath) && fs.lstatSync(linkPath).isSymbolicLink()) {
|
|
51
|
-
// Linked tool: just remove the symlink
|
|
52
|
-
fs.unlinkSync(linkPath);
|
|
53
|
-
// Clean up empty scoped directory if needed
|
|
54
|
-
const scopeDir = path.dirname(linkPath);
|
|
55
|
-
if (scopeDir !== path.join(home, 'node_modules') &&
|
|
56
|
-
fs.existsSync(scopeDir) && fs.readdirSync(scopeDir).length === 0) {
|
|
57
|
-
fs.rmdirSync(scopeDir);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
else if (upstream && !upstream.startsWith('workshop:')) {
|
|
61
|
-
// Registry/git-url tool saved to package.json: use npm uninstall
|
|
62
|
-
try {
|
|
63
|
-
execFileSync('npm', ['uninstall', packageName], { cwd: home, stdio: 'pipe' });
|
|
64
|
-
}
|
|
65
|
-
catch {
|
|
66
|
-
// If npm uninstall fails (e.g. package already gone), continue with cleanup
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
else {
|
|
70
|
-
// Workshop/tarball tool (not in package.json): remove from node_modules manually
|
|
71
|
-
if (fs.existsSync(linkPath)) {
|
|
72
|
-
fs.rmSync(linkPath, { recursive: true });
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
// Remove on-disk directory
|
|
77
|
-
const parentDir = DIR_MAP[foundCategory];
|
|
78
|
-
const toolDir = path.join(home, parentDir, name);
|
|
79
|
-
if (fs.existsSync(toolDir)) {
|
|
80
|
-
fs.rmSync(toolDir, { recursive: true });
|
|
81
|
-
}
|
|
82
|
-
// Deregister from guild.json
|
|
83
|
-
delete config[foundCategory][name];
|
|
84
|
-
// Clean up role references for tools
|
|
85
|
-
if (foundCategory === 'tools') {
|
|
86
|
-
// Remove from baseTools
|
|
87
|
-
const baseIdx = config.baseTools.indexOf(name);
|
|
88
|
-
if (baseIdx !== -1) {
|
|
89
|
-
config.baseTools.splice(baseIdx, 1);
|
|
90
|
-
}
|
|
91
|
-
// Remove from all role tool lists
|
|
92
|
-
for (const role of Object.values(config.roles)) {
|
|
93
|
-
const roleIdx = role.tools.indexOf(name);
|
|
94
|
-
if (roleIdx !== -1) {
|
|
95
|
-
role.tools.splice(roleIdx, 1);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
writeGuildConfig(home, config);
|
|
100
|
-
// Commit
|
|
101
|
-
git(['add', '-A'], home);
|
|
102
|
-
git(['commit', '-m', `Remove ${foundCategory.slice(0, -1)} ${name}`], home);
|
|
103
|
-
return { category: foundCategory, name, removedFrom: toolDir };
|
|
104
|
-
}
|
|
105
|
-
//# sourceMappingURL=remove-tool.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"remove-tool.js","sourceRoot":"","sources":["../../../src/legacy/1/remove-tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,343 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Session infrastructure — the unified session funnel.
|
|
3
|
-
*
|
|
4
|
-
* ALL sessions (interactive, summoned, briefed) flow through
|
|
5
|
-
* `launchSession()`. This provides unified logging, events, metrics,
|
|
6
|
-
* workspace lifecycle, and session record persistence.
|
|
7
|
-
*
|
|
8
|
-
* Session providers (e.g. claude-code, claude-api) implement the
|
|
9
|
-
* `SessionProvider` interface and are registered at startup.
|
|
10
|
-
*/
|
|
11
|
-
import type { ManifestResult } from './manifest.ts';
|
|
12
|
-
/** Summary view of a session — for list views. */
|
|
13
|
-
export interface SessionSummary {
|
|
14
|
-
id: string;
|
|
15
|
-
animaId: string;
|
|
16
|
-
provider: string;
|
|
17
|
-
trigger: string;
|
|
18
|
-
workshop: string | null;
|
|
19
|
-
workspaceKind: string;
|
|
20
|
-
startedAt: string;
|
|
21
|
-
endedAt: string | null;
|
|
22
|
-
exitCode: number | null;
|
|
23
|
-
costUsd: number | null;
|
|
24
|
-
durationMs: number | null;
|
|
25
|
-
}
|
|
26
|
-
/** Full session detail — all columns from the sessions table. */
|
|
27
|
-
export interface SessionDetail {
|
|
28
|
-
id: string;
|
|
29
|
-
animaId: string;
|
|
30
|
-
provider: string;
|
|
31
|
-
trigger: string;
|
|
32
|
-
workshop: string | null;
|
|
33
|
-
workspaceKind: string;
|
|
34
|
-
curriculumName: string | null;
|
|
35
|
-
curriculumVersion: string | null;
|
|
36
|
-
temperamentName: string | null;
|
|
37
|
-
temperamentVersion: string | null;
|
|
38
|
-
roles: string[];
|
|
39
|
-
startedAt: string;
|
|
40
|
-
endedAt: string | null;
|
|
41
|
-
exitCode: number | null;
|
|
42
|
-
inputTokens: number | null;
|
|
43
|
-
outputTokens: number | null;
|
|
44
|
-
cacheReadTokens: number | null;
|
|
45
|
-
cacheWriteTokens: number | null;
|
|
46
|
-
costUsd: number | null;
|
|
47
|
-
durationMs: number | null;
|
|
48
|
-
providerSessionId: string | null;
|
|
49
|
-
recordPath: string | null;
|
|
50
|
-
}
|
|
51
|
-
export interface ListSessionsOptions {
|
|
52
|
-
anima?: string;
|
|
53
|
-
workshop?: string;
|
|
54
|
-
trigger?: string;
|
|
55
|
-
/** Filter by active (no ended_at) or completed (has ended_at). */
|
|
56
|
-
status?: 'active' | 'completed';
|
|
57
|
-
/** Filter by bound writ ID. */
|
|
58
|
-
writId?: string;
|
|
59
|
-
/** Maximum number of results. */
|
|
60
|
-
limit?: number;
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* List sessions with optional filters.
|
|
64
|
-
*/
|
|
65
|
-
export declare function listSessions(home: string, opts?: ListSessionsOptions): SessionSummary[];
|
|
66
|
-
/**
|
|
67
|
-
* Count sessions bound to a given writ. Used by circuit breakers to cap
|
|
68
|
-
* retry attempts without fetching full session rows.
|
|
69
|
-
*/
|
|
70
|
-
export declare function countSessionsForWrit(home: string, writId: string): number;
|
|
71
|
-
/**
|
|
72
|
-
* Show full details for a single session.
|
|
73
|
-
*/
|
|
74
|
-
export declare function showSession(home: string, sessionId: string): SessionDetail | null;
|
|
75
|
-
/** A chunk emitted during streaming session output. */
|
|
76
|
-
export type SessionChunk = {
|
|
77
|
-
type: 'text';
|
|
78
|
-
text: string;
|
|
79
|
-
} | {
|
|
80
|
-
type: 'tool_use';
|
|
81
|
-
tool: string;
|
|
82
|
-
} | {
|
|
83
|
-
type: 'tool_result';
|
|
84
|
-
tool: string;
|
|
85
|
-
};
|
|
86
|
-
/** What a session provider must implement. */
|
|
87
|
-
export interface SessionProvider {
|
|
88
|
-
/** Provider identifier (e.g. "claude-code", "claude-api", "bedrock"). */
|
|
89
|
-
name: string;
|
|
90
|
-
/** Launch a session and return when it completes. */
|
|
91
|
-
launch(options: SessionProviderLaunchOptions): Promise<SessionProviderResult>;
|
|
92
|
-
/**
|
|
93
|
-
* Launch a session with streaming output.
|
|
94
|
-
*
|
|
95
|
-
* Returns an async iterable of chunks for real-time output AND a promise
|
|
96
|
-
* for the final result. Used by conversation turns to stream responses
|
|
97
|
-
* to the dashboard while still capturing the full result for the funnel.
|
|
98
|
-
*
|
|
99
|
-
* Optional — providers that don't support streaming just omit this.
|
|
100
|
-
* The conversation system falls back to launch() (no streaming, just
|
|
101
|
-
* the final result).
|
|
102
|
-
*/
|
|
103
|
-
launchStreaming?(options: SessionProviderLaunchOptions): {
|
|
104
|
-
chunks: AsyncIterable<SessionChunk>;
|
|
105
|
-
result: Promise<SessionProviderResult>;
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
/** Options passed to the provider's launch() — provider-specific subset. */
|
|
109
|
-
export interface SessionProviderLaunchOptions {
|
|
110
|
-
/** Guild root path. */
|
|
111
|
-
home: string;
|
|
112
|
-
/** The manifest result — system prompt + resolved tools. */
|
|
113
|
-
manifest: ManifestResult;
|
|
114
|
-
/** The user-facing prompt (writ spec, consultation topic, brief). */
|
|
115
|
-
prompt: string | null;
|
|
116
|
-
/** Whether the session is interactive (human at keyboard) or autonomous. */
|
|
117
|
-
interactive: boolean;
|
|
118
|
-
/** Resolved working directory for the session. */
|
|
119
|
-
cwd: string;
|
|
120
|
-
/** Display name for tracking. */
|
|
121
|
-
name?: string;
|
|
122
|
-
/** Budget cap, if any. */
|
|
123
|
-
maxBudgetUsd?: number;
|
|
124
|
-
/**
|
|
125
|
-
* Claude session ID to resume. When provided, the provider uses --resume
|
|
126
|
-
* to continue an existing conversation instead of starting fresh.
|
|
127
|
-
*/
|
|
128
|
-
claudeSessionId?: string;
|
|
129
|
-
}
|
|
130
|
-
/** What comes back from the provider (before the funnel adds its own fields). */
|
|
131
|
-
export interface SessionProviderResult {
|
|
132
|
-
exitCode: number;
|
|
133
|
-
/** Provider-reported token usage, if available. */
|
|
134
|
-
tokenUsage?: {
|
|
135
|
-
inputTokens: number;
|
|
136
|
-
outputTokens: number;
|
|
137
|
-
cacheReadTokens?: number;
|
|
138
|
-
cacheWriteTokens?: number;
|
|
139
|
-
};
|
|
140
|
-
/** Provider-reported cost in USD, if available. */
|
|
141
|
-
costUsd?: number;
|
|
142
|
-
/** Wall-clock duration in milliseconds. */
|
|
143
|
-
durationMs: number;
|
|
144
|
-
/** Session ID from the provider, if available (e.g. claude session ID). */
|
|
145
|
-
providerSessionId?: string;
|
|
146
|
-
/**
|
|
147
|
-
* Full conversation transcript — raw provider output, minimally typed.
|
|
148
|
-
* Stored as-is in the session record; typed normalization deferred.
|
|
149
|
-
*/
|
|
150
|
-
transcript?: Record<string, unknown>[];
|
|
151
|
-
}
|
|
152
|
-
/** Everything needed to launch a session through the funnel. */
|
|
153
|
-
export interface SessionLaunchOptions {
|
|
154
|
-
/** Guild root path. */
|
|
155
|
-
home: string;
|
|
156
|
-
/** The manifest result — system prompt + resolved tools. */
|
|
157
|
-
manifest: ManifestResult;
|
|
158
|
-
/** The user-facing prompt (writ spec, consultation topic, brief). */
|
|
159
|
-
prompt: string | null;
|
|
160
|
-
/** Whether the session is interactive (human at keyboard) or autonomous. */
|
|
161
|
-
interactive: boolean;
|
|
162
|
-
/** Workspace context. */
|
|
163
|
-
workspace: ResolvedWorkspace;
|
|
164
|
-
/** What triggered this session. */
|
|
165
|
-
trigger: 'consult' | 'summon' | 'brief' | 'convene';
|
|
166
|
-
/** Display name for tracking. */
|
|
167
|
-
name?: string;
|
|
168
|
-
/** Budget cap, if any. */
|
|
169
|
-
maxBudgetUsd?: number;
|
|
170
|
-
/** Bound writ ID, if any. Set by clockworks for writ-driven sessions. */
|
|
171
|
-
writId?: string;
|
|
172
|
-
/**
|
|
173
|
-
* Pre-generated session ID. If provided, launchSession uses this instead of
|
|
174
|
-
* generating one internally. This allows callers to bind resources (e.g. writs)
|
|
175
|
-
* to the session ID before the provider launches.
|
|
176
|
-
*/
|
|
177
|
-
sessionId?: string;
|
|
178
|
-
/** Conversation ID, if this session is a turn in a conversation. */
|
|
179
|
-
conversationId?: string;
|
|
180
|
-
/** Turn number within the conversation (1-indexed). */
|
|
181
|
-
turnNumber?: number;
|
|
182
|
-
/**
|
|
183
|
-
* Claude session ID to resume. Passed through to the provider for
|
|
184
|
-
* --resume support in multi-turn conversations.
|
|
185
|
-
*/
|
|
186
|
-
claudeSessionId?: string;
|
|
187
|
-
/**
|
|
188
|
-
* Callback for streaming chunks during the session. When provided and
|
|
189
|
-
* the provider supports launchStreaming(), chunks are forwarded here
|
|
190
|
-
* as they arrive.
|
|
191
|
-
*/
|
|
192
|
-
onChunk?: (chunk: SessionChunk) => void;
|
|
193
|
-
/**
|
|
194
|
-
* Additional content appended to the system prompt after manifest assembly.
|
|
195
|
-
* Used by clockworks to inject session protocol (e.g. writ completion requirements).
|
|
196
|
-
* Keeps dispatch concerns separate from manifest (identity).
|
|
197
|
-
*/
|
|
198
|
-
systemPromptAppendix?: string;
|
|
199
|
-
}
|
|
200
|
-
/** What the funnel returns to callers. */
|
|
201
|
-
export interface SessionResult {
|
|
202
|
-
/** Ledger row ID — written by the funnel before provider launch. */
|
|
203
|
-
sessionId: string;
|
|
204
|
-
exitCode: number;
|
|
205
|
-
/** Provider-reported token usage, if available. */
|
|
206
|
-
tokenUsage?: {
|
|
207
|
-
inputTokens: number;
|
|
208
|
-
outputTokens: number;
|
|
209
|
-
cacheReadTokens?: number;
|
|
210
|
-
cacheWriteTokens?: number;
|
|
211
|
-
};
|
|
212
|
-
/** Provider-reported cost in USD, if available. */
|
|
213
|
-
costUsd?: number;
|
|
214
|
-
/** Wall-clock duration in milliseconds. */
|
|
215
|
-
durationMs: number;
|
|
216
|
-
/** Session ID from the provider, if available. */
|
|
217
|
-
providerSessionId?: string;
|
|
218
|
-
/** Raw transcript from the provider. */
|
|
219
|
-
transcript?: Record<string, unknown>[];
|
|
220
|
-
/** Bound writ ID, if any. */
|
|
221
|
-
writId?: string;
|
|
222
|
-
/** Conversation ID, if this session is a turn in a conversation. */
|
|
223
|
-
conversationId?: string;
|
|
224
|
-
/** Turn number within the conversation. */
|
|
225
|
-
turnNumber?: number;
|
|
226
|
-
}
|
|
227
|
-
/**
|
|
228
|
-
* Standard optional fields on event payloads. Any event can carry these.
|
|
229
|
-
* The session launcher inspects the triggering event's payload and uses
|
|
230
|
-
* them to determine the working directory for the session.
|
|
231
|
-
*/
|
|
232
|
-
export interface WorkspaceContext {
|
|
233
|
-
/** Workshop name — session gets a fresh temporary worktree of main. */
|
|
234
|
-
workshop?: string;
|
|
235
|
-
/** Explicit worktree path — used as-is (caller owns the lifecycle). */
|
|
236
|
-
worktreePath?: string;
|
|
237
|
-
}
|
|
238
|
-
/** The resolved working directory for a session. */
|
|
239
|
-
export type ResolvedWorkspace = {
|
|
240
|
-
kind: 'guildhall';
|
|
241
|
-
} | {
|
|
242
|
-
kind: 'workshop-temp';
|
|
243
|
-
workshop: string;
|
|
244
|
-
worktreePath: string;
|
|
245
|
-
} | {
|
|
246
|
-
kind: 'workshop-managed';
|
|
247
|
-
workshop: string;
|
|
248
|
-
worktreePath: string;
|
|
249
|
-
};
|
|
250
|
-
/** Full session record written to disk as JSON. */
|
|
251
|
-
export interface SessionRecord {
|
|
252
|
-
/** Ledger session row ID (for cross-reference). */
|
|
253
|
-
sessionId: string;
|
|
254
|
-
/** The anima that ran this session, with full composition provenance. */
|
|
255
|
-
anima: {
|
|
256
|
-
id: string;
|
|
257
|
-
name: string;
|
|
258
|
-
roles: string[];
|
|
259
|
-
codex: string;
|
|
260
|
-
roleInstructions: string;
|
|
261
|
-
curriculum: {
|
|
262
|
-
name: string;
|
|
263
|
-
version: string;
|
|
264
|
-
content: string;
|
|
265
|
-
} | null;
|
|
266
|
-
temperament: {
|
|
267
|
-
name: string;
|
|
268
|
-
version: string;
|
|
269
|
-
content: string;
|
|
270
|
-
} | null;
|
|
271
|
-
toolInstructions: Array<{
|
|
272
|
-
toolName: string;
|
|
273
|
-
instructions: string;
|
|
274
|
-
}>;
|
|
275
|
-
};
|
|
276
|
-
/** The final assembled system prompt. */
|
|
277
|
-
systemPrompt: string;
|
|
278
|
-
/** Tools available to the anima. */
|
|
279
|
-
tools: Array<{
|
|
280
|
-
name: string;
|
|
281
|
-
}>;
|
|
282
|
-
/** Tools that were resolved but failed preconditions. */
|
|
283
|
-
unavailableTools: Array<{
|
|
284
|
-
name: string;
|
|
285
|
-
reasons: string[];
|
|
286
|
-
}>;
|
|
287
|
-
/** The user-facing prompt. */
|
|
288
|
-
userPrompt: string | null;
|
|
289
|
-
/** Raw conversation transcript from the provider. */
|
|
290
|
-
transcript: Record<string, unknown>[];
|
|
291
|
-
}
|
|
292
|
-
/**
|
|
293
|
-
* Register a session provider. Called once at startup.
|
|
294
|
-
*/
|
|
295
|
-
export declare function registerSessionProvider(provider: SessionProvider): void;
|
|
296
|
-
/** Get the registered session provider. */
|
|
297
|
-
export declare function getSessionProvider(): SessionProvider | null;
|
|
298
|
-
/**
|
|
299
|
-
* Resolve workspace context from an event payload's standard fields.
|
|
300
|
-
*/
|
|
301
|
-
export declare function resolveWorkspace(payload: Record<string, unknown> | null): ResolvedWorkspace;
|
|
302
|
-
/**
|
|
303
|
-
* Create a temporary worktree from a workshop's bare repo, checked out to main.
|
|
304
|
-
*
|
|
305
|
-
* Uses a crypto-safe random hash for the directory name. The worktree is
|
|
306
|
-
* a fresh snapshot — no branch management, no merge-back lifecycle.
|
|
307
|
-
*
|
|
308
|
-
* @returns Absolute path to the worktree directory.
|
|
309
|
-
*/
|
|
310
|
-
export declare function createTempWorktree(home: string, workshop: string): string;
|
|
311
|
-
/**
|
|
312
|
-
* Remove a temporary worktree.
|
|
313
|
-
*
|
|
314
|
-
* Logs but does not throw on failure — stale worktrees are assumed to be
|
|
315
|
-
* reaped by a separate mechanism.
|
|
316
|
-
*/
|
|
317
|
-
export declare function removeTempWorktree(home: string, workshop: string, worktreePath: string): void;
|
|
318
|
-
/**
|
|
319
|
-
* Launch a session through the registered provider.
|
|
320
|
-
*
|
|
321
|
-
* This is THE code path for all sessions. It:
|
|
322
|
-
* 1. If workspace is workshop-temp: create fresh worktree from main
|
|
323
|
-
* 2. Records session.started in the Daybook → gets sessionId
|
|
324
|
-
* 3. Signals session.started event
|
|
325
|
-
* 4. Delegates to the provider (passing resolved cwd)
|
|
326
|
-
* 5. Records session.ended in the Daybook (with metrics)
|
|
327
|
-
* 6. Writes the SessionRecord JSON to .nexus/sessions/{uuid}.json
|
|
328
|
-
* 7. Signals session.ended event (with full metrics + sessionId in payload)
|
|
329
|
-
* 8. If workspace is workshop-temp AND session is autonomous: tear down the worktree
|
|
330
|
-
* (interactive sessions leave the worktree for manual cleanup)
|
|
331
|
-
* 9. Returns the result (including sessionId)
|
|
332
|
-
*
|
|
333
|
-
* Error handling guarantee: Steps 5–8 MUST execute even if the provider
|
|
334
|
-
* throws. The funnel wraps step 4 in try/finally. If the provider crashes,
|
|
335
|
-
* the session row still gets ended_at, exit_code, and the session.ended
|
|
336
|
-
* event still fires (with error details in the payload). If the funnel
|
|
337
|
-
* itself fails during recording (e.g. Ledger locked), it signals
|
|
338
|
-
* session.record-failed as a core event and continues with remaining
|
|
339
|
-
* cleanup steps. Worktree teardown failures are logged but do not throw —
|
|
340
|
-
* stale worktrees are assumed to be reaped by a separate mechanism.
|
|
341
|
-
*/
|
|
342
|
-
export declare function launchSession(options: SessionLaunchOptions): Promise<SessionResult>;
|
|
343
|
-
//# sourceMappingURL=session.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/legacy/1/session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAUH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAIpD,kDAAkD;AAClD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,iEAAiE;AACjE,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kEAAkE;IAClE,MAAM,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAC;IAChC,+BAA+B;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAID;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,mBAAwB,GAAG,cAAc,EAAE,CAyE3F;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAWzE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAsDjF;AAID,uDAAuD;AACvD,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1C,8CAA8C;AAC9C,MAAM,WAAW,eAAe;IAC9B,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,MAAM,CAAC,OAAO,EAAE,4BAA4B,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC9E;;;;;;;;;;OAUG;IACH,eAAe,CAAC,CAAC,OAAO,EAAE,4BAA4B,GAAG;QACvD,MAAM,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;QACpC,MAAM,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;KACxC,CAAC;CACH;AAED,4EAA4E;AAC5E,MAAM,WAAW,4BAA4B;IAC3C,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,QAAQ,EAAE,cAAc,CAAC;IACzB,qEAAqE;IACrE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,4EAA4E;IAC5E,WAAW,EAAE,OAAO,CAAC;IACrB,kDAAkD;IAClD,GAAG,EAAE,MAAM,CAAC;IACZ,iCAAiC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0BAA0B;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,iFAAiF;AACjF,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,UAAU,CAAC,EAAE;QACX,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;CACxC;AAED,gEAAgE;AAChE,MAAM,WAAW,oBAAoB;IACnC,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,QAAQ,EAAE,cAAc,CAAC;IACzB,qEAAqE;IACrE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,4EAA4E;IAC5E,WAAW,EAAE,OAAO,CAAC;IACrB,yBAAyB;IACzB,SAAS,EAAE,iBAAiB,CAAC;IAC7B,mCAAmC;IACnC,OAAO,EAAE,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;IACpD,iCAAiC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0BAA0B;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oEAAoE;IACpE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,uDAAuD;IACvD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACxC;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,0CAA0C;AAC1C,MAAM,WAAW,aAAa;IAC5B,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,UAAU,CAAC,EAAE;QACX,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,wCAAwC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACvC,6BAA6B;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,oDAAoD;AACpD,MAAM,MAAM,iBAAiB,GACzB;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GACjE;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzE,mDAAmD;AACnD,MAAM,WAAW,aAAa;IAC5B,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,KAAK,EAAE;QACL,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,gBAAgB,EAAE,MAAM,CAAC;QACzB,UAAU,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAC;QACtE,WAAW,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAC;QACvE,gBAAgB,EAAE,KAAK,CAAC;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,YAAY,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACrE,CAAC;IACF,yCAAyC;IACzC,YAAY,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/B,yDAAyD;IACzD,gBAAgB,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IAC7D,8BAA8B;IAC9B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,qDAAqD;IACrD,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;CACvC;AAMD;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAEvE;AAED,2CAA2C;AAC3C,wBAAgB,kBAAkB,IAAI,eAAe,GAAG,IAAI,CAE3D;AAID;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GACtC,iBAAiB,CAiBnB;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAoBzE;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAa7F;AAmKD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,aAAa,CAAC,CA4LzF"}
|