@bolt-foundry/gambit 0.6.6 → 0.6.7
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 +2 -2
- package/esm/src/cli_utils.d.ts +14 -0
- package/esm/src/cli_utils.d.ts.map +1 -0
- package/esm/src/cli_utils.js +126 -0
- package/esm/src/server.d.ts.map +1 -1
- package/esm/src/server.js +2 -1
- package/package.json +2 -2
- package/script/src/cli_utils.d.ts +14 -0
- package/script/src/cli_utils.d.ts.map +1 -0
- package/script/src/cli_utils.js +172 -0
- package/script/src/server.d.ts.map +1 -1
- package/script/src/server.js +2 -1
package/README.md
CHANGED
|
@@ -21,7 +21,7 @@ Downloads example files and sets environment variables.
|
|
|
21
21
|
Run an example in the terminal (`repl`):
|
|
22
22
|
|
|
23
23
|
```
|
|
24
|
-
deno run -A jsr:@bolt-foundry/gambit/cli repl examples/hello.deck.md
|
|
24
|
+
deno run -A jsr:@bolt-foundry/gambit/cli repl examples/init/hello.deck.md
|
|
25
25
|
```
|
|
26
26
|
|
|
27
27
|
This example just says "hello" and repeats your message back to you.
|
|
@@ -29,7 +29,7 @@ This example just says "hello" and repeats your message back to you.
|
|
|
29
29
|
Run an example in the browser (`serve`):
|
|
30
30
|
|
|
31
31
|
```
|
|
32
|
-
deno run -A jsr:@bolt-foundry/gambit/cli serve examples/hello.deck.md
|
|
32
|
+
deno run -A jsr:@bolt-foundry/gambit/cli serve examples/init/hello.deck.md
|
|
33
33
|
open http://localhost:8000/debug
|
|
34
34
|
```
|
|
35
35
|
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ModelMessage } from "@bolt-foundry/gambit-core";
|
|
2
|
+
import type { SavedState } from "@bolt-foundry/gambit-core";
|
|
3
|
+
export declare function parsePortValue(value: unknown, label?: string): number | undefined;
|
|
4
|
+
export declare function normalizeFlagList(value: string | Array<string> | undefined): Array<string>;
|
|
5
|
+
export declare function slugifyDeckPath(deckPath: string): string;
|
|
6
|
+
export declare function defaultSessionRoot(deckPath: string): string;
|
|
7
|
+
export declare function defaultTestBotStatePath(deckPath: string): string;
|
|
8
|
+
export declare function enrichStateMeta(state: SavedState, deckPath: string): SavedState;
|
|
9
|
+
export declare function parseInit(raw?: string): unknown;
|
|
10
|
+
export declare function parseMessage(raw?: string): unknown;
|
|
11
|
+
export declare function parseBotInput(raw?: string): unknown;
|
|
12
|
+
export declare function findLastAssistantMessage(messages: Array<ModelMessage>): string | undefined;
|
|
13
|
+
export declare function extractInitInput(state?: SavedState): unknown;
|
|
14
|
+
//# sourceMappingURL=cli_utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli_utils.d.ts","sourceRoot":"","sources":["../../src/src/cli_utils.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAE5D,wBAAgB,cAAc,CAC5B,KAAK,EAAE,OAAO,EACd,KAAK,SAAS,GACb,MAAM,GAAG,SAAS,CAOpB;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,SAAS,GACxC,KAAK,CAAC,MAAM,CAAC,CAGf;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQxD;AAuBD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAM3D;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQhE;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,MAAM,GACf,UAAU,CAOZ;AAED,wBAAgB,SAAS,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAO/C;AAED,wBAAgB,YAAY,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAOlD;AAED,wBAAgB,aAAa,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAOnD;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,KAAK,CAAC,YAAY,CAAC,GAC5B,MAAM,GAAG,SAAS,CAUpB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,OAAO,CAe5D"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import * as dntShim from "../_dnt.shims.js";
|
|
2
|
+
import * as path from "../deps/jsr.io/@std/path/1.1.4/mod.js";
|
|
3
|
+
import { GAMBIT_TOOL_INIT } from "@bolt-foundry/gambit-core";
|
|
4
|
+
export function parsePortValue(value, label = "port") {
|
|
5
|
+
if (value === undefined || value === null || value === "")
|
|
6
|
+
return undefined;
|
|
7
|
+
const n = Number(value);
|
|
8
|
+
if (!Number.isInteger(n) || n <= 0 || n > 65535) {
|
|
9
|
+
throw new Error(`Invalid ${label}: ${value}`);
|
|
10
|
+
}
|
|
11
|
+
return n;
|
|
12
|
+
}
|
|
13
|
+
export function normalizeFlagList(value) {
|
|
14
|
+
if (!value)
|
|
15
|
+
return [];
|
|
16
|
+
return Array.isArray(value) ? value.filter(Boolean) : [value];
|
|
17
|
+
}
|
|
18
|
+
export function slugifyDeckPath(deckPath) {
|
|
19
|
+
const baseName = path.basename(deckPath || "deck");
|
|
20
|
+
const withoutExt = baseName.replace(/\.[^.]+$/, "");
|
|
21
|
+
const slug = withoutExt.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
|
|
22
|
+
return slug || "session";
|
|
23
|
+
}
|
|
24
|
+
const PROJECT_ROOT_MARKERS = ["deno.json", "deno.jsonc", "package.json"];
|
|
25
|
+
function findProjectRoot(startDir) {
|
|
26
|
+
let current = startDir;
|
|
27
|
+
while (true) {
|
|
28
|
+
for (const marker of PROJECT_ROOT_MARKERS) {
|
|
29
|
+
try {
|
|
30
|
+
const candidate = path.join(current, marker);
|
|
31
|
+
const info = dntShim.Deno.statSync(candidate);
|
|
32
|
+
if (info.isFile)
|
|
33
|
+
return current;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// ignore
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const parent = path.dirname(current);
|
|
40
|
+
if (parent === current)
|
|
41
|
+
break;
|
|
42
|
+
current = parent;
|
|
43
|
+
}
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
export function defaultSessionRoot(deckPath) {
|
|
47
|
+
const resolvedDeckPath = path.resolve(deckPath);
|
|
48
|
+
const deckDir = path.dirname(resolvedDeckPath);
|
|
49
|
+
const projectRoot = findProjectRoot(deckDir);
|
|
50
|
+
const baseDir = projectRoot ?? deckDir;
|
|
51
|
+
return path.join(baseDir, ".gambit", "sessions");
|
|
52
|
+
}
|
|
53
|
+
export function defaultTestBotStatePath(deckPath) {
|
|
54
|
+
const slug = slugifyDeckPath(deckPath);
|
|
55
|
+
const stamp = new Date().toISOString().replace(/[:.]/g, "-");
|
|
56
|
+
return path.join(defaultSessionRoot(deckPath), `${slug}-${stamp}`, "state.json");
|
|
57
|
+
}
|
|
58
|
+
export function enrichStateMeta(state, deckPath) {
|
|
59
|
+
const meta = { ...(state.meta ?? {}) };
|
|
60
|
+
if (typeof meta.deck !== "string")
|
|
61
|
+
meta.deck = deckPath;
|
|
62
|
+
if (typeof meta.deckSlug !== "string") {
|
|
63
|
+
meta.deckSlug = slugifyDeckPath(deckPath);
|
|
64
|
+
}
|
|
65
|
+
return { ...state, meta };
|
|
66
|
+
}
|
|
67
|
+
export function parseInit(raw) {
|
|
68
|
+
if (raw === undefined)
|
|
69
|
+
return undefined;
|
|
70
|
+
try {
|
|
71
|
+
return JSON.parse(raw);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return raw;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
export function parseMessage(raw) {
|
|
78
|
+
if (raw === undefined)
|
|
79
|
+
return undefined;
|
|
80
|
+
try {
|
|
81
|
+
return JSON.parse(raw);
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return raw;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
export function parseBotInput(raw) {
|
|
88
|
+
if (raw === undefined)
|
|
89
|
+
return undefined;
|
|
90
|
+
try {
|
|
91
|
+
return JSON.parse(raw);
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return raw;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
export function findLastAssistantMessage(messages) {
|
|
98
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
99
|
+
const msg = messages[i];
|
|
100
|
+
if (msg?.role === "assistant") {
|
|
101
|
+
return typeof msg.content === "string"
|
|
102
|
+
? msg.content
|
|
103
|
+
: JSON.stringify(msg.content ?? "");
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return undefined;
|
|
107
|
+
}
|
|
108
|
+
export function extractInitInput(state) {
|
|
109
|
+
if (!state?.messages)
|
|
110
|
+
return undefined;
|
|
111
|
+
for (let i = state.messages.length - 1; i >= 0; i--) {
|
|
112
|
+
const msg = state.messages[i];
|
|
113
|
+
if (msg.role === "tool" && msg.name === GAMBIT_TOOL_INIT) {
|
|
114
|
+
const content = msg.content;
|
|
115
|
+
if (typeof content !== "string")
|
|
116
|
+
return undefined;
|
|
117
|
+
try {
|
|
118
|
+
return JSON.parse(content);
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return content;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return undefined;
|
|
126
|
+
}
|
package/esm/src/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/src/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/src/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAY5C,OAAO,KAAK,EAGV,aAAa,EAEd,MAAM,2BAA2B,CAAC;AA+ZnC;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,aAAa,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAwnExC"}
|
package/esm/src/server.js
CHANGED
|
@@ -3,6 +3,7 @@ import * as path from "../deps/jsr.io/@std/path/1.1.4/mod.js";
|
|
|
3
3
|
import { isGambitEndSignal, runDeck } from "@bolt-foundry/gambit-core";
|
|
4
4
|
import { sanitizeNumber } from "./test_bot.js";
|
|
5
5
|
import { makeConsoleTracer } from "./trace.js";
|
|
6
|
+
import { defaultSessionRoot } from "./cli_utils.js";
|
|
6
7
|
import { loadDeck } from "@bolt-foundry/gambit-core";
|
|
7
8
|
import { appendDurableStreamEvent, handleDurableStreamRequest, } from "./durable_streams.js";
|
|
8
9
|
const logger = console;
|
|
@@ -316,7 +317,7 @@ export function startWebSocketSimulator(opts) {
|
|
|
316
317
|
const sessionsRoot = (() => {
|
|
317
318
|
const base = opts.sessionDir
|
|
318
319
|
? path.resolve(opts.sessionDir)
|
|
319
|
-
:
|
|
320
|
+
: defaultSessionRoot(resolvedDeckPath);
|
|
320
321
|
try {
|
|
321
322
|
dntShim.Deno.mkdirSync(base, { recursive: true });
|
|
322
323
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bolt-foundry/gambit",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.7",
|
|
4
4
|
"description": "Agent harness framework for building, running, and verifying LLM workflows in Markdown and code.",
|
|
5
5
|
"homepage": "https://github.com/bolt-foundry/gambit",
|
|
6
6
|
"repository": {
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"gambit": "bin/gambit.cjs"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@bolt-foundry/gambit-core": "^0.6.
|
|
27
|
+
"@bolt-foundry/gambit-core": "^0.6.7",
|
|
28
28
|
"zod": "^3.23.8",
|
|
29
29
|
"@deno/shim-deno": "~0.18.0"
|
|
30
30
|
},
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ModelMessage } from "@bolt-foundry/gambit-core";
|
|
2
|
+
import type { SavedState } from "@bolt-foundry/gambit-core";
|
|
3
|
+
export declare function parsePortValue(value: unknown, label?: string): number | undefined;
|
|
4
|
+
export declare function normalizeFlagList(value: string | Array<string> | undefined): Array<string>;
|
|
5
|
+
export declare function slugifyDeckPath(deckPath: string): string;
|
|
6
|
+
export declare function defaultSessionRoot(deckPath: string): string;
|
|
7
|
+
export declare function defaultTestBotStatePath(deckPath: string): string;
|
|
8
|
+
export declare function enrichStateMeta(state: SavedState, deckPath: string): SavedState;
|
|
9
|
+
export declare function parseInit(raw?: string): unknown;
|
|
10
|
+
export declare function parseMessage(raw?: string): unknown;
|
|
11
|
+
export declare function parseBotInput(raw?: string): unknown;
|
|
12
|
+
export declare function findLastAssistantMessage(messages: Array<ModelMessage>): string | undefined;
|
|
13
|
+
export declare function extractInitInput(state?: SavedState): unknown;
|
|
14
|
+
//# sourceMappingURL=cli_utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli_utils.d.ts","sourceRoot":"","sources":["../../src/src/cli_utils.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAE5D,wBAAgB,cAAc,CAC5B,KAAK,EAAE,OAAO,EACd,KAAK,SAAS,GACb,MAAM,GAAG,SAAS,CAOpB;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,SAAS,GACxC,KAAK,CAAC,MAAM,CAAC,CAGf;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQxD;AAuBD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAM3D;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQhE;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,MAAM,GACf,UAAU,CAOZ;AAED,wBAAgB,SAAS,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAO/C;AAED,wBAAgB,YAAY,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAOlD;AAED,wBAAgB,aAAa,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAOnD;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,KAAK,CAAC,YAAY,CAAC,GAC5B,MAAM,GAAG,SAAS,CAUpB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,OAAO,CAe5D"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.parsePortValue = parsePortValue;
|
|
37
|
+
exports.normalizeFlagList = normalizeFlagList;
|
|
38
|
+
exports.slugifyDeckPath = slugifyDeckPath;
|
|
39
|
+
exports.defaultSessionRoot = defaultSessionRoot;
|
|
40
|
+
exports.defaultTestBotStatePath = defaultTestBotStatePath;
|
|
41
|
+
exports.enrichStateMeta = enrichStateMeta;
|
|
42
|
+
exports.parseInit = parseInit;
|
|
43
|
+
exports.parseMessage = parseMessage;
|
|
44
|
+
exports.parseBotInput = parseBotInput;
|
|
45
|
+
exports.findLastAssistantMessage = findLastAssistantMessage;
|
|
46
|
+
exports.extractInitInput = extractInitInput;
|
|
47
|
+
const dntShim = __importStar(require("../_dnt.shims.js"));
|
|
48
|
+
const path = __importStar(require("../deps/jsr.io/@std/path/1.1.4/mod.js"));
|
|
49
|
+
const gambit_core_1 = require("@bolt-foundry/gambit-core");
|
|
50
|
+
function parsePortValue(value, label = "port") {
|
|
51
|
+
if (value === undefined || value === null || value === "")
|
|
52
|
+
return undefined;
|
|
53
|
+
const n = Number(value);
|
|
54
|
+
if (!Number.isInteger(n) || n <= 0 || n > 65535) {
|
|
55
|
+
throw new Error(`Invalid ${label}: ${value}`);
|
|
56
|
+
}
|
|
57
|
+
return n;
|
|
58
|
+
}
|
|
59
|
+
function normalizeFlagList(value) {
|
|
60
|
+
if (!value)
|
|
61
|
+
return [];
|
|
62
|
+
return Array.isArray(value) ? value.filter(Boolean) : [value];
|
|
63
|
+
}
|
|
64
|
+
function slugifyDeckPath(deckPath) {
|
|
65
|
+
const baseName = path.basename(deckPath || "deck");
|
|
66
|
+
const withoutExt = baseName.replace(/\.[^.]+$/, "");
|
|
67
|
+
const slug = withoutExt.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
|
|
68
|
+
return slug || "session";
|
|
69
|
+
}
|
|
70
|
+
const PROJECT_ROOT_MARKERS = ["deno.json", "deno.jsonc", "package.json"];
|
|
71
|
+
function findProjectRoot(startDir) {
|
|
72
|
+
let current = startDir;
|
|
73
|
+
while (true) {
|
|
74
|
+
for (const marker of PROJECT_ROOT_MARKERS) {
|
|
75
|
+
try {
|
|
76
|
+
const candidate = path.join(current, marker);
|
|
77
|
+
const info = dntShim.Deno.statSync(candidate);
|
|
78
|
+
if (info.isFile)
|
|
79
|
+
return current;
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// ignore
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
const parent = path.dirname(current);
|
|
86
|
+
if (parent === current)
|
|
87
|
+
break;
|
|
88
|
+
current = parent;
|
|
89
|
+
}
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
function defaultSessionRoot(deckPath) {
|
|
93
|
+
const resolvedDeckPath = path.resolve(deckPath);
|
|
94
|
+
const deckDir = path.dirname(resolvedDeckPath);
|
|
95
|
+
const projectRoot = findProjectRoot(deckDir);
|
|
96
|
+
const baseDir = projectRoot ?? deckDir;
|
|
97
|
+
return path.join(baseDir, ".gambit", "sessions");
|
|
98
|
+
}
|
|
99
|
+
function defaultTestBotStatePath(deckPath) {
|
|
100
|
+
const slug = slugifyDeckPath(deckPath);
|
|
101
|
+
const stamp = new Date().toISOString().replace(/[:.]/g, "-");
|
|
102
|
+
return path.join(defaultSessionRoot(deckPath), `${slug}-${stamp}`, "state.json");
|
|
103
|
+
}
|
|
104
|
+
function enrichStateMeta(state, deckPath) {
|
|
105
|
+
const meta = { ...(state.meta ?? {}) };
|
|
106
|
+
if (typeof meta.deck !== "string")
|
|
107
|
+
meta.deck = deckPath;
|
|
108
|
+
if (typeof meta.deckSlug !== "string") {
|
|
109
|
+
meta.deckSlug = slugifyDeckPath(deckPath);
|
|
110
|
+
}
|
|
111
|
+
return { ...state, meta };
|
|
112
|
+
}
|
|
113
|
+
function parseInit(raw) {
|
|
114
|
+
if (raw === undefined)
|
|
115
|
+
return undefined;
|
|
116
|
+
try {
|
|
117
|
+
return JSON.parse(raw);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
return raw;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
function parseMessage(raw) {
|
|
124
|
+
if (raw === undefined)
|
|
125
|
+
return undefined;
|
|
126
|
+
try {
|
|
127
|
+
return JSON.parse(raw);
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return raw;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
function parseBotInput(raw) {
|
|
134
|
+
if (raw === undefined)
|
|
135
|
+
return undefined;
|
|
136
|
+
try {
|
|
137
|
+
return JSON.parse(raw);
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return raw;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
function findLastAssistantMessage(messages) {
|
|
144
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
145
|
+
const msg = messages[i];
|
|
146
|
+
if (msg?.role === "assistant") {
|
|
147
|
+
return typeof msg.content === "string"
|
|
148
|
+
? msg.content
|
|
149
|
+
: JSON.stringify(msg.content ?? "");
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return undefined;
|
|
153
|
+
}
|
|
154
|
+
function extractInitInput(state) {
|
|
155
|
+
if (!state?.messages)
|
|
156
|
+
return undefined;
|
|
157
|
+
for (let i = state.messages.length - 1; i >= 0; i--) {
|
|
158
|
+
const msg = state.messages[i];
|
|
159
|
+
if (msg.role === "tool" && msg.name === gambit_core_1.GAMBIT_TOOL_INIT) {
|
|
160
|
+
const content = msg.content;
|
|
161
|
+
if (typeof content !== "string")
|
|
162
|
+
return undefined;
|
|
163
|
+
try {
|
|
164
|
+
return JSON.parse(content);
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
return content;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return undefined;
|
|
172
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/src/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/src/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAY5C,OAAO,KAAK,EAGV,aAAa,EAEd,MAAM,2BAA2B,CAAC;AA+ZnC;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,aAAa,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAwnExC"}
|
package/script/src/server.js
CHANGED
|
@@ -39,6 +39,7 @@ const path = __importStar(require("../deps/jsr.io/@std/path/1.1.4/mod.js"));
|
|
|
39
39
|
const gambit_core_1 = require("@bolt-foundry/gambit-core");
|
|
40
40
|
const test_bot_js_1 = require("./test_bot.js");
|
|
41
41
|
const trace_js_1 = require("./trace.js");
|
|
42
|
+
const cli_utils_js_1 = require("./cli_utils.js");
|
|
42
43
|
const gambit_core_2 = require("@bolt-foundry/gambit-core");
|
|
43
44
|
const durable_streams_js_1 = require("./durable_streams.js");
|
|
44
45
|
const logger = console;
|
|
@@ -352,7 +353,7 @@ function startWebSocketSimulator(opts) {
|
|
|
352
353
|
const sessionsRoot = (() => {
|
|
353
354
|
const base = opts.sessionDir
|
|
354
355
|
? path.resolve(opts.sessionDir)
|
|
355
|
-
:
|
|
356
|
+
: (0, cli_utils_js_1.defaultSessionRoot)(resolvedDeckPath);
|
|
356
357
|
try {
|
|
357
358
|
dntShim.Deno.mkdirSync(base, { recursive: true });
|
|
358
359
|
}
|