@tryglen/cli 0.36.0 → 0.36.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 +39 -27
- package/dist/_utils/agent-adapter.d.ts +0 -15
- package/dist/_utils/agent-adapter.js +0 -20
- package/dist/_utils/agent-adapter.js.map +1 -1
- package/dist/_utils/agents-table.js +1 -9
- package/dist/_utils/agents-table.js.map +1 -1
- package/dist/_utils/cli-error.js +0 -3
- package/dist/_utils/cli-error.js.map +1 -1
- package/dist/_utils/codex-app-server.js +0 -2
- package/dist/_utils/codex-app-server.js.map +1 -1
- package/dist/_utils/codex-hooks-merge.js +0 -11
- package/dist/_utils/codex-hooks-merge.js.map +1 -1
- package/dist/_utils/codex-hooks-setup.js +0 -18
- package/dist/_utils/codex-hooks-setup.js.map +1 -1
- package/dist/_utils/codex-paths.js +0 -3
- package/dist/_utils/codex-paths.js.map +1 -1
- package/dist/_utils/codex-repair-trace.js +0 -3
- package/dist/_utils/codex-repair-trace.js.map +1 -1
- package/dist/_utils/codex-trust-toml.js +1 -9
- package/dist/_utils/codex-trust-toml.js.map +1 -1
- package/dist/_utils/collect-import-files.js +0 -7
- package/dist/_utils/collect-import-files.js.map +1 -1
- package/dist/_utils/config.js +0 -4
- package/dist/_utils/config.js.map +1 -1
- package/dist/_utils/confirm.js +2 -10
- package/dist/_utils/confirm.js.map +1 -1
- package/dist/_utils/credentials.js +0 -3
- package/dist/_utils/credentials.js.map +1 -1
- package/dist/_utils/detect-transcript-format.js +0 -7
- package/dist/_utils/detect-transcript-format.js.map +1 -1
- package/dist/_utils/ensure-global-cli.d.ts +0 -12
- package/dist/_utils/ensure-global-cli.js +1 -28
- package/dist/_utils/ensure-global-cli.js.map +1 -1
- package/dist/_utils/ephemeral-session.js +3 -24
- package/dist/_utils/ephemeral-session.js.map +1 -1
- package/dist/_utils/extract-claude-segments.js +1 -5
- package/dist/_utils/extract-claude-segments.js.map +1 -1
- package/dist/_utils/extract-codex-segments.js +0 -9
- package/dist/_utils/extract-codex-segments.js.map +1 -1
- package/dist/_utils/extract-pi-segments.js +1 -5
- package/dist/_utils/extract-pi-segments.js.map +1 -1
- package/dist/_utils/find-bin.js +0 -8
- package/dist/_utils/find-bin.js.map +1 -1
- package/dist/_utils/format-search-result.js +3 -19
- package/dist/_utils/format-search-result.js.map +1 -1
- package/dist/_utils/format-turn-nudges.js +2 -20
- package/dist/_utils/format-turn-nudges.js.map +1 -1
- package/dist/_utils/git-context.d.ts +0 -2
- package/dist/_utils/git-context.js +1 -33
- package/dist/_utils/git-context.js.map +1 -1
- package/dist/_utils/git-hook-setup.js +0 -1
- package/dist/_utils/git-hook-setup.js.map +1 -1
- package/dist/_utils/glen-headers.js +1 -4
- package/dist/_utils/glen-headers.js.map +1 -1
- package/dist/_utils/http.js +1 -8
- package/dist/_utils/http.js.map +1 -1
- package/dist/_utils/idempotency-key.js +1 -4
- package/dist/_utils/idempotency-key.js.map +1 -1
- package/dist/_utils/indicator-app.js +4 -26
- package/dist/_utils/indicator-app.js.map +1 -1
- package/dist/_utils/indicator-health.js +0 -6
- package/dist/_utils/indicator-health.js.map +1 -1
- package/dist/_utils/ingest-diagnosis.js +0 -5
- package/dist/_utils/ingest-diagnosis.js.map +1 -1
- package/dist/_utils/ingest-heartbeat.js +1 -6
- package/dist/_utils/ingest-heartbeat.js.map +1 -1
- package/dist/_utils/install-receipt.js +0 -3
- package/dist/_utils/install-receipt.js.map +1 -1
- package/dist/_utils/jcode-bundle.js +0 -7
- package/dist/_utils/jcode-bundle.js.map +1 -1
- package/dist/_utils/jcode-event.js +2 -18
- package/dist/_utils/jcode-event.js.map +1 -1
- package/dist/_utils/jcode-hook-lines.js +1 -5
- package/dist/_utils/jcode-hook-lines.js.map +1 -1
- package/dist/_utils/jcode-hooks-toml.js +1 -9
- package/dist/_utils/jcode-hooks-toml.js.map +1 -1
- package/dist/_utils/jcode-paths.js +0 -3
- package/dist/_utils/jcode-paths.js.map +1 -1
- package/dist/_utils/jcode-setup.js +0 -7
- package/dist/_utils/jcode-setup.js.map +1 -1
- package/dist/_utils/jcode-skills-sync.js +1 -6
- package/dist/_utils/jcode-skills-sync.js.map +1 -1
- package/dist/_utils/login-check.js +1 -4
- package/dist/_utils/login-check.js.map +1 -1
- package/dist/_utils/managed-block.js +0 -4
- package/dist/_utils/managed-block.js.map +1 -1
- package/dist/_utils/normalize-boolean-flags.js +2 -7
- package/dist/_utils/normalize-boolean-flags.js.map +1 -1
- package/dist/_utils/open-browser.js +1 -3
- package/dist/_utils/open-browser.js.map +1 -1
- package/dist/_utils/parse-claude-transcript.js +4 -24
- package/dist/_utils/parse-claude-transcript.js.map +1 -1
- package/dist/_utils/parse-codex-transcript.js +1 -22
- package/dist/_utils/parse-codex-transcript.js.map +1 -1
- package/dist/_utils/parse-cursor-db.js +2 -21
- package/dist/_utils/parse-cursor-db.js.map +1 -1
- package/dist/_utils/parse-jcode-session.js +0 -15
- package/dist/_utils/parse-jcode-session.js.map +1 -1
- package/dist/_utils/parse-pi-transcript.js +1 -35
- package/dist/_utils/parse-pi-transcript.js.map +1 -1
- package/dist/_utils/parse-transcript.js +1 -9
- package/dist/_utils/parse-transcript.js.map +1 -1
- package/dist/_utils/plugin-status.js +0 -19
- package/dist/_utils/plugin-status.js.map +1 -1
- package/dist/_utils/post-route.js +0 -7
- package/dist/_utils/post-route.js.map +1 -1
- package/dist/_utils/pr-review-link.js +0 -2
- package/dist/_utils/pr-review-link.js.map +1 -1
- package/dist/_utils/proactive-ticket-log.js +1 -11
- package/dist/_utils/proactive-ticket-log.js.map +1 -1
- package/dist/_utils/record-commit-anchor.js +1 -8
- package/dist/_utils/record-commit-anchor.js.map +1 -1
- package/dist/_utils/refresh-control-state.js +1 -7
- package/dist/_utils/refresh-control-state.js.map +1 -1
- package/dist/_utils/render-callback-page.js +0 -7
- package/dist/_utils/render-callback-page.js.map +1 -1
- package/dist/_utils/resolve-import-workspace.d.ts +0 -7
- package/dist/_utils/resolve-import-workspace.js +1 -13
- package/dist/_utils/resolve-import-workspace.js.map +1 -1
- package/dist/_utils/run-bin.js +0 -2
- package/dist/_utils/run-bin.js.map +1 -1
- package/dist/_utils/session-map.js +0 -5
- package/dist/_utils/session-map.js.map +1 -1
- package/dist/_utils/shell-profile.js +1 -28
- package/dist/_utils/shell-profile.js.map +1 -1
- package/dist/_utils/state-line-memo.d.ts +0 -6
- package/dist/_utils/state-line-memo.js +3 -18
- package/dist/_utils/state-line-memo.js.map +1 -1
- package/dist/_utils/state-line.js +0 -4
- package/dist/_utils/state-line.js.map +1 -1
- package/dist/_utils/state.js +0 -5
- package/dist/_utils/state.js.map +1 -1
- package/dist/_utils/sync-mode-from-server.d.ts +0 -18
- package/dist/_utils/sync-mode-from-server.js +2 -21
- package/dist/_utils/sync-mode-from-server.js.map +1 -1
- package/dist/_utils/transcript-turns.js +1 -51
- package/dist/_utils/transcript-turns.js.map +1 -1
- package/dist/_utils/turn-cache.js +1 -8
- package/dist/_utils/turn-cache.js.map +1 -1
- package/dist/_utils/update.d.ts +0 -10
- package/dist/_utils/update.js +8 -30
- package/dist/_utils/update.js.map +1 -1
- package/dist/_utils/version.js +3 -6
- package/dist/_utils/version.js.map +1 -1
- package/dist/_utils/which.d.ts +0 -5
- package/dist/_utils/which.js +0 -5
- package/dist/_utils/which.js.map +1 -1
- package/dist/_utils/write-commit-trailer.js +1 -5
- package/dist/_utils/write-commit-trailer.js.map +1 -1
- package/dist/bin.js +6 -25
- package/dist/bin.js.map +1 -1
- package/dist/commands/_utils/materialize-skill.js +4 -34
- package/dist/commands/_utils/materialize-skill.js.map +1 -1
- package/dist/commands/_utils/pack-skill-dir.js +6 -27
- package/dist/commands/_utils/pack-skill-dir.js.map +1 -1
- package/dist/commands/artifact.js +2 -5
- package/dist/commands/artifact.js.map +1 -1
- package/dist/commands/code-search.js +0 -6
- package/dist/commands/code-search.js.map +1 -1
- package/dist/commands/doctor.d.ts +0 -17
- package/dist/commands/doctor.js +15 -79
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/feedback.js +2 -10
- package/dist/commands/feedback.js.map +1 -1
- package/dist/commands/git-hooks.js +0 -3
- package/dist/commands/git-hooks.js.map +1 -1
- package/dist/commands/import.js +5 -27
- package/dist/commands/import.js.map +1 -1
- package/dist/commands/incognito.d.ts +0 -5
- package/dist/commands/incognito.js +0 -5
- package/dist/commands/incognito.js.map +1 -1
- package/dist/commands/indicator.d.ts +0 -1
- package/dist/commands/indicator.js +0 -1
- package/dist/commands/indicator.js.map +1 -1
- package/dist/commands/ingest.js +37 -111
- package/dist/commands/ingest.js.map +1 -1
- package/dist/commands/install.js +7 -93
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/invite.d.ts +0 -6
- package/dist/commands/invite.js +0 -16
- package/dist/commands/invite.js.map +1 -1
- package/dist/commands/login.js +0 -15
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/onboard.js +0 -6
- package/dist/commands/onboard.js.map +1 -1
- package/dist/commands/org.js +0 -2
- package/dist/commands/org.js.map +1 -1
- package/dist/commands/pr-link.js +2 -15
- package/dist/commands/pr-link.js.map +1 -1
- package/dist/commands/search.js +0 -5
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/session-start.d.ts +0 -21
- package/dist/commands/session-start.js +6 -65
- package/dist/commands/session-start.js.map +1 -1
- package/dist/commands/set-mode.d.ts +0 -6
- package/dist/commands/set-mode.js +2 -12
- package/dist/commands/set-mode.js.map +1 -1
- package/dist/commands/skill.js +5 -35
- package/dist/commands/skill.js.map +1 -1
- package/dist/commands/statusline.d.ts +0 -13
- package/dist/commands/statusline.js +0 -15
- package/dist/commands/statusline.js.map +1 -1
- package/dist/commands/suggestions.d.ts +0 -6
- package/dist/commands/suggestions.js +0 -7
- package/dist/commands/suggestions.js.map +1 -1
- package/dist/commands/takeover/_utils/agent-paths.js +2 -3
- package/dist/commands/takeover/_utils/agent-paths.js.map +1 -1
- package/dist/commands/takeover/_utils/cursor-store.js +1 -3
- package/dist/commands/takeover/_utils/cursor-store.js.map +1 -1
- package/dist/commands/takeover/_utils/write-codex-desktop-session.js +1 -4
- package/dist/commands/takeover/_utils/write-codex-desktop-session.js.map +1 -1
- package/dist/commands/takeover/_utils/write-codex-session.js +1 -2
- package/dist/commands/takeover/_utils/write-codex-session.js.map +1 -1
- package/dist/commands/uninstall.d.ts +0 -1
- package/dist/commands/uninstall.js +3 -7
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.d.ts +0 -10
- package/dist/commands/update.js +4 -32
- package/dist/commands/update.js.map +1 -1
- package/dist/jcode/plugin.json +1 -1
- package/package.json +1 -1
|
@@ -10,12 +10,7 @@ const LOGIN_CHECK_MARKERS = {
|
|
|
10
10
|
start: "# glen login-check",
|
|
11
11
|
end: "# glen login-check end",
|
|
12
12
|
};
|
|
13
|
-
//
|
|
14
|
-
// auto-edit (fish/others fall back to a printed manual line). We target the
|
|
15
|
-
// LOGIN profile — `.zprofile` / `.bash_profile` — because the agents' hooks
|
|
16
|
-
// run via `$SHELL -lc`, a non-interactive login shell that sources those but
|
|
17
|
-
// NOT `.zshrc`/`.bashrc`. (Homebrew makes the same `.zprofile` choice; pnpm's
|
|
18
|
-
// `.zshrc` is the documented "not found in `$SHELL -lc`" pitfall.)
|
|
13
|
+
// Target the LOGIN profile: agent hooks run via `$SHELL -lc`, which sources .zprofile/.bash_profile but not .zshrc/.bashrc.
|
|
19
14
|
const loginProfileForShell = () => {
|
|
20
15
|
const shell = basename(process.env.SHELL ?? "");
|
|
21
16
|
if (shell === "zsh") {
|
|
@@ -28,13 +23,6 @@ const loginProfileForShell = () => {
|
|
|
28
23
|
}
|
|
29
24
|
return null;
|
|
30
25
|
};
|
|
31
|
-
// The exact block we write — a marker fence (idempotency + clean uninstall)
|
|
32
|
-
// around a runtime `case` guard (re-sourcing never duplicates the PATH entry).
|
|
33
|
-
// Single source of truth: used both for the edit and the manual-line hint.
|
|
34
|
-
// binDir is wrapped in `"` everywhere it appears, so a path with spaces stays
|
|
35
|
-
// one literal word (verified in zsh and bash). binDir is a trusted install
|
|
36
|
-
// path (the npm prefix), so we don't escape `"`/`$`/`` ` `` — they don't occur
|
|
37
|
-
// in a real prefix and escaping them would only obscure the block.
|
|
38
26
|
const glenPathBlock = (binDir) => [
|
|
39
27
|
PATH_MARKERS.start,
|
|
40
28
|
'case ":$PATH:" in',
|
|
@@ -48,8 +36,6 @@ const glenPathBlock = (binDir) => [
|
|
|
48
36
|
// order is deliberate: stdout onto the ORIGINAL stderr first, then stderr off.
|
|
49
37
|
const LOGIN_CHECK_BODY = "if [ -t 0 ] && command -v glen >/dev/null 2>&1; then glen doctor --login-check >&2 2>/dev/null; fi";
|
|
50
38
|
const glenLoginCheckBlock = () => [LOGIN_CHECK_MARKERS.start, LOGIN_CHECK_BODY, LOGIN_CHECK_MARKERS.end].join("\n");
|
|
51
|
-
// Markers match as whole trimmed lines (see PATH_MARKERS note). Returns the
|
|
52
|
-
// fence's [start, end) character span, or null when absent/malformed.
|
|
53
39
|
const fencedSpan = (text, markers) => {
|
|
54
40
|
const lines = [];
|
|
55
41
|
let offset = 0;
|
|
@@ -80,10 +66,6 @@ const atomicWrite = async (filePath, content) => {
|
|
|
80
66
|
return w;
|
|
81
67
|
return fromPromise(rename(tmp, filePath));
|
|
82
68
|
};
|
|
83
|
-
// Stitch the content surrounding a removed/replaced span back together with at
|
|
84
|
-
// most one blank line between the two sides — no double blank lines, no stray
|
|
85
|
-
// leading newline at start-of-file, no trailing cruft when the block was the
|
|
86
|
-
// only content.
|
|
87
69
|
const joinAround = (before, after) => {
|
|
88
70
|
const head = before.replace(/\n+$/, "");
|
|
89
71
|
const tail = after.replace(/^\n+/, "").replace(/\n+$/, "");
|
|
@@ -93,12 +75,6 @@ const joinAround = (before, after) => {
|
|
|
93
75
|
return `${head}\n`;
|
|
94
76
|
return `${head}\n\n${tail}\n`;
|
|
95
77
|
};
|
|
96
|
-
// Ensure the login profile contains exactly the canonical fenced `block`,
|
|
97
|
-
// creating the file if missing. No existing fence (by MARKERS) → append
|
|
98
|
-
// ("added"). An identical block already present → no write
|
|
99
|
-
// ("already-present"). A block that DIFFERS (hand-edited, or changed inputs)
|
|
100
|
-
// → replace it in place so we never leave a duplicate or stale fence behind
|
|
101
|
-
// ("updated"). Atomic write.
|
|
102
78
|
const addFencedBlock = async (profilePath, markers, block, remedy) => {
|
|
103
79
|
const existing = await fromPromise(readFile(profilePath, "utf-8"));
|
|
104
80
|
const current = existing.ok ? existing.value : "";
|
|
@@ -121,9 +97,6 @@ const addFencedBlock = async (profilePath, markers, block, remedy) => {
|
|
|
121
97
|
}
|
|
122
98
|
return ok(outcome);
|
|
123
99
|
};
|
|
124
|
-
// Strip a marker-fenced block (by MARKERS) for `glen uninstall`, leaving clean
|
|
125
|
-
// output for every position (start / middle / end / only-content). Absent
|
|
126
|
-
// block / missing file → "absent" (no-op).
|
|
127
100
|
const removeFencedBlock = async (profilePath, markers, remedy) => {
|
|
128
101
|
const existing = await fromPromise(readFile(profilePath, "utf-8"));
|
|
129
102
|
if (!existing.ok)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell-profile.js","sourceRoot":"","sources":["../../src/_utils/shell-profile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAiB,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAe,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAIhE,8EAA8E;AAC9E,8DAA8D;AAC9D,MAAM,YAAY,GAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC;AACrE,MAAM,mBAAmB,GAAY;IACnC,KAAK,EAAE,oBAAoB;IAC3B,GAAG,EAAE,wBAAwB;CAC9B,CAAC;AAEF,
|
|
1
|
+
{"version":3,"file":"shell-profile.js","sourceRoot":"","sources":["../../src/_utils/shell-profile.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,2 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Record `line` as the latest state line shown to `sessionId` and report
|
|
3
|
-
* whether it differs from what was previously recorded. `true` = new or
|
|
4
|
-
* changed (caller should emit), `false` = identical to the last recorded
|
|
5
|
-
* line (caller may stay silent).
|
|
6
|
-
*/
|
|
7
1
|
declare const rememberStateLine: (sessionId: string, line: string) => Promise<boolean>;
|
|
8
2
|
export { rememberStateLine };
|
|
@@ -1,12 +1,5 @@
|
|
|
1
|
-
//
|
|
2
|
-
//
|
|
3
|
-
// CHANGES (org switch / mode flip mid-session). Codex renders every injected
|
|
4
|
-
// hook context as a visible transcript card with no way to hide it, so an
|
|
5
|
-
// unchanged line every turn is pure noise there — and wasted context tokens
|
|
6
|
-
// everywhere else. Keyed by session id; lives next to state.json so
|
|
7
|
-
// GLEN_STATE_PATH overrides cover it (same pattern as update-check.json).
|
|
8
|
-
// Best-effort by design: every fs failure reports "changed" — fail toward
|
|
9
|
-
// showing the line, never toward hiding it.
|
|
1
|
+
// Emit the state line only when it changes: Codex shows every injected context as a visible card.
|
|
2
|
+
// On any fs failure report "changed": fail toward showing the line, never hiding it.
|
|
10
3
|
import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
|
|
11
4
|
import { homedir } from "node:os";
|
|
12
5
|
import { dirname, join } from "node:path";
|
|
@@ -40,16 +33,8 @@ const writeMemo = async (memo) => {
|
|
|
40
33
|
await writeFile(tmp, JSON.stringify(Object.fromEntries(entries)));
|
|
41
34
|
await rename(tmp, path);
|
|
42
35
|
}
|
|
43
|
-
catch {
|
|
44
|
-
// best-effort — a hook must never fail on memo I/O
|
|
45
|
-
}
|
|
36
|
+
catch { }
|
|
46
37
|
};
|
|
47
|
-
/**
|
|
48
|
-
* Record `line` as the latest state line shown to `sessionId` and report
|
|
49
|
-
* whether it differs from what was previously recorded. `true` = new or
|
|
50
|
-
* changed (caller should emit), `false` = identical to the last recorded
|
|
51
|
-
* line (caller may stay silent).
|
|
52
|
-
*/
|
|
53
38
|
const rememberStateLine = async (sessionId, line) => {
|
|
54
39
|
const memo = await readMemo();
|
|
55
40
|
if (memo[sessionId]?.line === line)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state-line-memo.js","sourceRoot":"","sources":["../../src/_utils/state-line-memo.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"state-line-memo.js","sourceRoot":"","sources":["../../src/_utils/state-line-memo.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,qFAAqF;AACrF,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAK1C,MAAM,YAAY,GAAG,GAAG,CAAC;AACzB,MAAM,UAAU,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEvC,MAAM,QAAQ,GAAG,GAAW,EAAE,CAC5B,IAAI,CACF,OAAO,CAAC,GAAG,CAAC,eAAe;IACzB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IACtC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,EAC5B,sBAAsB,CACvB,CAAC;AAEJ,MAAM,QAAQ,GAAG,KAAK,IAAmB,EAAE;IACzC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;QAC1C,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,OAAO,MAAc,CAAC;QAChE,OAAO,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,KAAK,EAAE,IAAU,EAAiB,EAAE;IACpD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;SACjC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,SAAS,GAAG,UAAU,CAAC;SACjD,IAAI,CACH,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CACrB,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACpE;SACA,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QACxB,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,MAAM,CAAC;QACzC,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;AACZ,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,KAAK,EAC7B,SAAiB,EACjB,IAAY,EACM,EAAE;IACpB,MAAM,IAAI,GAAG,MAAM,QAAQ,EAAE,CAAC;IAC9B,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACjD,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAClD,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;IACtB,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
|
|
@@ -1,12 +1,8 @@
|
|
|
1
1
|
const formatStateLine = (state) => {
|
|
2
2
|
if (!state)
|
|
3
3
|
return null;
|
|
4
|
-
// Off and silent inject nothing — no status line at all (off short-circuits
|
|
5
|
-
// anyway; silent must put zero bytes of glen into the model's context).
|
|
6
4
|
if (state.mode === "off" || state.mode === "silent")
|
|
7
5
|
return null;
|
|
8
|
-
// Org slugs are auto-generated ("acme-1234") — the NAME is the
|
|
9
|
-
// human-meaningful field, so prefer it.
|
|
10
6
|
const org = state.activeOrgName ?? state.activeOrgSlug ?? state.activeOrgId;
|
|
11
7
|
return state.mode === "incognito"
|
|
12
8
|
? `[glen] org: ${org} · incognito: ON — nothing this session is being recorded`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state-line.js","sourceRoot":"","sources":["../../src/_utils/state-line.ts"],"names":[],"mappings":"AAEA,MAAM,eAAe,GAAG,CAAC,KAAuB,EAAiB,EAAE;IACjE,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,
|
|
1
|
+
{"version":3,"file":"state-line.js","sourceRoot":"","sources":["../../src/_utils/state-line.ts"],"names":[],"mappings":"AAEA,MAAM,eAAe,GAAG,CAAC,KAAuB,EAAiB,EAAE;IACjE,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACjE,MAAM,GAAG,GAAG,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,WAAW,CAAC;IAC5E,OAAO,KAAK,CAAC,IAAI,KAAK,WAAW;QAC/B,CAAC,CAAC,eAAe,GAAG,2DAA2D;QAC/E,CAAC,CAAC,eAAe,GAAG,cAAc,CAAC;AACvC,CAAC,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,CAAC"}
|
package/dist/_utils/state.js
CHANGED
|
@@ -14,8 +14,6 @@ const readState = async () => {
|
|
|
14
14
|
const d = parsed.value;
|
|
15
15
|
if (!d || typeof d.activeOrgId !== "string")
|
|
16
16
|
return null;
|
|
17
|
-
// Back-compat: pre-tri-state files carry a boolean `incognito` and no `mode`.
|
|
18
|
-
// Derive the mode (incognito → "incognito", else "on") so nobody has to re-login.
|
|
19
17
|
const mode = isGlenMode(d.mode)
|
|
20
18
|
? d.mode
|
|
21
19
|
: d.incognito === true
|
|
@@ -36,7 +34,6 @@ const writeState = async (state) => {
|
|
|
36
34
|
const mk = await fromPromise(mkdir(dirname(filePath), { recursive: true, mode: 0o700 }));
|
|
37
35
|
if (!mk.ok)
|
|
38
36
|
return mk;
|
|
39
|
-
// pid-suffixed so concurrent writers never clobber each other's tmp file.
|
|
40
37
|
const tmp = `${filePath}.${process.pid}.tmp`;
|
|
41
38
|
const w = await fromPromise(writeFile(tmp, JSON.stringify(state, null, 2)));
|
|
42
39
|
if (!w.ok)
|
|
@@ -46,8 +43,6 @@ const writeState = async (state) => {
|
|
|
46
43
|
return mv;
|
|
47
44
|
return { ok: true, value: undefined };
|
|
48
45
|
};
|
|
49
|
-
// ENOENT counts as success (nothing to clear); any other failure is returned
|
|
50
|
-
// so the caller can tell the user the file is still on disk.
|
|
51
46
|
const clearState = async () => {
|
|
52
47
|
const r = await fromPromise(unlink(statePath()));
|
|
53
48
|
if (!r.ok && r.error.code !== "ENOENT")
|
package/dist/_utils/state.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/_utils/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/_utils/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,21 +1,3 @@
|
|
|
1
1
|
import { type GlenState } from "./state.js";
|
|
2
|
-
/**
|
|
3
|
-
* Mirror the server-side recording preference (the source of truth, echoed on
|
|
4
|
-
* every turn response and returned by the control-status endpoint) into local
|
|
5
|
-
* state, so a dashboard or other-machine toggle reaches this machine within
|
|
6
|
-
* one turn. The endpoint carries no recorded user or org content — it also
|
|
7
|
-
* returns a static, server-authored team-memory block, identical for every
|
|
8
|
-
* user, which is not this function's concern. Returns the freshest state for
|
|
9
|
-
* display (re-read here — the state the caller read before its POST may be
|
|
10
|
-
* stale by now).
|
|
11
|
-
*
|
|
12
|
-
* Rules:
|
|
13
|
-
* - Last-writer-wins on SERVER timestamps: only apply an echo strictly newer
|
|
14
|
-
* than the last value this machine pushed/applied, so a stale in-flight turn
|
|
15
|
-
* can't undo a `glen incognito|silent|on` that just ran.
|
|
16
|
-
* - No stored preference server-side (updatedAt null) → nothing authoritative;
|
|
17
|
-
* leave local state alone.
|
|
18
|
-
* - Best-effort: a failed state write just keeps the current state.
|
|
19
|
-
*/
|
|
20
2
|
declare const syncModeFromServer: (json: unknown) => Promise<GlenState | null>;
|
|
21
3
|
export { syncModeFromServer };
|
|
@@ -1,22 +1,6 @@
|
|
|
1
1
|
import { readState, writeState } from "./state.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
* every turn response and returned by the control-status endpoint) into local
|
|
5
|
-
* state, so a dashboard or other-machine toggle reaches this machine within
|
|
6
|
-
* one turn. The endpoint carries no recorded user or org content — it also
|
|
7
|
-
* returns a static, server-authored team-memory block, identical for every
|
|
8
|
-
* user, which is not this function's concern. Returns the freshest state for
|
|
9
|
-
* display (re-read here — the state the caller read before its POST may be
|
|
10
|
-
* stale by now).
|
|
11
|
-
*
|
|
12
|
-
* Rules:
|
|
13
|
-
* - Last-writer-wins on SERVER timestamps: only apply an echo strictly newer
|
|
14
|
-
* than the last value this machine pushed/applied, so a stale in-flight turn
|
|
15
|
-
* can't undo a `glen incognito|silent|on` that just ran.
|
|
16
|
-
* - No stored preference server-side (updatedAt null) → nothing authoritative;
|
|
17
|
-
* leave local state alone.
|
|
18
|
-
* - Best-effort: a failed state write just keeps the current state.
|
|
19
|
-
*/
|
|
2
|
+
// Last-writer-wins on server timestamps: apply only echoes strictly newer than modeUpdatedAt,
|
|
3
|
+
// so a stale in-flight turn can't undo a mode change. A null server updatedAt is not authoritative.
|
|
20
4
|
const syncModeFromServer = async (json) => {
|
|
21
5
|
const state = await readState();
|
|
22
6
|
if (!state)
|
|
@@ -44,15 +28,12 @@ const syncModeFromServer = async (json) => {
|
|
|
44
28
|
: null;
|
|
45
29
|
if (updatedAt === null)
|
|
46
30
|
return state;
|
|
47
|
-
// One preference row, one timestamp: serverIncognitoUpdatedAt covers both
|
|
48
|
-
// flags. An old server never sends serverSilent — treat missing as false.
|
|
49
31
|
const desired = canonical ??
|
|
50
32
|
(d.serverIncognito
|
|
51
33
|
? "incognito"
|
|
52
34
|
: d.serverSilent === true
|
|
53
35
|
? "silent"
|
|
54
36
|
: "on");
|
|
55
|
-
// ISO-8601 UTC timestamps compare correctly as strings.
|
|
56
37
|
if (state.modeUpdatedAt !== undefined && updatedAt <= state.modeUpdatedAt)
|
|
57
38
|
return state;
|
|
58
39
|
const next = { ...state, mode: desired, modeUpdatedAt: updatedAt };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-mode-from-server.js","sourceRoot":"","sources":["../../src/_utils/sync-mode-from-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEnE
|
|
1
|
+
{"version":3,"file":"sync-mode-from-server.js","sourceRoot":"","sources":["../../src/_utils/sync-mode-from-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEnE,8FAA8F;AAC9F,oGAAoG;AACpG,MAAM,kBAAkB,GAAG,KAAK,EAAE,IAAa,EAA6B,EAAE;IAC5E,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;IAChC,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,MAAM,CAAC,GAAG,IAOF,CAAC;IACT,IAAI,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACrB,MAAM,SAAS,GACb,CAAC,CAAC,UAAU,KAAK,IAAI;QACrB,CAAC,CAAC,UAAU,KAAK,KAAK;QACtB,CAAC,CAAC,UAAU,KAAK,WAAW;QAC5B,CAAC,CAAC,UAAU,KAAK,QAAQ;QACvB,CAAC,CAAC,CAAC,CAAC,UAAU;QACd,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI;YACb,CAAC,CAAC,IAAI,KAAK,KAAK;YAChB,CAAC,CAAC,IAAI,KAAK,WAAW;YACtB,CAAC,CAAC,IAAI,KAAK,QAAQ;YACrB,CAAC,CAAC,CAAC,CAAC,IAAI;YACR,CAAC,CAAC,IAAI,CAAC;IACb,IAAI,SAAS,KAAK,IAAI,IAAI,OAAO,CAAC,CAAC,eAAe,KAAK,SAAS;QAC9D,OAAO,KAAK,CAAC;IACf,MAAM,SAAS,GACb,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ;QAC7B,CAAC,CAAC,CAAC,CAAC,SAAS;QACb,CAAC,CAAC,OAAO,CAAC,CAAC,wBAAwB,KAAK,QAAQ;YAC9C,CAAC,CAAC,CAAC,CAAC,wBAAwB;YAC5B,CAAC,CAAC,IAAI,CAAC;IACb,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACrC,MAAM,OAAO,GACX,SAAS;QACT,CAAC,CAAC,CAAC,eAAe;YAChB,CAAC,CAAC,WAAW;YACb,CAAC,CAAC,CAAC,CAAC,YAAY,KAAK,IAAI;gBACvB,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,IAAI,CAAC,CAAC;IACd,IAAI,KAAK,CAAC,aAAa,KAAK,SAAS,IAAI,SAAS,IAAI,KAAK,CAAC,aAAa;QACvE,OAAO,KAAK,CAAC;IACf,MAAM,IAAI,GAAG,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC;IACnE,MAAM,CAAC,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;AAC7B,CAAC,CAAC;AAEF,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
|
|
@@ -1,19 +1,11 @@
|
|
|
1
|
-
// Old transcripts carry unbounded tool dumps / pastes; cap per-message content
|
|
2
|
-
// well under the server's 100k backstop so an import can't 400 on size.
|
|
3
1
|
const MAX_MESSAGE_CHARS = 30_000;
|
|
4
2
|
const truncate = (text) => text.length <= MAX_MESSAGE_CHARS
|
|
5
3
|
? text
|
|
6
4
|
: `${text.slice(0, MAX_MESSAGE_CHARS)}\n… [truncated by glen import]`;
|
|
7
5
|
const MAX_SEGMENT_CHARS = 30_000;
|
|
8
|
-
//
|
|
9
|
-
// segments are stored on the message payload). Enforced below in
|
|
10
|
-
// boundSegmentsPayload so an oversized message never 400s the whole turn.
|
|
6
|
+
// Must match the server's per-message payload cap, or an oversized message 400s the whole turn.
|
|
11
7
|
const MAX_PAYLOAD_CHARS = 1_000_000;
|
|
12
8
|
const TRUNCATION_MARKER = "… [truncated by glen]";
|
|
13
|
-
// Deep-truncates every string leaf inside an arbitrary JSON value (recursing
|
|
14
|
-
// into arrays and plain objects, leaving other value types untouched). Used
|
|
15
|
-
// to bound jsonContent, whose heaviest leaves (tool output/input, and the
|
|
16
|
-
// full `raw` block a Write embeds) are otherwise unbounded.
|
|
17
9
|
const truncateJsonStrings = (value, maxChars) => {
|
|
18
10
|
if (typeof value === "string")
|
|
19
11
|
return value.length > maxChars
|
|
@@ -42,22 +34,12 @@ const truncateSegment = (s) => {
|
|
|
42
34
|
}
|
|
43
35
|
: withText;
|
|
44
36
|
};
|
|
45
|
-
// Drops the `raw` key from every segment's jsonContent — it's redundant with
|
|
46
|
-
// the normalized output/input and is the biggest single contributor to an
|
|
47
|
-
// oversized payload.
|
|
48
37
|
const dropRawFromSegments = (segments) => segments.map((s) => {
|
|
49
38
|
if (s.jsonContent === undefined || !("raw" in s.jsonContent))
|
|
50
39
|
return s;
|
|
51
40
|
const { raw: _raw, ...rest } = s.jsonContent;
|
|
52
41
|
return { ...s, jsonContent: rest };
|
|
53
42
|
});
|
|
54
|
-
// Re-truncates jsonContent string leaves AND thinking-segment text to a
|
|
55
|
-
// smaller cap, recursively halving the cap until the serialized payload fits
|
|
56
|
-
// or the cap bottoms out. Never touches a text segment's prose, and never
|
|
57
|
-
// touches a tool_call's `name` (only jsonContent leaves are re-capped, and
|
|
58
|
-
// `name` lives outside jsonContent in practice — segments carry it inside
|
|
59
|
-
// jsonContent alongside output/input, so we re-cap the whole jsonContent
|
|
60
|
-
// object uniformly; the `name` field is short and unaffected by the cap).
|
|
61
43
|
const RECAP_FLOOR_CHARS = 1_000;
|
|
62
44
|
const recapSegments = (segments, capChars) => segments.map((s) => {
|
|
63
45
|
const withJson = s.jsonContent !== undefined
|
|
@@ -76,30 +58,18 @@ const recapSegments = (segments, capChars) => segments.map((s) => {
|
|
|
76
58
|
: withJson;
|
|
77
59
|
});
|
|
78
60
|
const fitsBudget = (segments) => JSON.stringify(segments).length <= MAX_PAYLOAD_CHARS;
|
|
79
|
-
// Recursively halves the recap cap until the payload fits the budget or the
|
|
80
|
-
// cap bottoms out at RECAP_FLOOR_CHARS — never mutates, always returns a new
|
|
81
|
-
// array (or the input array's shape via a pure recursive call).
|
|
82
61
|
const shrinkToFit = (segments, capChars) => {
|
|
83
62
|
const recapped = recapSegments(segments, capChars);
|
|
84
63
|
if (fitsBudget(recapped) || capChars <= RECAP_FLOOR_CHARS)
|
|
85
64
|
return recapped;
|
|
86
65
|
return shrinkToFit(recapped, Math.floor(capChars / 2));
|
|
87
66
|
};
|
|
88
|
-
// Last-resort guarantee (FIX B2): shrinkToFit is best-effort — it stops at
|
|
89
|
-
// RECAP_FLOOR_CHARS even if the payload is still over budget (a message with
|
|
90
|
-
// a very large NUMBER of segments can exceed the cap even with every string
|
|
91
|
-
// leaf floored, since the leaves were never the problem). Drop whole
|
|
92
|
-
// segments, least-valuable first, until the payload fits. `kind:"text"`
|
|
93
|
-
// (prose) is NEVER dropped — the order below only ever removes tool
|
|
94
|
-
// call/result/thinking/compaction segments. Pure recursion, no mutation.
|
|
95
67
|
const DROP_ORDER = [
|
|
96
68
|
"tool_result",
|
|
97
69
|
"compaction",
|
|
98
70
|
"thinking",
|
|
99
71
|
"tool_call",
|
|
100
72
|
];
|
|
101
|
-
// Drops every segment of `kind` in one pass (never touches `text`), then
|
|
102
|
-
// recurses to the next-least-valuable kind if still over budget.
|
|
103
73
|
const dropByKind = (segments, kinds) => {
|
|
104
74
|
if (fitsBudget(segments))
|
|
105
75
|
return [...segments];
|
|
@@ -109,23 +79,11 @@ const dropByKind = (segments, kinds) => {
|
|
|
109
79
|
const dropped = segments.filter((s) => s.kind !== kind);
|
|
110
80
|
return dropByKind(dropped, rest);
|
|
111
81
|
};
|
|
112
|
-
// Absolute final step: even with every non-text segment dropped, pathological
|
|
113
|
-
// prose (e.g. one enormous text segment) could still exceed the cap. Truncate
|
|
114
|
-
// the segments array from the end (never touching the text CONTENT of a kept
|
|
115
|
-
// segment) until it fits, or nothing is left.
|
|
116
82
|
const truncateFromEnd = (segments) => {
|
|
117
83
|
if (segments.length === 0 || fitsBudget(segments))
|
|
118
84
|
return [...segments];
|
|
119
85
|
return truncateFromEnd(segments.slice(0, -1));
|
|
120
86
|
};
|
|
121
|
-
// Enforces the per-message TOTAL payload budget: drop `raw` first (the
|
|
122
|
-
// biggest contributor), then progressively re-truncate jsonContent/thinking
|
|
123
|
-
// text until under budget or the recap cap floors out, then — if STILL over
|
|
124
|
-
// budget — drop whole non-text segments (least-valuable kind first), and as
|
|
125
|
-
// an absolute last resort truncate the segments array itself. Prose
|
|
126
|
-
// (`kind:"text"`) segment text and tool_call `name` are never touched, and no
|
|
127
|
-
// `kind:"text"` segment is ever dropped by dropByKind. Pure — always returns a
|
|
128
|
-
// new array whose serialized length is <= MAX_PAYLOAD_CHARS.
|
|
129
87
|
const boundSegmentsPayload = (segments) => {
|
|
130
88
|
if (fitsBudget(segments))
|
|
131
89
|
return [...segments];
|
|
@@ -138,11 +96,6 @@ const boundSegmentsPayload = (segments) => {
|
|
|
138
96
|
return dropByKind(shrunk, DROP_ORDER);
|
|
139
97
|
};
|
|
140
98
|
const earliestTimestamp = (a, b) => (!a ? b : !b ? a : a < b ? a : b);
|
|
141
|
-
// Group a transcript's messages into turns mirroring live capture: fold
|
|
142
|
-
// consecutive same-role messages (an assistant reply split across transcript
|
|
143
|
-
// lines becomes one message), drop blanks, truncate oversized content, then
|
|
144
|
-
// start a new turn at every user message. A block of assistant messages before
|
|
145
|
-
// the first user message becomes its own leading turn.
|
|
146
99
|
const buildTranscriptTurns = (messages) => {
|
|
147
100
|
const folded = [];
|
|
148
101
|
for (const m of messages) {
|
|
@@ -181,9 +134,6 @@ const buildTranscriptTurns = (messages) => {
|
|
|
181
134
|
: {}),
|
|
182
135
|
}))) {
|
|
183
136
|
const last = turns[turns.length - 1];
|
|
184
|
-
// Roles alternate after folding, so appending an assistant message to the
|
|
185
|
-
// previous turn always yields [user, assistant] (or a lone leading
|
|
186
|
-
// assistant turn when there is no prior user message).
|
|
187
137
|
if (m.role === "user" || !last)
|
|
188
138
|
turns.push([m]);
|
|
189
139
|
else
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transcript-turns.js","sourceRoot":"","sources":["../../src/_utils/transcript-turns.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"transcript-turns.js","sourceRoot":"","sources":["../../src/_utils/transcript-turns.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
// Local pairing store for agents whose hooks provide no transcript file
|
|
2
|
-
// (Cursor): beforeSubmitPrompt remembers the prompt, afterAgentResponse
|
|
3
|
-
// remembers the assistant text, and the turn-end ingest pairs them.
|
|
4
|
-
// Best-effort by design — every fs failure degrades to "no cached turn".
|
|
5
1
|
import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
|
|
6
2
|
import { homedir } from "node:os";
|
|
7
3
|
import { dirname, join } from "node:path";
|
|
@@ -34,13 +30,10 @@ const writeCache = async (cache) => {
|
|
|
34
30
|
await writeFile(tmp, JSON.stringify(Object.fromEntries(entries)));
|
|
35
31
|
await rename(tmp, path);
|
|
36
32
|
}
|
|
37
|
-
catch {
|
|
38
|
-
// best-effort — a hook must never fail on cache I/O
|
|
39
|
-
}
|
|
33
|
+
catch { }
|
|
40
34
|
};
|
|
41
35
|
const rememberPrompt = async (conversationId, prompt) => {
|
|
42
36
|
const cache = await readCache();
|
|
43
|
-
// A new prompt starts a new turn — drop the previous assistant text.
|
|
44
37
|
cache[conversationId] = { prompt, updatedAt: Date.now() };
|
|
45
38
|
await writeCache(cache);
|
|
46
39
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"turn-cache.js","sourceRoot":"","sources":["../../src/_utils/turn-cache.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"turn-cache.js","sourceRoot":"","sources":["../../src/_utils/turn-cache.ts"],"names":[],"mappings":"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"}
|
package/dist/_utils/update.d.ts
CHANGED
|
@@ -13,17 +13,7 @@ type SelfUpdateResult = {
|
|
|
13
13
|
readonly stderrTail?: string;
|
|
14
14
|
};
|
|
15
15
|
declare const runSelfUpdate: () => SelfUpdateResult;
|
|
16
|
-
/** Detached, TTL'd: never blocks the calling turn. Safe to call from every command. */
|
|
17
16
|
declare const maybeSpawnBackgroundUpdate: () => Promise<void>;
|
|
18
|
-
/** 426 from the server: update NOW, then re-exec the (new) global bin with the original args. */
|
|
19
17
|
declare const handle426AndReexec: (argv: string[]) => never;
|
|
20
|
-
/**
|
|
21
|
-
* 426 in a hook context: hint + detached background update, never block or
|
|
22
|
-
* re-exec — the hook has a hard timeout and Claude/Codex inject its stdout
|
|
23
|
-
* as context, so a synchronous npm install here would block the user's turn.
|
|
24
|
-
* Returns whether a background update was actually spawned, so callers can
|
|
25
|
-
* pick an honest agent-facing hint (a gated spawn means nothing is updating —
|
|
26
|
-
* the user has to run the install themselves).
|
|
27
|
-
*/
|
|
28
18
|
declare const handle426InHook: () => boolean;
|
|
29
19
|
export { lockPath, shouldCheck, recordCheck, fetchLatest, newer, isNpmGlobalInstall, runSelfUpdate, maybeSpawnBackgroundUpdate, handle426AndReexec, handle426InHook, cachedNewerVersion, };
|
package/dist/_utils/update.js
CHANGED
|
@@ -4,14 +4,12 @@ import { homedir } from "node:os";
|
|
|
4
4
|
import { dirname, join } from "node:path";
|
|
5
5
|
import { runBin } from "./run-bin.js";
|
|
6
6
|
import { cliVersion } from "./version.js";
|
|
7
|
-
// Mirrors how codex-hooks-setup.ts derives its marker path from statePath():
|
|
8
|
-
// when GLEN_STATE_PATH is set (tests), the glen dir is its dirname.
|
|
9
7
|
const glenDir = () => process.env.GLEN_STATE_PATH
|
|
10
8
|
? dirname(process.env.GLEN_STATE_PATH)
|
|
11
9
|
: join(homedir(), ".glen");
|
|
12
10
|
const checkPath = () => join(glenDir(), "update-check.json");
|
|
13
11
|
const lockPath = () => join(glenDir(), "update.lock");
|
|
14
|
-
const CHECK_INTERVAL_MS = 60 * 60 * 1000;
|
|
12
|
+
const CHECK_INTERVAL_MS = 60 * 60 * 1000;
|
|
15
13
|
const autoUpdateDisabled = () => process.env.GLEN_NO_AUTO_UPDATE === "1" ||
|
|
16
14
|
process.env.CI === "true" ||
|
|
17
15
|
process.env.CI === "1";
|
|
@@ -31,9 +29,7 @@ const recordCheck = (now, latest) => {
|
|
|
31
29
|
mkdirSync(glenDir(), { recursive: true });
|
|
32
30
|
writeFileSync(checkPath(), JSON.stringify({ lastCheckedAt: now, latest }));
|
|
33
31
|
}
|
|
34
|
-
catch {
|
|
35
|
-
/* best-effort */
|
|
36
|
-
}
|
|
32
|
+
catch { }
|
|
37
33
|
};
|
|
38
34
|
const fetchLatest = async () => {
|
|
39
35
|
try {
|
|
@@ -49,8 +45,6 @@ const fetchLatest = async () => {
|
|
|
49
45
|
return null;
|
|
50
46
|
}
|
|
51
47
|
};
|
|
52
|
-
// Reads the TTL'd update-check cache (never hits the network). Returns the
|
|
53
|
-
// newer known version, else null.
|
|
54
48
|
const cachedNewerVersion = () => {
|
|
55
49
|
try {
|
|
56
50
|
const data = JSON.parse(readFileSync(checkPath(), "utf8"));
|
|
@@ -83,10 +77,8 @@ const isNpmGlobalInstall = () => {
|
|
|
83
77
|
}
|
|
84
78
|
};
|
|
85
79
|
const LOCK_TTL_MS = 10 * 60 * 1000;
|
|
86
|
-
//
|
|
87
|
-
//
|
|
88
|
-
// than LOCK_TTL_MS (e.g. a previous update was SIGKILLed mid-install) — is
|
|
89
|
-
// removed and the mkdir retried ONCE.
|
|
80
|
+
// A stale lock (no readable start marker, or older than LOCK_TTL_MS, e.g. a SIGKILLed install)
|
|
81
|
+
// is removed and the mkdir retried once.
|
|
90
82
|
const acquireUpdateLock = () => {
|
|
91
83
|
const tryMkdir = () => {
|
|
92
84
|
try {
|
|
@@ -98,9 +90,7 @@ const acquireUpdateLock = () => {
|
|
|
98
90
|
try {
|
|
99
91
|
writeFileSync(join(lockPath(), "started"), String(Date.now()));
|
|
100
92
|
}
|
|
101
|
-
catch {
|
|
102
|
-
// best-effort: a missing marker reads as stale to the next contender
|
|
103
|
-
}
|
|
93
|
+
catch { }
|
|
104
94
|
return true;
|
|
105
95
|
};
|
|
106
96
|
if (tryMkdir())
|
|
@@ -145,7 +135,6 @@ const runSelfUpdate = () => {
|
|
|
145
135
|
rmSync(lockPath(), { recursive: true, force: true });
|
|
146
136
|
}
|
|
147
137
|
};
|
|
148
|
-
/** Detached, TTL'd: never blocks the calling turn. Safe to call from every command. */
|
|
149
138
|
const maybeSpawnBackgroundUpdate = async () => {
|
|
150
139
|
const now = Date.now();
|
|
151
140
|
if (!shouldCheck(now))
|
|
@@ -164,7 +153,6 @@ const maybeSpawnBackgroundUpdate = async () => {
|
|
|
164
153
|
});
|
|
165
154
|
child.unref();
|
|
166
155
|
};
|
|
167
|
-
/** 426 from the server: update NOW, then re-exec the (new) global bin with the original args. */
|
|
168
156
|
const handle426AndReexec = (argv) => {
|
|
169
157
|
if (process.env.GLEN_REEXEC === "1" ||
|
|
170
158
|
autoUpdateDisabled() ||
|
|
@@ -173,8 +161,7 @@ const handle426AndReexec = (argv) => {
|
|
|
173
161
|
process.stderr.write("[glen] this CLI is below the server's minimum version; run `glen update` (or `npm i -g @tryglen/cli@latest`).\n");
|
|
174
162
|
process.exit(1);
|
|
175
163
|
}
|
|
176
|
-
// Re-exec via process.execPath + argv[1]
|
|
177
|
-
// off-PATH and exits silently).
|
|
164
|
+
// Re-exec via process.execPath + argv[1]: a bare "glen" fails off-PATH and exits silently.
|
|
178
165
|
const r = spawnSync(process.execPath, [process.argv[1] ?? "glen", ...argv], {
|
|
179
166
|
stdio: "inherit",
|
|
180
167
|
env: { ...process.env, GLEN_REEXEC: "1" },
|
|
@@ -185,23 +172,14 @@ const handle426AndReexec = (argv) => {
|
|
|
185
172
|
}
|
|
186
173
|
process.exit(r.status);
|
|
187
174
|
};
|
|
188
|
-
|
|
189
|
-
* 426 in a hook context: hint + detached background update, never block or
|
|
190
|
-
* re-exec — the hook has a hard timeout and Claude/Codex inject its stdout
|
|
191
|
-
* as context, so a synchronous npm install here would block the user's turn.
|
|
192
|
-
* Returns whether a background update was actually spawned, so callers can
|
|
193
|
-
* pick an honest agent-facing hint (a gated spawn means nothing is updating —
|
|
194
|
-
* the user has to run the install themselves).
|
|
195
|
-
*/
|
|
175
|
+
// Never block or re-exec here: hooks have a hard timeout, so a synchronous npm install would stall the user's turn.
|
|
196
176
|
const handle426InHook = () => {
|
|
197
177
|
const spawned = (() => {
|
|
198
178
|
if (autoUpdateDisabled() || !isNpmGlobalInstall())
|
|
199
179
|
return false;
|
|
200
180
|
try {
|
|
201
181
|
const c = spawn(process.execPath, [process.argv[1] ?? "glen", "__self-update"], { detached: true, stdio: "ignore" });
|
|
202
|
-
c.on("error", () => {
|
|
203
|
-
/* best-effort */
|
|
204
|
-
});
|
|
182
|
+
c.on("error", () => { });
|
|
205
183
|
c.unref();
|
|
206
184
|
return true;
|
|
207
185
|
}
|