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.
Files changed (57) hide show
  1. package/dist/ansi_tags.js +1 -4
  2. package/dist/ansi_tags.js.map +1 -1
  3. package/dist/auth.d.ts.map +1 -1
  4. package/dist/auth.js +11 -50
  5. package/dist/auth.js.map +1 -1
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/config.js +9 -11
  8. package/dist/config.js.map +1 -1
  9. package/dist/display.d.ts.map +1 -1
  10. package/dist/display.js +168 -210
  11. package/dist/display.js.map +1 -1
  12. package/dist/index.js +27 -25
  13. package/dist/index.js.map +1 -1
  14. package/dist/ink/App.d.ts +9 -0
  15. package/dist/ink/App.d.ts.map +1 -0
  16. package/dist/ink/App.js +152 -0
  17. package/dist/ink/App.js.map +1 -0
  18. package/dist/ink/execToolInk.d.ts +13 -0
  19. package/dist/ink/execToolInk.d.ts.map +1 -0
  20. package/dist/ink/execToolInk.js +239 -0
  21. package/dist/ink/execToolInk.js.map +1 -0
  22. package/dist/ink/runSessionInk.d.ts +2 -0
  23. package/dist/ink/runSessionInk.d.ts.map +1 -0
  24. package/dist/ink/runSessionInk.js +184 -0
  25. package/dist/ink/runSessionInk.js.map +1 -0
  26. package/dist/ink/store.d.ts +102 -0
  27. package/dist/ink/store.d.ts.map +1 -0
  28. package/dist/ink/store.js +144 -0
  29. package/dist/ink/store.js.map +1 -0
  30. package/dist/input_box.js +9 -16
  31. package/dist/input_box.js.map +1 -1
  32. package/dist/projectContext.d.ts +38 -0
  33. package/dist/projectContext.d.ts.map +1 -0
  34. package/dist/projectContext.js +135 -0
  35. package/dist/projectContext.js.map +1 -0
  36. package/dist/session.js +8 -14
  37. package/dist/session.js.map +1 -1
  38. package/dist/session_match.js +1 -4
  39. package/dist/session_match.js.map +1 -1
  40. package/dist/settings.js +8 -48
  41. package/dist/settings.js.map +1 -1
  42. package/dist/sidebar.js +13 -20
  43. package/dist/sidebar.js.map +1 -1
  44. package/dist/tool_result_client.js +6 -11
  45. package/dist/tool_result_client.js.map +1 -1
  46. package/dist/tools.d.ts +5 -0
  47. package/dist/tools.d.ts.map +1 -1
  48. package/dist/tools.js +33 -71
  49. package/dist/tools.js.map +1 -1
  50. package/dist/ui_state.d.ts +1 -0
  51. package/dist/ui_state.d.ts.map +1 -1
  52. package/dist/ui_state.js +33 -61
  53. package/dist/ui_state.js.map +1 -1
  54. package/dist/ws.d.ts.map +1 -1
  55. package/dist/ws.js +77 -111
  56. package/dist/ws.js.map +1 -1
  57. 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
- var __importDefault = (this && this.__importDefault) || function (mod) {
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 = chalk_1.default.dim("╭" + dash + "╮");
58
- const bottom = chalk_1.default.dim("╰" + dash + "╯");
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 = chalk_1.default.dim("│") +
57
+ const middle = chalk.dim("│") +
65
58
  " " +
66
59
  styledPrompt +
67
60
  visible +
68
61
  " " +
69
- chalk_1.default.dim("│");
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 chalk_1.default.bold.hex("#c0384b")(m[1]) + chalk_1.default.dim(m[2]);
72
+ return chalk.bold.hex("#c0384b")(m[1]) + chalk.dim(m[2]);
80
73
  }
81
- return chalk_1.default.dim(prompt);
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 › ";
@@ -1 +1 @@
1
- {"version":3,"file":"input_box.js","sourceRoot":"","sources":["../src/input_box.ts"],"names":[],"mappings":"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"}
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
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.createSession = createSession;
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 = `${config_js_1.ORCHESTRATOR_URL}${path}`;
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": (0, auth_js_1.getToken)(),
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
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":";AAAA;;GAEG;;AA2CH,sCAYC;AAED,oCAEC;AAED,gCAEC;AAED,wCAEC;AAjED,2CAA+C;AAC/C,uCAAqC;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,4BAAgB,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,IAAA,kBAAQ,GAAE;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;AAEM,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;AAEM,KAAK,UAAU,YAAY;IAChC,OAAO,QAAQ,CAAC,gCAAgC,SAAS,EAAE,CAAuB,CAAC;AACrF,CAAC;AAEM,KAAK,UAAU,UAAU,CAAC,SAAiB;IAChD,OAAO,QAAQ,CAAC,sBAAsB,SAAS,EAAE,CAAqB,CAAC;AACzE,CAAC;AAEM,KAAK,UAAU,cAAc,CAAC,SAAiB;IACpD,MAAM,QAAQ,CAAC,sBAAsB,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC1E,CAAC"}
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"}
@@ -1,7 +1,4 @@
1
- "use strict";
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":";;AAkBA,oCASC;AATD,SAAgB,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"}
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
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
41
- if (k2 === undefined) k2 = k;
42
- var desc = Object.getOwnPropertyDescriptor(m, k);
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;
@@ -1 +1 @@
1
- {"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"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"}