@tryglen/cli 0.34.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 -13
- package/dist/_utils/agent-adapter.js +1 -19
- 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.d.ts +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.d.ts +9 -1
- package/dist/_utils/install-receipt.js +18 -3
- package/dist/_utils/install-receipt.js.map +1 -1
- package/dist/_utils/jcode-bundle.d.ts +3 -0
- package/dist/_utils/jcode-bundle.js +16 -0
- package/dist/_utils/jcode-bundle.js.map +1 -0
- package/dist/_utils/jcode-event.d.ts +3 -0
- package/dist/_utils/jcode-event.js +66 -0
- package/dist/_utils/jcode-event.js.map +1 -0
- package/dist/_utils/jcode-hook-lines.d.ts +5 -0
- package/dist/_utils/jcode-hook-lines.js +7 -0
- package/dist/_utils/jcode-hook-lines.js.map +1 -0
- package/dist/_utils/jcode-hooks-toml.d.ts +8 -0
- package/dist/_utils/jcode-hooks-toml.js +148 -0
- package/dist/_utils/jcode-hooks-toml.js.map +1 -0
- package/dist/_utils/jcode-paths.d.ts +7 -0
- package/dist/_utils/jcode-paths.js +10 -0
- package/dist/_utils/jcode-paths.js.map +1 -0
- package/dist/_utils/jcode-setup.d.ts +27 -0
- package/dist/_utils/jcode-setup.js +151 -0
- package/dist/_utils/jcode-setup.js.map +1 -0
- package/dist/_utils/jcode-skills-sync.d.ts +8 -0
- package/dist/_utils/jcode-skills-sync.js +74 -0
- package/dist/_utils/jcode-skills-sync.js.map +1 -0
- package/dist/_utils/login-check.js +1 -4
- package/dist/_utils/login-check.js.map +1 -1
- package/dist/_utils/managed-block.d.ts +4 -0
- package/dist/_utils/managed-block.js +38 -0
- package/dist/_utils/managed-block.js.map +1 -0
- 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-harbor-atif.js +2 -1
- package/dist/_utils/parse-harbor-atif.js.map +1 -1
- package/dist/_utils/parse-jcode-session.d.ts +14 -0
- package/dist/_utils/parse-jcode-session.js +113 -0
- package/dist/_utils/parse-jcode-session.js.map +1 -0
- 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.d.ts +1 -1
- package/dist/_utils/plugin-status.js +25 -16
- 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.d.ts +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 +15 -31
- 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 +29 -75
- 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 +58 -122
- package/dist/commands/ingest.js.map +1 -1
- package/dist/commands/install.d.ts +1 -0
- package/dist/commands/install.js +52 -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 +19 -68
- 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 +7 -7
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.d.ts +0 -10
- package/dist/commands/update.js +21 -30
- package/dist/commands/update.js.map +1 -1
- package/dist/jcode/plugin.json +8 -0
- package/dist/jcode/preferred-tools.md +3 -0
- package/dist/jcode/prompt-overlay.md +15 -0
- package/dist/jcode/skills/code-search/SKILL.md +19 -0
- package/dist/jcode/skills/controls/SKILL.md +45 -0
- package/dist/jcode/skills/create-artifact/SKILL.md +11 -0
- package/dist/jcode/skills/create-skill/SKILL.md +41 -0
- package/dist/jcode/skills/feedback/SKILL.md +59 -0
- package/dist/jcode/skills/forget/SKILL.md +41 -0
- package/dist/jcode/skills/import-transcripts/SKILL.md +27 -0
- package/dist/jcode/skills/invite/SKILL.md +28 -0
- package/dist/jcode/skills/search/SKILL.md +35 -0
- package/dist/jcode/skills/session-takeover/SKILL.md +67 -0
- package/dist/jcode/skills/setup/SKILL.md +62 -0
- package/dist/jcode/skills/use-artifact/SKILL.md +11 -0
- package/dist/jcode/skills/use-skill/SKILL.md +10 -0
- package/package.json +5 -3
package/dist/_utils/http.js
CHANGED
|
@@ -40,10 +40,6 @@ const classifyFetchError = (e, url) => {
|
|
|
40
40
|
};
|
|
41
41
|
const httpJson = async (url, options = {}) => {
|
|
42
42
|
const { method = "GET", headers, body, timeoutMs } = options;
|
|
43
|
-
// Staging/preview deployments sit behind Vercel deployment protection; the
|
|
44
|
-
// bypass token must ride on EVERY request or Vercel 401s before the app
|
|
45
|
-
// runs. Env-gated so production use (unset) sends nothing extra — pairs
|
|
46
|
-
// with GLEN_BASE_URL for pointing the CLI at a preview deploy.
|
|
47
43
|
const bypassToken = process.env.GLEN_VERCEL_PROTECTION_BYPASS;
|
|
48
44
|
const mergedHeaders = {
|
|
49
45
|
...(bypassToken ? { "x-vercel-protection-bypass": bypassToken } : {}),
|
|
@@ -81,7 +77,7 @@ const httpJson = async (url, options = {}) => {
|
|
|
81
77
|
return rawText.length > 0 ? JSON.parse(rawText) : null;
|
|
82
78
|
}
|
|
83
79
|
catch {
|
|
84
|
-
return null;
|
|
80
|
+
return null;
|
|
85
81
|
}
|
|
86
82
|
})();
|
|
87
83
|
return {
|
|
@@ -94,9 +90,6 @@ const httpJson = async (url, options = {}) => {
|
|
|
94
90
|
},
|
|
95
91
|
};
|
|
96
92
|
};
|
|
97
|
-
// Remedy for a transport failure: HttpFailure.detail stays purely
|
|
98
|
-
// descriptive; the actionable part lives here, on the CliError side. Only
|
|
99
|
-
// refused/dns plausibly point at a misconfigured custom base URL.
|
|
100
93
|
const networkRemedy = (failure) => failure.kind === "refused" || failure.kind === "dns"
|
|
101
94
|
? "check your connection and retry; if you use a custom GLEN_BASE_URL, verify it"
|
|
102
95
|
: "check your connection and retry";
|
package/dist/_utils/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/_utils/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/_utils/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
-
// The
|
|
3
|
-
// string (turn_id from codex events when no transcript is available). Both are
|
|
4
|
-
// serialised via template literal and separated from sessionId by a null byte
|
|
5
|
-
// to prevent prefix-collision attacks.
|
|
2
|
+
// The null-byte separator prevents prefix collisions between sessionId and the index.
|
|
6
3
|
const idempotencyKey = (sessionId, userMessageIndexOrTurnId) => createHash("sha256")
|
|
7
4
|
.update(`${sessionId}\0${userMessageIndexOrTurnId}`)
|
|
8
5
|
.digest("hex");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"idempotency-key.js","sourceRoot":"","sources":["../../src/_utils/idempotency-key.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,
|
|
1
|
+
{"version":3,"file":"idempotency-key.js","sourceRoot":"","sources":["../../src/_utils/idempotency-key.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,sFAAsF;AACtF,MAAM,cAAc,GAAG,CACrB,SAAiB,EACjB,wBAAyC,EACjC,EAAE,CACV,UAAU,CAAC,QAAQ,CAAC;KACjB,MAAM,CAAC,GAAG,SAAS,KAAK,wBAAwB,EAAE,CAAC;KACnD,MAAM,CAAC,KAAK,CAAC,CAAC;AAEnB,OAAO,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -5,23 +5,14 @@ import { fileURLToPath } from "node:url";
|
|
|
5
5
|
import { err, fromPromise, ok } from "./result.js";
|
|
6
6
|
import { runBin } from "./run-bin.js";
|
|
7
7
|
const LABEL = "com.tryglen.indicator";
|
|
8
|
-
// Two levels up from _utils/ is the package root, from both src/ (vitest runs TS
|
|
9
|
-
// directly) and dist/ (built) — same trick as version.ts.
|
|
10
8
|
const indicatorExecutable = () => process.env.GLEN_INDICATOR_APP ??
|
|
11
9
|
join(dirname(fileURLToPath(import.meta.url)), "..", "..", "dist", "macos", "glen.app", "Contents", "MacOS", "glen");
|
|
12
10
|
const launchAgentPath = () => process.env.GLEN_LAUNCH_AGENT_PATH ??
|
|
13
11
|
join(homedir(), "Library", "LaunchAgents", `${LABEL}.plist`);
|
|
14
|
-
// dist/bin.js beside this module once built (src/bin.ts under vitest, which
|
|
15
|
-
// never registers for real).
|
|
16
12
|
const cliEntrypoint = () => process.env.GLEN_CLI_ENTRYPOINT ??
|
|
17
13
|
join(dirname(fileURLToPath(import.meta.url)), "..", "bin.js");
|
|
18
|
-
// KeepAlive
|
|
19
|
-
//
|
|
20
|
-
//
|
|
21
|
-
// GLEN_NODE/GLEN_CLI let the app change modes by exec'ing this exact CLI.
|
|
22
|
-
// launchd hands a GUI agent PATH=/usr/bin:/bin:/usr/sbin:/sbin, and `sh -l`
|
|
23
|
-
// only rebuilds it from /etc/paths*, so a `glen` installed under nvm or a
|
|
24
|
-
// custom npm prefix — a PATH entry that lives in ~/.zshrc — is unreachable.
|
|
14
|
+
// No KeepAlive: "Quit glen" must stay quit until the next login.
|
|
15
|
+
// GLEN_NODE/GLEN_CLI: launchd gives GUI agents a minimal PATH, so a glen under nvm is unreachable otherwise.
|
|
25
16
|
const launchAgentPlist = (executable) => `<?xml version="1.0" encoding="UTF-8"?>
|
|
26
17
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
27
18
|
<plist version="1.0">
|
|
@@ -48,8 +39,6 @@ const registerIndicator = async () => {
|
|
|
48
39
|
const written = await fromPromise(writeFile(path, launchAgentPlist(indicatorExecutable())));
|
|
49
40
|
if (!written.ok)
|
|
50
41
|
return err(`write ${path}: ${String(written.error)}`);
|
|
51
|
-
// bootstrap refuses a label that is already loaded, so clear it first. A
|
|
52
|
-
// missing service is the normal case on a fresh install, not an error.
|
|
53
42
|
runBin("launchctl", ["bootout", `${domain()}/${LABEL}`]);
|
|
54
43
|
const loaded = runBin("launchctl", ["bootstrap", domain(), path]);
|
|
55
44
|
if (!loaded.ok)
|
|
@@ -58,8 +47,6 @@ const registerIndicator = async () => {
|
|
|
58
47
|
};
|
|
59
48
|
const unregisterIndicator = async () => {
|
|
60
49
|
const path = launchAgentPath();
|
|
61
|
-
// No plist means nothing was ever registered — stay silent rather than
|
|
62
|
-
// shelling out, so a repeat uninstall touches nothing.
|
|
63
50
|
if (!(await fromPromise(access(path))).ok)
|
|
64
51
|
return ok(undefined);
|
|
65
52
|
runBin("launchctl", ["bootout", `${domain()}/${LABEL}`]);
|
|
@@ -72,9 +59,7 @@ const unregisterIndicator = async () => {
|
|
|
72
59
|
return ok(undefined);
|
|
73
60
|
};
|
|
74
61
|
const indicatorRunning = () => runBin("launchctl", ["print", `${domain()}/${LABEL}`]).ok;
|
|
75
|
-
//
|
|
76
|
-
// which the SessionStart hook already runs. Without a persisted opt-out that
|
|
77
|
-
// convergence would silently undo `glen indicator stop` on the next session.
|
|
62
|
+
// Persisted opt-out: doctor --auto re-converges the indicator every session and would otherwise undo `glen indicator stop`.
|
|
78
63
|
const optOutPath = () => process.env.GLEN_INDICATOR_OPTOUT_PATH ??
|
|
79
64
|
join(homedir(), ".glen", "indicator-disabled");
|
|
80
65
|
const indicatorOptedOut = async () => (await fromPromise(access(optOutPath()))).ok;
|
|
@@ -86,15 +71,10 @@ const setIndicatorOptOut = async (optedOut) => {
|
|
|
86
71
|
await fromPromise(mkdir(dirname(optOutPath()), { recursive: true }));
|
|
87
72
|
await fromPromise(writeFile(optOutPath(), ""));
|
|
88
73
|
};
|
|
89
|
-
// A registered indicator whose plist predates GLEN_CLI can't change modes: it
|
|
90
|
-
// falls back to a PATH lookup that launchd's environment often can't satisfy.
|
|
91
|
-
// Re-register it rather than leaving those users with a dead menu.
|
|
92
74
|
const launchAgentStale = async () => {
|
|
93
75
|
const current = await fromPromise(readFile(launchAgentPath(), "utf-8"));
|
|
94
76
|
return current.ok ? !current.value.includes("GLEN_CLI") : false;
|
|
95
77
|
};
|
|
96
|
-
// Best-effort convergence for installs and updates: never fights an explicit
|
|
97
|
-
// opt-out, never reports failure to a hook.
|
|
98
78
|
const ensureIndicatorRunning = async () => {
|
|
99
79
|
if (process.platform !== "darwin")
|
|
100
80
|
return false;
|
|
@@ -102,9 +82,7 @@ const ensureIndicatorRunning = async () => {
|
|
|
102
82
|
return false;
|
|
103
83
|
if (indicatorRunning() && !(await launchAgentStale()))
|
|
104
84
|
return true;
|
|
105
|
-
//
|
|
106
|
-
// failing to spawn it every login, silently. `glen doctor` then reports
|
|
107
|
-
// not-running with no way to tell why.
|
|
85
|
+
// Never register a missing binary: launchd would fail silently at every login.
|
|
108
86
|
if (!(await fromPromise(access(indicatorExecutable()))).ok)
|
|
109
87
|
return false;
|
|
110
88
|
return (await registerIndicator()).ok;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indicator-app.js","sourceRoot":"","sources":["../../src/_utils/indicator-app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAe,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,KAAK,GAAG,uBAAuB,CAAC;AAEtC,
|
|
1
|
+
{"version":3,"file":"indicator-app.js","sourceRoot":"","sources":["../../src/_utils/indicator-app.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,8 +2,6 @@ import { readFile } from "node:fs/promises";
|
|
|
2
2
|
import { homedir } from "node:os";
|
|
3
3
|
import { join } from "node:path";
|
|
4
4
|
import { fromPromise } from "./result.js";
|
|
5
|
-
// Stale means the indicator stopped writing — i.e. it is not running — which is
|
|
6
|
-
// a different problem from "running but hidden", and gets a different remedy.
|
|
7
5
|
const STALE_AFTER_MINUTES = 5;
|
|
8
6
|
const indicatorHealthPath = () => process.env.GLEN_INDICATOR_HEALTH_PATH ??
|
|
9
7
|
join(homedir(), ".glen", "indicator-health.json");
|
|
@@ -26,10 +24,6 @@ const readIndicatorHealth = async (now = Date.now()) => {
|
|
|
26
24
|
ageMinutes: Math.max(0, (now - checkedAt) / 60_000),
|
|
27
25
|
};
|
|
28
26
|
};
|
|
29
|
-
// One decision tree for both `glen doctor` and `glen indicator status`. A health
|
|
30
|
-
// report outlives the process that wrote it, so an unregistered indicator must
|
|
31
|
-
// never inherit its last "visible" — that reads as "it's fine" when nothing is
|
|
32
|
-
// on screen.
|
|
33
27
|
const visibilityLabel = (registered, health) => {
|
|
34
28
|
if (!registered)
|
|
35
29
|
return "not-running";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indicator-health.js","sourceRoot":"","sources":["../../src/_utils/indicator-health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAQ1C,
|
|
1
|
+
{"version":3,"file":"indicator-health.js","sourceRoot":"","sources":["../../src/_utils/indicator-health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAQ1C,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAE9B,MAAM,mBAAmB,GAAG,GAAW,EAAE,CACvC,OAAO,CAAC,GAAG,CAAC,0BAA0B;IACtC,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,uBAAuB,CAAC,CAAC;AAEpD,MAAM,mBAAmB,GAAG,KAAK,EAC/B,MAAc,IAAI,CAAC,GAAG,EAAE,EACS,EAAE;IACnC,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,mBAAmB,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;IACxE,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,MAAM,GAAG,MAAM,WAAW,CAC9B,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE,CAC/B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAY,CAAC,CAC1C,CACF,CAAC;IACF,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAuC,CAAC;IAC5D,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC7D,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7C,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,OAAO,KAAK,IAAI;QAC9B,MAAM,EAAE,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;QACjE,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,SAAS,CAAC,GAAG,MAAM,CAAC;KACpD,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CACtB,UAAmB,EACnB,MAA8B,EACtB,EAAE;IACV,IAAI,CAAC,UAAU;QAAE,OAAO,aAAa,CAAC;IACtC,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,IAAI,MAAM,CAAC,UAAU,GAAG,mBAAmB;QAAE,OAAO,OAAO,CAAC;IAC5D,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;AACpD,CAAC,CAAC;AAEF,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
import { GLEN_OWNER_PREFIX } from "./codex-hooks-merge.js";
|
|
2
|
-
// Under an hour post-install, silence is still "warming up", not a fault.
|
|
3
2
|
const FRESH_INSTALL_MS = 60 * 60 * 1000;
|
|
4
3
|
const diagnoseIngest = (input) => {
|
|
5
4
|
const entry = input.heartbeat[input.agent];
|
|
6
5
|
if (entry) {
|
|
7
6
|
const lastSuccessAt = entry.lastSuccessAt ?? null;
|
|
8
|
-
// Ran but no outcome (logged out / glen off / no completed turn) = idle,
|
|
9
|
-
// not failing — the hook plumbing is proven.
|
|
10
7
|
if (entry.lastOutcome === undefined)
|
|
11
8
|
return { state: "idle", lastSuccessAt };
|
|
12
9
|
return entry.lastOutcome === "success"
|
|
@@ -23,8 +20,6 @@ const UNTRUSTED_REMEDY = "open your agent and trust the glen hooks (/hooks), the
|
|
|
23
20
|
const PATH_REMEDY = "`glen` is not on your login shell's PATH — run `glen update` or add the npm global bin dir to PATH";
|
|
24
21
|
const TOPOLOGY_REMEDY = "no cause found on this machine — if you connect to this machine from a local agent (Codex --remote / SSH), hooks run HERE; if the agent process runs elsewhere, install glen there and run `glen doctor` on that machine as the connecting user";
|
|
25
22
|
const HOOK_QUERY_FAILED_REMEDY = "could not query codex hook trust (codex app-server failed) — run `glen install --agent codex` to re-register and re-trust the hooks";
|
|
26
|
-
// Narrows never-ingested-despite-registered-hooks to untrusted hook / PATH
|
|
27
|
-
// gap / topology mismatch. Deps injected so tests spawn nothing.
|
|
28
23
|
const codexNeverDifferential = async (deps) => {
|
|
29
24
|
const hooks = await deps.listHooks();
|
|
30
25
|
if (!hooks.ok)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ingest-diagnosis.js","sourceRoot":"","sources":["../../src/_utils/ingest-diagnosis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG3D,
|
|
1
|
+
{"version":3,"file":"ingest-diagnosis.js","sourceRoot":"","sources":["../../src/_utils/ingest-diagnosis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG3D,MAAM,gBAAgB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAIxC,MAAM,cAAc,GAAG,CAAC,KAQvB,EAAwD,EAAE;IACzD,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,IAAI,IAAI,CAAC;QAClD,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS;YACjC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;QAC1C,OAAO,KAAK,CAAC,WAAW,KAAK,SAAS;YACpC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE;YAChC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;IAC1C,CAAC;IAED,MAAM,aAAa,GAAG,KAAK,CAAC,WAAW;QACrC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC;QAC/B,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,KAAK,GACT,aAAa,KAAK,IAAI,IAAI,KAAK,CAAC,GAAG,GAAG,aAAa,GAAG,gBAAgB,CAAC;IACzE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;AAC3E,CAAC,CAAC;AAEF,MAAM,gBAAgB,GACpB,oHAAoH,CAAC;AACvH,MAAM,WAAW,GACf,oGAAoG,CAAC;AACvG,MAAM,eAAe,GACnB,iPAAiP,CAAC;AACpP,MAAM,wBAAwB,GAC5B,qIAAqI,CAAC;AAExI,MAAM,sBAAsB,GAAG,KAAK,EAAE,IAKrC,EAAqB,EAAE;IACtB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;IACrC,IAAI,CAAC,KAAK,CAAC,EAAE;QAAE,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAEjD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,MAAM,iBAAiB,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CACxC,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,MAAM,KAAK,MAAM;QACnB,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC;QACnD,CAAC,CAAC,WAAW,KAAK,SAAS,CAC9B,CAAC;IACF,IAAI,iBAAiB;QAAE,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAEvD,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACtE,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,EAAE;QAC3D,KAAK;QACL,iBAAiB;KAClB,CAAC,CAAC;IACH,IAAI,CAAC,YAAY,IAAI,CAAC,SAAS;QAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAE5D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAE1D,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -4,9 +4,6 @@ import { dirname, join } from "node:path";
|
|
|
4
4
|
const heartbeatPath = () => join(process.env.GLEN_STATE_PATH
|
|
5
5
|
? dirname(process.env.GLEN_STATE_PATH)
|
|
6
6
|
: join(homedir(), ".glen"), "ingest-heartbeat.json");
|
|
7
|
-
// An entry only counts as "a hook ran here" when it carries a real timestamp —
|
|
8
|
-
// a hand-edited or half-written file must not fake a heartbeat (the login-check
|
|
9
|
-
// and doctor gates both read "any entry exists" as proof the plumbing works).
|
|
10
7
|
const isEntry = (value) => !!value &&
|
|
11
8
|
typeof value === "object" &&
|
|
12
9
|
Number.isFinite(value.lastRunAt);
|
|
@@ -29,9 +26,7 @@ const write = async (map) => {
|
|
|
29
26
|
await writeFile(tmp, JSON.stringify(map));
|
|
30
27
|
await rename(tmp, path);
|
|
31
28
|
}
|
|
32
|
-
catch {
|
|
33
|
-
/* best-effort — a heartbeat write must never break a hook */
|
|
34
|
-
}
|
|
29
|
+
catch { }
|
|
35
30
|
};
|
|
36
31
|
const recordHeartbeatRun = async (agent) => {
|
|
37
32
|
const map = await readHeartbeat();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ingest-heartbeat.js","sourceRoot":"","sources":["../../src/_utils/ingest-heartbeat.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,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAQ1C,MAAM,aAAa,GAAG,GAAW,EAAE,CACjC,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,uBAAuB,CACxB,CAAC;AAEJ
|
|
1
|
+
{"version":3,"file":"ingest-heartbeat.js","sourceRoot":"","sources":["../../src/_utils/ingest-heartbeat.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,8 +11,14 @@ type CodexFilesSnapshot = {
|
|
|
11
11
|
readonly configPath: string;
|
|
12
12
|
readonly configExisted: boolean;
|
|
13
13
|
};
|
|
14
|
+
type JcodeFilesSnapshot = {
|
|
15
|
+
readonly configToml: FileSnapshot;
|
|
16
|
+
readonly promptOverlay: FileSnapshot;
|
|
17
|
+
readonly preferredTools: FileSnapshot;
|
|
18
|
+
readonly skillDirs: readonly string[];
|
|
19
|
+
};
|
|
14
20
|
type PendingInstall = {
|
|
15
|
-
readonly agents: readonly ("claude" | "codex" | "cursor" | "pi")[];
|
|
21
|
+
readonly agents: readonly ("claude" | "codex" | "cursor" | "pi" | "jcode")[];
|
|
16
22
|
readonly outcome: "completed" | "warnings" | "instructions";
|
|
17
23
|
readonly occurredAt: string;
|
|
18
24
|
};
|
|
@@ -25,6 +31,7 @@ type InstallReceipt = {
|
|
|
25
31
|
readonly statePaths: string[];
|
|
26
32
|
readonly pendingInstall?: PendingInstall;
|
|
27
33
|
readonly installedAt?: string;
|
|
34
|
+
readonly jcodeFiles?: JcodeFilesSnapshot;
|
|
28
35
|
};
|
|
29
36
|
declare const installReceipt: {
|
|
30
37
|
path: () => string;
|
|
@@ -32,6 +39,7 @@ declare const installReceipt: {
|
|
|
32
39
|
recordShellProfile: (path: string) => Promise<Result<void, unknown>>;
|
|
33
40
|
recordClaudeSettings: (snapshot: FileSnapshot) => Promise<Result<void, unknown>>;
|
|
34
41
|
recordCodexFiles: (snapshot: CodexFilesSnapshot) => Promise<Result<void, unknown>>;
|
|
42
|
+
recordJcodeFiles: (snapshot: JcodeFilesSnapshot) => Promise<Result<void, unknown>>;
|
|
35
43
|
recordGitHook: (snapshot: FileSnapshot) => Promise<Result<void, unknown>>;
|
|
36
44
|
recordPendingInstall: (pendingInstall: PendingInstall) => Promise<Result<void, unknown>>;
|
|
37
45
|
clearPendingInstall: () => Promise<Result<void, unknown>>;
|
|
@@ -24,7 +24,8 @@ const isFileSnapshot = (value) => {
|
|
|
24
24
|
const isInstallAgent = (value) => value === "claude" ||
|
|
25
25
|
value === "codex" ||
|
|
26
26
|
value === "cursor" ||
|
|
27
|
-
value === "pi"
|
|
27
|
+
value === "pi" ||
|
|
28
|
+
value === "jcode";
|
|
28
29
|
const isInstallOutcome = (value) => value === "completed" || value === "warnings" || value === "instructions";
|
|
29
30
|
const isIsoTimestamp = (value) => {
|
|
30
31
|
if (typeof value !== "string")
|
|
@@ -88,6 +89,16 @@ const parseReceipt = (raw) => {
|
|
|
88
89
|
const installedAt = isIsoTimestamp(value.installedAt)
|
|
89
90
|
? value.installedAt
|
|
90
91
|
: null;
|
|
92
|
+
const jcode = value.jcodeFiles;
|
|
93
|
+
const jcodeFiles = jcode &&
|
|
94
|
+
typeof jcode === "object" &&
|
|
95
|
+
isFileSnapshot(jcode.configToml) &&
|
|
96
|
+
isFileSnapshot(jcode.promptOverlay) &&
|
|
97
|
+
isFileSnapshot(jcode.preferredTools) &&
|
|
98
|
+
Array.isArray(jcode.skillDirs) &&
|
|
99
|
+
jcode.skillDirs.every((d) => typeof d === "string")
|
|
100
|
+
? jcode
|
|
101
|
+
: null;
|
|
91
102
|
return {
|
|
92
103
|
version: 1,
|
|
93
104
|
shellProfiles: value.shellProfiles,
|
|
@@ -97,6 +108,7 @@ const parseReceipt = (raw) => {
|
|
|
97
108
|
statePaths: value.statePaths,
|
|
98
109
|
...(pendingInstall ? { pendingInstall } : {}),
|
|
99
110
|
...(installedAt ? { installedAt } : {}),
|
|
111
|
+
...(jcodeFiles ? { jcodeFiles } : {}),
|
|
100
112
|
};
|
|
101
113
|
};
|
|
102
114
|
const read = async () => {
|
|
@@ -132,6 +144,10 @@ const recordCodexFiles = async (snapshot) => update((current) => ({
|
|
|
132
144
|
...current,
|
|
133
145
|
codexFiles: current.codexFiles ?? snapshot,
|
|
134
146
|
}));
|
|
147
|
+
const recordJcodeFiles = async (snapshot) => update((current) => ({
|
|
148
|
+
...current,
|
|
149
|
+
jcodeFiles: current.jcodeFiles ?? snapshot,
|
|
150
|
+
}));
|
|
135
151
|
const recordGitHook = async (snapshot) => update((current) => {
|
|
136
152
|
const prior = current.gitHooks.find((hook) => hook.path === snapshot.path);
|
|
137
153
|
const gitHooks = prior
|
|
@@ -146,8 +162,6 @@ const recordPendingInstall = async (pendingInstall) => update((current) => ({ ..
|
|
|
146
162
|
// or a machine that has never recorded a turn would look permanently fresh.
|
|
147
163
|
const recordInstalledAt = async (iso) => update((current) => current.installedAt ? current : { ...current, installedAt: iso });
|
|
148
164
|
const clearPendingInstall = async () => update(({ pendingInstall: _pendingInstall, ...current }) => current);
|
|
149
|
-
// Most durable source first: installedAt → pendingInstall (not yet POSTed) →
|
|
150
|
-
// receipt mtime (pre-installedAt receipts) → null (no receipt).
|
|
151
165
|
const installedAt = async () => {
|
|
152
166
|
const receipt = await read();
|
|
153
167
|
if (receipt?.installedAt)
|
|
@@ -172,6 +186,7 @@ const installReceipt = {
|
|
|
172
186
|
})),
|
|
173
187
|
recordClaudeSettings,
|
|
174
188
|
recordCodexFiles,
|
|
189
|
+
recordJcodeFiles,
|
|
175
190
|
recordGitHook,
|
|
176
191
|
recordPendingInstall,
|
|
177
192
|
clearPendingInstall,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-receipt.js","sourceRoot":"","sources":["../../src/_utils/install-receipt.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,KAAK,EACL,QAAQ,EACR,MAAM,EACN,IAAI,EACJ,MAAM,EACN,SAAS,GACV,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAe,WAAW,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"install-receipt.js","sourceRoot":"","sources":["../../src/_utils/install-receipt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
const jcodeBundleDir = () => process.env.GLEN_JCODE_BUNDLE_DIR ||
|
|
5
|
+
join(dirname(fileURLToPath(import.meta.url)), "..", "jcode");
|
|
6
|
+
const jcodeBundleVersion = () => {
|
|
7
|
+
try {
|
|
8
|
+
const manifest = JSON.parse(readFileSync(join(jcodeBundleDir(), "plugin.json"), "utf8"));
|
|
9
|
+
return typeof manifest.version === "string" ? manifest.version : null;
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
export { jcodeBundleDir, jcodeBundleVersion };
|
|
16
|
+
//# sourceMappingURL=jcode-bundle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jcode-bundle.js","sourceRoot":"","sources":["../../src/_utils/jcode-bundle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,cAAc,GAAG,GAAW,EAAE,CAClC,OAAO,CAAC,GAAG,CAAC,qBAAqB;IACjC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AAE/D,MAAM,kBAAkB,GAAG,GAAkB,EAAE;IAC7C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CACzB,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,CACnC,CAAC;QAC3B,OAAO,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { readJcodeTurn, readJcodeUserPrompt } from "./parse-jcode-session.js";
|
|
2
|
+
const payloadOf = (env) => {
|
|
3
|
+
try {
|
|
4
|
+
const parsed = JSON.parse(env.JCODE_HOOK_PAYLOAD ?? "");
|
|
5
|
+
return parsed !== null && typeof parsed === "object"
|
|
6
|
+
? parsed
|
|
7
|
+
: {};
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return {};
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
const str = (value) => typeof value === "string" && value ? value : null;
|
|
14
|
+
const field = (env, suffix, key) => str(env[`JCODE_HOOK_${suffix}`]) ?? str(payloadOf(env)[key]);
|
|
15
|
+
// jcode fires turn_end ~5-7s before the reply reaches the session file. Wait for it (the hook is detached),
|
|
16
|
+
// then fall back to the env's LAST_ASSISTANT_TEXT (first 4000 chars) so the turn is never dropped.
|
|
17
|
+
const DEFAULT_SESSION_RETRIES = 30;
|
|
18
|
+
const readJcodeStopEvent = async (env) => {
|
|
19
|
+
const sessionId = field(env, "SESSION_ID", "session_id");
|
|
20
|
+
if (!sessionId || field(env, "EVENT", "event") !== "turn_end")
|
|
21
|
+
return null;
|
|
22
|
+
const cwd = field(env, "CWD", "cwd") ?? process.cwd();
|
|
23
|
+
const model = field(env, "MODEL", "model");
|
|
24
|
+
const configured = Number(env.GLEN_JCODE_SESSION_RETRIES);
|
|
25
|
+
const retries = Number.isFinite(configured)
|
|
26
|
+
? configured
|
|
27
|
+
: DEFAULT_SESSION_RETRIES;
|
|
28
|
+
const base = {
|
|
29
|
+
hook_event_name: "Stop",
|
|
30
|
+
session_id: sessionId,
|
|
31
|
+
cwd,
|
|
32
|
+
...(model ? { model } : {}),
|
|
33
|
+
};
|
|
34
|
+
const turn = await readJcodeTurn(sessionId, { retries });
|
|
35
|
+
if (turn)
|
|
36
|
+
return {
|
|
37
|
+
...base,
|
|
38
|
+
prompt: turn.prompt,
|
|
39
|
+
text: turn.text,
|
|
40
|
+
turn_id: turn.turnId,
|
|
41
|
+
};
|
|
42
|
+
const fallbackText = field(env, "LAST_ASSISTANT_TEXT", "last_assistant_text");
|
|
43
|
+
const userPrompt = await readJcodeUserPrompt(sessionId);
|
|
44
|
+
if (userPrompt && fallbackText)
|
|
45
|
+
return {
|
|
46
|
+
...base,
|
|
47
|
+
prompt: userPrompt.prompt,
|
|
48
|
+
text: fallbackText,
|
|
49
|
+
turn_id: userPrompt.turnId,
|
|
50
|
+
};
|
|
51
|
+
return fallbackText ? { ...base, text: fallbackText } : base;
|
|
52
|
+
};
|
|
53
|
+
const jcodeSessionStartEvent = (env) => {
|
|
54
|
+
const sessionId = field(env, "SESSION_ID", "session_id");
|
|
55
|
+
if (!sessionId || field(env, "EVENT", "event") !== "session_start")
|
|
56
|
+
return null;
|
|
57
|
+
const source = field(env, "SOURCE", "source");
|
|
58
|
+
return {
|
|
59
|
+
hook_event_name: "SessionStart",
|
|
60
|
+
session_id: sessionId,
|
|
61
|
+
cwd: field(env, "CWD", "cwd") ?? process.cwd(),
|
|
62
|
+
...(source ? { source } : {}),
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
export { readJcodeStopEvent, jcodeSessionStartEvent };
|
|
66
|
+
//# sourceMappingURL=jcode-event.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jcode-event.js","sourceRoot":"","sources":["../../src/_utils/jcode-event.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// FROZEN: pinned by ingest.contract.test.ts. These exact strings are written into ~/.jcode/config.toml.
|
|
2
|
+
const GLEN_JCODE_HOOK_LINES = {
|
|
3
|
+
session_start: "glen session-start --agent jcode",
|
|
4
|
+
turn_end: "glen ingest --agent jcode",
|
|
5
|
+
};
|
|
6
|
+
export { GLEN_JCODE_HOOK_LINES };
|
|
7
|
+
//# sourceMappingURL=jcode-hook-lines.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jcode-hook-lines.js","sourceRoot":"","sources":["../../src/_utils/jcode-hook-lines.ts"],"names":[],"mappings":"AAAA,wGAAwG;AACxG,MAAM,qBAAqB,GAAG;IAC5B,aAAa,EAAE,kCAAkC;IACjD,QAAQ,EAAE,2BAA2B;CAC7B,CAAC;AAEX,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type Result } from "./result.js";
|
|
2
|
+
type HooksTable = Readonly<Record<string, string | readonly string[]>>;
|
|
3
|
+
type HookLines = Readonly<Record<string, string>>;
|
|
4
|
+
declare const readHooksTable: (toml: string) => Result<HooksTable, string>;
|
|
5
|
+
declare const hasHookLines: (table: HooksTable, lines: HookLines) => boolean;
|
|
6
|
+
declare const upsertHookLines: (toml: string, lines: HookLines) => Result<string, string>;
|
|
7
|
+
declare const removeHookLines: (toml: string, lines: HookLines) => Result<string, string>;
|
|
8
|
+
export { readHooksTable, hasHookLines, upsertHookLines, removeHookLines };
|