xiaotime 0.5.11 → 0.6.0
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/dist/ansi_tags.js +1 -4
- package/dist/ansi_tags.js.map +1 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +11 -50
- package/dist/auth.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +9 -11
- package/dist/config.js.map +1 -1
- package/dist/display.d.ts.map +1 -1
- package/dist/display.js +168 -210
- package/dist/display.js.map +1 -1
- package/dist/index.js +27 -25
- package/dist/index.js.map +1 -1
- package/dist/ink/App.d.ts +9 -0
- package/dist/ink/App.d.ts.map +1 -0
- package/dist/ink/App.js +152 -0
- package/dist/ink/App.js.map +1 -0
- package/dist/ink/execToolInk.d.ts +13 -0
- package/dist/ink/execToolInk.d.ts.map +1 -0
- package/dist/ink/execToolInk.js +239 -0
- package/dist/ink/execToolInk.js.map +1 -0
- package/dist/ink/runSessionInk.d.ts +2 -0
- package/dist/ink/runSessionInk.d.ts.map +1 -0
- package/dist/ink/runSessionInk.js +184 -0
- package/dist/ink/runSessionInk.js.map +1 -0
- package/dist/ink/store.d.ts +102 -0
- package/dist/ink/store.d.ts.map +1 -0
- package/dist/ink/store.js +144 -0
- package/dist/ink/store.js.map +1 -0
- package/dist/input_box.js +9 -16
- package/dist/input_box.js.map +1 -1
- package/dist/projectContext.d.ts +38 -0
- package/dist/projectContext.d.ts.map +1 -0
- package/dist/projectContext.js +135 -0
- package/dist/projectContext.js.map +1 -0
- package/dist/session.js +8 -14
- package/dist/session.js.map +1 -1
- package/dist/session_match.js +1 -4
- package/dist/session_match.js.map +1 -1
- package/dist/settings.js +8 -48
- package/dist/settings.js.map +1 -1
- package/dist/sidebar.js +13 -20
- package/dist/sidebar.js.map +1 -1
- package/dist/tool_result_client.js +6 -11
- package/dist/tool_result_client.js.map +1 -1
- package/dist/tools.d.ts +5 -0
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +33 -71
- package/dist/tools.js.map +1 -1
- package/dist/ui_state.d.ts +1 -0
- package/dist/ui_state.d.ts.map +1 -1
- package/dist/ui_state.js +33 -61
- package/dist/ui_state.js.map +1 -1
- package/dist/ws.d.ts.map +1 -1
- package/dist/ws.js +77 -111
- package/dist/ws.js.map +1 -1
- package/package.json +8 -2
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session store — the seam between the imperative WebSocket loop and the
|
|
3
|
+
* declarative Ink render tree.
|
|
4
|
+
*
|
|
5
|
+
* ws.ts emits events from outside React (socket callbacks). Rather than thread
|
|
6
|
+
* those through React state setters, the runner mutates this external store and
|
|
7
|
+
* the <App> reads it via useSyncExternalStore. One source of truth, one render
|
|
8
|
+
* path; Ink owns stdout so there is no hand-rolled ANSI to fight.
|
|
9
|
+
*
|
|
10
|
+
* Mutations are immutable (a fresh top-level object per change) so the snapshot
|
|
11
|
+
* reference is stable between changes — useSyncExternalStore needs that to
|
|
12
|
+
* avoid render loops.
|
|
13
|
+
*/
|
|
14
|
+
import { useSyncExternalStore } from "react";
|
|
15
|
+
let state = {
|
|
16
|
+
turns: [],
|
|
17
|
+
liveTool: null,
|
|
18
|
+
streaming: null,
|
|
19
|
+
busy: false,
|
|
20
|
+
connected: false,
|
|
21
|
+
botName: process.env.XIAOTIME_BOT_NAME || "Assistant",
|
|
22
|
+
sessionLabel: "",
|
|
23
|
+
statusNote: "connecting…",
|
|
24
|
+
pendingApproval: null,
|
|
25
|
+
};
|
|
26
|
+
const listeners = new Set();
|
|
27
|
+
function emit() {
|
|
28
|
+
for (const l of listeners)
|
|
29
|
+
l();
|
|
30
|
+
}
|
|
31
|
+
function set(patch) {
|
|
32
|
+
state = { ...state, ...patch };
|
|
33
|
+
emit();
|
|
34
|
+
}
|
|
35
|
+
// ── React binding ────────────────────────────────────────────────────────────
|
|
36
|
+
function subscribe(l) {
|
|
37
|
+
listeners.add(l);
|
|
38
|
+
return () => {
|
|
39
|
+
listeners.delete(l);
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
export function getSnapshot() {
|
|
43
|
+
return state;
|
|
44
|
+
}
|
|
45
|
+
export function useSession() {
|
|
46
|
+
return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
|
|
47
|
+
}
|
|
48
|
+
// ── mutators (called by the ws runner) ───────────────────────────────────────
|
|
49
|
+
export function setConnected(connected) {
|
|
50
|
+
set({ connected, statusNote: connected ? "connected" : "reconnecting…" });
|
|
51
|
+
}
|
|
52
|
+
export function setBotName(name) {
|
|
53
|
+
if (name)
|
|
54
|
+
set({ botName: name });
|
|
55
|
+
}
|
|
56
|
+
export function setSessionLabel(label) {
|
|
57
|
+
set({ sessionLabel: label });
|
|
58
|
+
}
|
|
59
|
+
/** User submitted a message: commit it to history and mark the agent busy. */
|
|
60
|
+
export function addUserTurn(text) {
|
|
61
|
+
set({ turns: [...state.turns, { kind: "user", text }], busy: true });
|
|
62
|
+
}
|
|
63
|
+
/** A text_delta arrived — append to the streaming reply. */
|
|
64
|
+
export function appendStreaming(delta) {
|
|
65
|
+
if (!delta)
|
|
66
|
+
return;
|
|
67
|
+
set({ streaming: (state.streaming ?? "") + delta });
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Commit the streamed reply so far as a bot turn (if any) without ending the
|
|
71
|
+
* turn. Called before a tool line so history order stays correct when the agent
|
|
72
|
+
* streams text, runs a tool, then streams more.
|
|
73
|
+
*/
|
|
74
|
+
export function flushStreaming() {
|
|
75
|
+
if (state.streaming != null) {
|
|
76
|
+
set({ turns: [...state.turns, { kind: "bot", text: state.streaming }], streaming: null });
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/** Turn finished (message_stop): commit any streamed reply, clear busy. */
|
|
80
|
+
export function endTurn() {
|
|
81
|
+
flushStreaming();
|
|
82
|
+
set({ busy: false });
|
|
83
|
+
}
|
|
84
|
+
/** A tool started executing — show it with a live spinner. */
|
|
85
|
+
export function startTool(tool) {
|
|
86
|
+
set({ liveTool: { ...tool, status: "running" } });
|
|
87
|
+
}
|
|
88
|
+
/** The live tool finished — commit it to history (✓ or error), with any diff. */
|
|
89
|
+
export function finishTool(result) {
|
|
90
|
+
const live = state.liveTool;
|
|
91
|
+
if (!live)
|
|
92
|
+
return;
|
|
93
|
+
const done = {
|
|
94
|
+
...live,
|
|
95
|
+
status: result?.error ? "error" : "done",
|
|
96
|
+
diff: result?.diff ?? live.diff,
|
|
97
|
+
};
|
|
98
|
+
set({ turns: [...state.turns, { kind: "tool", tool: done }], liveTool: null });
|
|
99
|
+
}
|
|
100
|
+
/** Surface a server/protocol error as a bot turn so it lands in history. */
|
|
101
|
+
export function pushError(message) {
|
|
102
|
+
set({
|
|
103
|
+
turns: [...state.turns, { kind: "bot", text: `⚠ ${message}` }],
|
|
104
|
+
streaming: null,
|
|
105
|
+
busy: false,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
// ── approval handshake (runner asks, the App answers) ────────────────────────
|
|
109
|
+
let approvalResolver = null;
|
|
110
|
+
/**
|
|
111
|
+
* Ask the user to approve a client-side tool. Resolves when the App calls
|
|
112
|
+
* resolveApproval(). Only one approval is in flight at a time (tool calls drain
|
|
113
|
+
* serially in the runner).
|
|
114
|
+
*/
|
|
115
|
+
export function requestApproval(p) {
|
|
116
|
+
return new Promise((resolve) => {
|
|
117
|
+
approvalResolver = resolve;
|
|
118
|
+
set({ pendingApproval: p });
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
/** The App resolves the pending approval with the user's decision. */
|
|
122
|
+
export function resolveApproval(decision) {
|
|
123
|
+
const resolve = approvalResolver;
|
|
124
|
+
approvalResolver = null;
|
|
125
|
+
set({ pendingApproval: null });
|
|
126
|
+
resolve?.(decision);
|
|
127
|
+
}
|
|
128
|
+
/** Test/diagnostic helper — reset to initial state. */
|
|
129
|
+
export function _resetForTest() {
|
|
130
|
+
approvalResolver = null;
|
|
131
|
+
state = {
|
|
132
|
+
turns: [],
|
|
133
|
+
liveTool: null,
|
|
134
|
+
streaming: null,
|
|
135
|
+
busy: false,
|
|
136
|
+
connected: false,
|
|
137
|
+
botName: process.env.XIAOTIME_BOT_NAME || "Assistant",
|
|
138
|
+
sessionLabel: "",
|
|
139
|
+
statusNote: "connecting…",
|
|
140
|
+
pendingApproval: null,
|
|
141
|
+
};
|
|
142
|
+
emit();
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/ink/store.ts"],"names":[],"mappings":"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"}
|
package/dist/input_box.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* Bordered input box — the visual layer for the `xiaotime dev` prompt.
|
|
4
3
|
*
|
|
@@ -18,13 +17,7 @@
|
|
|
18
17
|
* horizontal scroll, cursor column, narrow terminals — is unit-tested, leaving
|
|
19
18
|
* only a thin escape-sequence glue unverified.
|
|
20
19
|
*/
|
|
21
|
-
|
|
22
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
23
|
-
};
|
|
24
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
-
exports.renderInputBox = renderInputBox;
|
|
26
|
-
exports.installInputBoxRenderer = installInputBoxRenderer;
|
|
27
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
20
|
+
import chalk from "chalk";
|
|
28
21
|
// The box eats 4 columns of the width: │ <content> │ → border+space each side.
|
|
29
22
|
const BORDER_OVERHEAD = 4;
|
|
30
23
|
// Minimum sane width before we stop trying to draw a box.
|
|
@@ -34,7 +27,7 @@ const MIN_WIDTH = BORDER_OVERHEAD + 2;
|
|
|
34
27
|
* Pure — no I/O, no terminal state. Deterministic for a given (line, cursor,
|
|
35
28
|
* width, prompt).
|
|
36
29
|
*/
|
|
37
|
-
function renderInputBox(params) {
|
|
30
|
+
export function renderInputBox(params) {
|
|
38
31
|
const prompt = params.prompt ?? "you › ";
|
|
39
32
|
const width = Math.max(MIN_WIDTH, Math.floor(params.width) || 80);
|
|
40
33
|
const line = params.line ?? "";
|
|
@@ -54,19 +47,19 @@ function renderInputBox(params) {
|
|
|
54
47
|
// 1 (left │) + 1 (space) + prompt.length + (cursor - scrollStart)
|
|
55
48
|
const cursorCol = 1 + 1 + prompt.length + (cursor - scrollStart);
|
|
56
49
|
const dash = "─".repeat(width - 2);
|
|
57
|
-
const top =
|
|
58
|
-
const bottom =
|
|
50
|
+
const top = chalk.dim("╭" + dash + "╮");
|
|
51
|
+
const bottom = chalk.dim("╰" + dash + "╯");
|
|
59
52
|
// Middle: │ + space + (red "you ›" style prompt) + text + space + │
|
|
60
53
|
// The prompt's "you" gets the brand red; the "›" stays dim, matching the
|
|
61
54
|
// rest of the CLI. Everything is padded to a fixed width so the right wall
|
|
62
55
|
// lines up regardless of input length.
|
|
63
56
|
const styledPrompt = _stylePrompt(prompt);
|
|
64
|
-
const middle =
|
|
57
|
+
const middle = chalk.dim("│") +
|
|
65
58
|
" " +
|
|
66
59
|
styledPrompt +
|
|
67
60
|
visible +
|
|
68
61
|
" " +
|
|
69
|
-
|
|
62
|
+
chalk.dim("│");
|
|
70
63
|
return { top, middle, bottom, cursorCol };
|
|
71
64
|
}
|
|
72
65
|
/**
|
|
@@ -76,9 +69,9 @@ function renderInputBox(params) {
|
|
|
76
69
|
function _stylePrompt(prompt) {
|
|
77
70
|
const m = prompt.match(/^(\S+)(\s*›\s*)$/);
|
|
78
71
|
if (m) {
|
|
79
|
-
return
|
|
72
|
+
return chalk.bold.hex("#c0384b")(m[1]) + chalk.dim(m[2]);
|
|
80
73
|
}
|
|
81
|
-
return
|
|
74
|
+
return chalk.dim(prompt);
|
|
82
75
|
}
|
|
83
76
|
/**
|
|
84
77
|
* Make `rl` render its input inside the bordered box instead of a flat line.
|
|
@@ -92,7 +85,7 @@ function _stylePrompt(prompt) {
|
|
|
92
85
|
* The box is only painted between begin() and end() so readline's stray writes
|
|
93
86
|
* outside a prompt don't scribble a box mid-conversation.
|
|
94
87
|
*/
|
|
95
|
-
function installInputBoxRenderer(rl, opts) {
|
|
88
|
+
export function installInputBoxRenderer(rl, opts) {
|
|
96
89
|
const rlAny = rl;
|
|
97
90
|
const getWidth = opts?.width ?? (() => process.stdout.columns || 80);
|
|
98
91
|
const prompt = opts?.prompt ?? "you › ";
|
package/dist/input_box.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input_box.js","sourceRoot":"","sources":["../src/input_box.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"input_box.js","sourceRoot":"","sources":["../src/input_box.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export interface ProjectSkill {
|
|
2
|
+
/** Skill directory name — the slug the server keys parsing off. */
|
|
3
|
+
slug: string;
|
|
4
|
+
/** Raw SKILL.md content (bounded). */
|
|
5
|
+
content: string;
|
|
6
|
+
}
|
|
7
|
+
export interface ProjectContext {
|
|
8
|
+
/** Concatenated CLAUDE.md + .claude/CLAUDE.md (bounded), or "". */
|
|
9
|
+
claude_md: string;
|
|
10
|
+
skills: ProjectSkill[];
|
|
11
|
+
/** The resolved project root (for the client; not sent to the server). */
|
|
12
|
+
root: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Minimal frontmatter read for the slash-command menu — name + description only.
|
|
16
|
+
* Not authoritative (the server does the full YAML parse); single-line values.
|
|
17
|
+
*/
|
|
18
|
+
export declare function parseSkillMeta(content: string): {
|
|
19
|
+
name: string;
|
|
20
|
+
description: string;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Discover the project's CLAUDE.md + skills from a starting directory. Returns
|
|
24
|
+
* null when there is nothing to send (no project root content), so callers can
|
|
25
|
+
* omit the field from the connect message entirely.
|
|
26
|
+
*/
|
|
27
|
+
export declare function discoverProjectContext(startDir?: string): ProjectContext | null;
|
|
28
|
+
/**
|
|
29
|
+
* The `project_context` field for the connect message, or an empty object to
|
|
30
|
+
* spread when there's nothing to send. Excludes `root` (client-only).
|
|
31
|
+
*/
|
|
32
|
+
export declare function connectProjectContextField(startDir?: string): {
|
|
33
|
+
project_context: {
|
|
34
|
+
claude_md: string;
|
|
35
|
+
skills: ProjectSkill[];
|
|
36
|
+
};
|
|
37
|
+
} | Record<string, never>;
|
|
38
|
+
//# sourceMappingURL=projectContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projectContext.d.ts","sourceRoot":"","sources":["../src/projectContext.ts"],"names":[],"mappings":"AAiCA,MAAM,WAAW,YAAY;IAC3B,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,mEAAmE;IACnE,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAC;CACd;AA+DD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAMrF;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,GAAE,MAAsB,GAAG,cAAc,GAAG,IAAI,CAU9F;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,GAAE,MAAsB,GAC/B;IAAE,eAAe,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,YAAY,EAAE,CAAA;KAAE,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAI5F"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project-aware context discovery.
|
|
3
|
+
*
|
|
4
|
+
* Like Claude Code: on launch, search the working directory's project for its
|
|
5
|
+
* CLAUDE.md instructions and .claude/skills/, and hand them to the server on
|
|
6
|
+
* connect so the agent operates with the project's guidance + skills (merged
|
|
7
|
+
* with the server-side operator skills). The agent runs server-side, so the
|
|
8
|
+
* content travels in the connect message.
|
|
9
|
+
*
|
|
10
|
+
* Discovery is READ-ONLY and BULLETPROOF — any error returns null/empty so a
|
|
11
|
+
* malformed file or a permission hiccup can never break the connect handshake.
|
|
12
|
+
*
|
|
13
|
+
* We do NOT truncate real content — CLAUDE.md is the project's governance and a
|
|
14
|
+
* half-injected ruleset is worse than none. The size limits below are SAFETY
|
|
15
|
+
* CEILINGS only (prevent reading a pathological multi-MB file into one WS
|
|
16
|
+
* message); they sit far above any real CLAUDE.md / skill and never trip on
|
|
17
|
+
* normal content.
|
|
18
|
+
*
|
|
19
|
+
* The skill contract sends raw SKILL.md content keyed by slug; the server
|
|
20
|
+
* re-parses it with its own loader (shared/skills/loader.py::_parse_skill_md),
|
|
21
|
+
* so there is one parsing source of truth. parseSkillMeta() is a minimal
|
|
22
|
+
* client-side read of name/description for the slash-command menu only.
|
|
23
|
+
*/
|
|
24
|
+
import * as fs from "fs";
|
|
25
|
+
import * as path from "path";
|
|
26
|
+
// Safety ceilings only (abuse / runaway-file guard) — NOT content caps. Set far
|
|
27
|
+
// above any real CLAUDE.md or skill so normal project content is never trimmed.
|
|
28
|
+
const CLAUDE_MD_MAX = 2_000_000; // ~2 MB combined
|
|
29
|
+
const SKILL_BODY_MAX = 512_000; // ~512 KB per skill
|
|
30
|
+
const MAX_SKILLS = 100; // files
|
|
31
|
+
const MAX_WALK_UP = 40; // ancestor directories to scan for a project root
|
|
32
|
+
function readFileRaw(p) {
|
|
33
|
+
try {
|
|
34
|
+
if (!fs.existsSync(p) || !fs.statSync(p).isFile())
|
|
35
|
+
return null;
|
|
36
|
+
return fs.readFileSync(p, "utf-8");
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/** Walk up from startDir to the nearest dir with `.claude/` or `.git/`. */
|
|
43
|
+
function findProjectRoot(startDir) {
|
|
44
|
+
let dir = path.resolve(startDir);
|
|
45
|
+
for (let i = 0; i < MAX_WALK_UP; i++) {
|
|
46
|
+
if (fs.existsSync(path.join(dir, ".claude")) || fs.existsSync(path.join(dir, ".git"))) {
|
|
47
|
+
return dir;
|
|
48
|
+
}
|
|
49
|
+
const parent = path.dirname(dir);
|
|
50
|
+
if (parent === dir)
|
|
51
|
+
break; // filesystem root
|
|
52
|
+
dir = parent;
|
|
53
|
+
}
|
|
54
|
+
return path.resolve(startDir);
|
|
55
|
+
}
|
|
56
|
+
/** Root CLAUDE.md + .claude/CLAUDE.md, concatenated and bounded. */
|
|
57
|
+
function readClaudeMd(root) {
|
|
58
|
+
const parts = [];
|
|
59
|
+
for (const rel of ["CLAUDE.md", path.join(".claude", "CLAUDE.md")]) {
|
|
60
|
+
const c = readFileRaw(path.join(root, rel));
|
|
61
|
+
if (c && c.trim())
|
|
62
|
+
parts.push(c.trim());
|
|
63
|
+
}
|
|
64
|
+
let joined = parts.join("\n\n");
|
|
65
|
+
if (joined.length > CLAUDE_MD_MAX) {
|
|
66
|
+
joined = joined.slice(0, CLAUDE_MD_MAX) + "\n\n… (CLAUDE.md exceeded the safety ceiling)";
|
|
67
|
+
}
|
|
68
|
+
return joined;
|
|
69
|
+
}
|
|
70
|
+
/** .claude/skills/<slug>/SKILL.md → raw content, bounded by count + size. */
|
|
71
|
+
function discoverSkills(root) {
|
|
72
|
+
const skillsDir = path.join(root, ".claude", "skills");
|
|
73
|
+
const out = [];
|
|
74
|
+
let slugs;
|
|
75
|
+
try {
|
|
76
|
+
if (!fs.existsSync(skillsDir))
|
|
77
|
+
return out;
|
|
78
|
+
slugs = fs.readdirSync(skillsDir).sort();
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return out;
|
|
82
|
+
}
|
|
83
|
+
for (const slug of slugs) {
|
|
84
|
+
if (out.length >= MAX_SKILLS)
|
|
85
|
+
break;
|
|
86
|
+
const content = readFileRaw(path.join(skillsDir, slug, "SKILL.md"));
|
|
87
|
+
if (!content || !content.trim())
|
|
88
|
+
continue;
|
|
89
|
+
const capped = content.length > SKILL_BODY_MAX
|
|
90
|
+
? content.slice(0, SKILL_BODY_MAX) + "\n… (SKILL.md exceeded the safety ceiling)"
|
|
91
|
+
: content;
|
|
92
|
+
out.push({ slug, content: capped });
|
|
93
|
+
}
|
|
94
|
+
return out;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Minimal frontmatter read for the slash-command menu — name + description only.
|
|
98
|
+
* Not authoritative (the server does the full YAML parse); single-line values.
|
|
99
|
+
*/
|
|
100
|
+
export function parseSkillMeta(content) {
|
|
101
|
+
const m = content.match(/^---\n([\s\S]*?)\n---/);
|
|
102
|
+
const front = m ? m[1] : "";
|
|
103
|
+
const name = (front.match(/^name:\s*(.+)$/m)?.[1] ?? "").trim();
|
|
104
|
+
const description = (front.match(/^description:\s*(.+)$/m)?.[1] ?? "").trim();
|
|
105
|
+
return { name, description };
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Discover the project's CLAUDE.md + skills from a starting directory. Returns
|
|
109
|
+
* null when there is nothing to send (no project root content), so callers can
|
|
110
|
+
* omit the field from the connect message entirely.
|
|
111
|
+
*/
|
|
112
|
+
export function discoverProjectContext(startDir = process.cwd()) {
|
|
113
|
+
try {
|
|
114
|
+
const root = findProjectRoot(startDir);
|
|
115
|
+
const claude_md = readClaudeMd(root);
|
|
116
|
+
const skills = discoverSkills(root);
|
|
117
|
+
if (!claude_md && skills.length === 0)
|
|
118
|
+
return null;
|
|
119
|
+
return { claude_md, skills, root };
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return null; // discovery must never break the connect handshake
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* The `project_context` field for the connect message, or an empty object to
|
|
127
|
+
* spread when there's nothing to send. Excludes `root` (client-only).
|
|
128
|
+
*/
|
|
129
|
+
export function connectProjectContextField(startDir = process.cwd()) {
|
|
130
|
+
const ctx = discoverProjectContext(startDir);
|
|
131
|
+
if (!ctx)
|
|
132
|
+
return {};
|
|
133
|
+
return { project_context: { claude_md: ctx.claude_md, skills: ctx.skills } };
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=projectContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projectContext.js","sourceRoot":"","sources":["../src/projectContext.ts"],"names":[],"mappings":"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"}
|
package/dist/session.js
CHANGED
|
@@ -1,14 +1,8 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* Session management — REST calls to terminal-orchestrator.
|
|
4
3
|
*/
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
exports.listSessions = listSessions;
|
|
8
|
-
exports.getSession = getSession;
|
|
9
|
-
exports.archiveSession = archiveSession;
|
|
10
|
-
const config_js_1 = require("./config.js");
|
|
11
|
-
const auth_js_1 = require("./auth.js");
|
|
4
|
+
import { ORCHESTRATOR_URL } from "./config.js";
|
|
5
|
+
import { getToken } from "./auth.js";
|
|
12
6
|
// Module-private: only the session REST calls below read this. Not exported
|
|
13
7
|
// (no external consumer) — keeps the tenant resolution local to this client.
|
|
14
8
|
// No hardcoded tenant fallback (portability audit). The server resolves the
|
|
@@ -17,12 +11,12 @@ const auth_js_1 = require("./auth.js");
|
|
|
17
11
|
// never leaks one tenant's id into another operator's requests.
|
|
18
12
|
const TENANT_ID = process.env.XIAOTIME_TENANT_ID || "";
|
|
19
13
|
async function apiFetch(path, options = {}) {
|
|
20
|
-
const url = `${
|
|
14
|
+
const url = `${ORCHESTRATOR_URL}${path}`;
|
|
21
15
|
const res = await fetch(url, {
|
|
22
16
|
...options,
|
|
23
17
|
headers: {
|
|
24
18
|
"Content-Type": "application/json",
|
|
25
|
-
"x-api-key":
|
|
19
|
+
"x-api-key": getToken(),
|
|
26
20
|
...(options.headers || {}),
|
|
27
21
|
},
|
|
28
22
|
});
|
|
@@ -32,7 +26,7 @@ async function apiFetch(path, options = {}) {
|
|
|
32
26
|
}
|
|
33
27
|
return res.json();
|
|
34
28
|
}
|
|
35
|
-
async function createSession(sessionName, cwd = process.cwd()) {
|
|
29
|
+
export async function createSession(sessionName, cwd = process.cwd()) {
|
|
36
30
|
return apiFetch("/terminal/sessions", {
|
|
37
31
|
method: "POST",
|
|
38
32
|
body: JSON.stringify({
|
|
@@ -42,13 +36,13 @@ async function createSession(sessionName, cwd = process.cwd()) {
|
|
|
42
36
|
}),
|
|
43
37
|
});
|
|
44
38
|
}
|
|
45
|
-
async function listSessions() {
|
|
39
|
+
export async function listSessions() {
|
|
46
40
|
return apiFetch(`/terminal/sessions?tenant_id=${TENANT_ID}`);
|
|
47
41
|
}
|
|
48
|
-
async function getSession(sessionId) {
|
|
42
|
+
export async function getSession(sessionId) {
|
|
49
43
|
return apiFetch(`/terminal/sessions/${sessionId}`);
|
|
50
44
|
}
|
|
51
|
-
async function archiveSession(sessionId) {
|
|
45
|
+
export async function archiveSession(sessionId) {
|
|
52
46
|
await apiFetch(`/terminal/sessions/${sessionId}`, { method: "DELETE" });
|
|
53
47
|
}
|
|
54
48
|
//# sourceMappingURL=session.js.map
|
package/dist/session.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,4EAA4E;AAC5E,6EAA6E;AAC7E,4EAA4E;AAC5E,4EAA4E;AAC5E,8EAA8E;AAC9E,gEAAgE;AAChE,MAAM,SAAS,GACb,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAAC;AAcvC,KAAK,UAAU,QAAQ,CAAC,IAAY,EAAE,UAAuB,EAAE;IAC7D,MAAM,GAAG,GAAG,GAAG,gBAAgB,GAAG,IAAI,EAAE,CAAC;IACzC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,GAAG,OAAO;QACV,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,WAAW,EAAE,QAAQ,EAAE;YACvB,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;SAC3B;KACF,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,WAAoB,EACpB,MAAc,OAAO,CAAC,GAAG,EAAE;IAE3B,OAAO,QAAQ,CAAC,oBAAoB,EAAE;QACpC,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,YAAY,EAAE,WAAW,IAAI,IAAI;YACjC,SAAS,EAAE,SAAS;YACpB,GAAG;SACJ,CAAC;KACH,CAAqB,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,OAAO,QAAQ,CAAC,gCAAgC,SAAS,EAAE,CAAuB,CAAC;AACrF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,SAAiB;IAChD,OAAO,QAAQ,CAAC,sBAAsB,SAAS,EAAE,CAAqB,CAAC;AACzE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,SAAiB;IACpD,MAAM,QAAQ,CAAC,sBAAsB,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC1E,CAAC"}
|
package/dist/session_match.js
CHANGED
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.matchSession = matchSession;
|
|
4
|
-
function matchSession(sessions, nameOrId) {
|
|
1
|
+
export function matchSession(sessions, nameOrId) {
|
|
5
2
|
return (sessions.find((s) => s.session_name === nameOrId) ||
|
|
6
3
|
sessions.find((s) => s.id === nameOrId) ||
|
|
7
4
|
sessions.find((s) => s.id.startsWith(nameOrId)));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session_match.js","sourceRoot":"","sources":["../src/session_match.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"session_match.js","sourceRoot":"","sources":["../src/session_match.ts"],"names":[],"mappings":"AAkBA,MAAM,UAAU,YAAY,CAC1B,QAAa,EACb,QAAgB;IAEhB,OAAO,CACL,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,QAAQ,CAAC;QACjD,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC;QACvC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAChD,CAAC;AACJ,CAAC"}
|
package/dist/settings.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* Per-user CLI settings + approval allowlist.
|
|
4
3
|
*
|
|
@@ -37,48 +36,9 @@
|
|
|
37
36
|
* managed-task envelope; this is a UX gate for client-side tool
|
|
38
37
|
* approvals. Two allowlists, two audiences, two update cadences.
|
|
39
38
|
*/
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
44
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
45
|
-
}
|
|
46
|
-
Object.defineProperty(o, k2, desc);
|
|
47
|
-
}) : (function(o, m, k, k2) {
|
|
48
|
-
if (k2 === undefined) k2 = k;
|
|
49
|
-
o[k2] = m[k];
|
|
50
|
-
}));
|
|
51
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
52
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
53
|
-
}) : function(o, v) {
|
|
54
|
-
o["default"] = v;
|
|
55
|
-
});
|
|
56
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
57
|
-
var ownKeys = function(o) {
|
|
58
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
59
|
-
var ar = [];
|
|
60
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
61
|
-
return ar;
|
|
62
|
-
};
|
|
63
|
-
return ownKeys(o);
|
|
64
|
-
};
|
|
65
|
-
return function (mod) {
|
|
66
|
-
if (mod && mod.__esModule) return mod;
|
|
67
|
-
var result = {};
|
|
68
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
69
|
-
__setModuleDefault(result, mod);
|
|
70
|
-
return result;
|
|
71
|
-
};
|
|
72
|
-
})();
|
|
73
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
74
|
-
exports._settingsPath = _settingsPath;
|
|
75
|
-
exports.loadAllowlist = loadAllowlist;
|
|
76
|
-
exports.appendAllowlist = appendAllowlist;
|
|
77
|
-
exports.derivePattern = derivePattern;
|
|
78
|
-
exports.matchAllowlist = matchAllowlist;
|
|
79
|
-
const fs = __importStar(require("fs"));
|
|
80
|
-
const path = __importStar(require("path"));
|
|
81
|
-
const os = __importStar(require("os"));
|
|
39
|
+
import * as fs from "fs";
|
|
40
|
+
import * as path from "path";
|
|
41
|
+
import * as os from "os";
|
|
82
42
|
const ALLOWLIST_TOOLS = new Set([
|
|
83
43
|
"shell_command",
|
|
84
44
|
"write_file",
|
|
@@ -90,7 +50,7 @@ const ALLOWLIST_TOOLS = new Set([
|
|
|
90
50
|
* tests to avoid touching the real `~/.xiaotime/settings.json`).
|
|
91
51
|
* Default: `~/.xiaotime/settings.json`.
|
|
92
52
|
*/
|
|
93
|
-
function _settingsPath() {
|
|
53
|
+
export function _settingsPath() {
|
|
94
54
|
return (process.env.XIAOTIME_SETTINGS_PATH
|
|
95
55
|
?? path.join(os.homedir(), ".xiaotime", "settings.json"));
|
|
96
56
|
}
|
|
@@ -108,7 +68,7 @@ function _settingsDir() {
|
|
|
108
68
|
* Never throws. The CLI must remain usable when the user has a
|
|
109
69
|
* corrupted local config (ISC-6509-007).
|
|
110
70
|
*/
|
|
111
|
-
function loadAllowlist() {
|
|
71
|
+
export function loadAllowlist() {
|
|
112
72
|
if (!fs.existsSync(_settingsPath()))
|
|
113
73
|
return [];
|
|
114
74
|
let raw;
|
|
@@ -145,7 +105,7 @@ function loadAllowlist() {
|
|
|
145
105
|
* settings.json with mode 0600. Idempotent on duplicate
|
|
146
106
|
* (tool, pattern) — duplicate appends are silently dropped.
|
|
147
107
|
*/
|
|
148
|
-
function appendAllowlist(entry) {
|
|
108
|
+
export function appendAllowlist(entry) {
|
|
149
109
|
const existing = loadAllowlist();
|
|
150
110
|
const isDup = existing.some((e) => e.tool === entry.tool && e.pattern === entry.pattern);
|
|
151
111
|
if (isDup)
|
|
@@ -196,7 +156,7 @@ function appendAllowlist(entry) {
|
|
|
196
156
|
* the tree match. For git_commit, the literal `"*"` allowlists all
|
|
197
157
|
* future commits.
|
|
198
158
|
*/
|
|
199
|
-
function derivePattern(tool, input) {
|
|
159
|
+
export function derivePattern(tool, input) {
|
|
200
160
|
if (tool === "shell_command") {
|
|
201
161
|
const cmd = String(input.command ?? "").trim();
|
|
202
162
|
if (!cmd)
|
|
@@ -262,7 +222,7 @@ function derivePattern(tool, input) {
|
|
|
262
222
|
* even if patterns coincidentally match — the tool field is checked
|
|
263
223
|
* first.
|
|
264
224
|
*/
|
|
265
|
-
function matchAllowlist(tool, input, allowlist) {
|
|
225
|
+
export function matchAllowlist(tool, input, allowlist) {
|
|
266
226
|
for (const entry of allowlist) {
|
|
267
227
|
if (entry.tool !== tool)
|
|
268
228
|
continue;
|
package/dist/settings.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"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"}
|