pulseed 0.1.3 → 0.1.4

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 (127) hide show
  1. package/dist/chat/chat-history.d.ts +80 -0
  2. package/dist/chat/chat-history.d.ts.map +1 -0
  3. package/dist/chat/chat-history.js +70 -0
  4. package/dist/chat/chat-history.js.map +1 -0
  5. package/dist/chat/chat-runner.d.ts +46 -0
  6. package/dist/chat/chat-runner.d.ts.map +1 -0
  7. package/dist/chat/chat-runner.js +141 -0
  8. package/dist/chat/chat-runner.js.map +1 -0
  9. package/dist/chat/escalation.d.ts +30 -0
  10. package/dist/chat/escalation.d.ts.map +1 -0
  11. package/dist/chat/escalation.js +53 -0
  12. package/dist/chat/escalation.js.map +1 -0
  13. package/dist/cli/commands/chat.d.ts +3 -0
  14. package/dist/cli/commands/chat.d.ts.map +1 -0
  15. package/dist/cli/commands/chat.js +148 -0
  16. package/dist/cli/commands/chat.js.map +1 -0
  17. package/dist/cli/commands/daemon.d.ts.map +1 -1
  18. package/dist/cli/commands/daemon.js +77 -14
  19. package/dist/cli/commands/daemon.js.map +1 -1
  20. package/dist/cli/commands/doctor.d.ts +19 -0
  21. package/dist/cli/commands/doctor.d.ts.map +1 -0
  22. package/dist/cli/commands/doctor.js +203 -0
  23. package/dist/cli/commands/doctor.js.map +1 -0
  24. package/dist/cli/commands/goal-utils.d.ts.map +1 -1
  25. package/dist/cli/commands/goal-utils.js +1 -0
  26. package/dist/cli/commands/goal-utils.js.map +1 -1
  27. package/dist/cli/commands/install.d.ts +16 -0
  28. package/dist/cli/commands/install.d.ts.map +1 -0
  29. package/dist/cli/commands/install.js +153 -0
  30. package/dist/cli/commands/install.js.map +1 -0
  31. package/dist/cli/commands/logs.d.ts +2 -0
  32. package/dist/cli/commands/logs.d.ts.map +1 -0
  33. package/dist/cli/commands/logs.js +201 -0
  34. package/dist/cli/commands/logs.js.map +1 -0
  35. package/dist/cli/commands/notify.d.ts +2 -0
  36. package/dist/cli/commands/notify.d.ts.map +1 -0
  37. package/dist/cli/commands/notify.js +277 -0
  38. package/dist/cli/commands/notify.js.map +1 -0
  39. package/dist/cli/setup.d.ts.map +1 -1
  40. package/dist/cli/setup.js +14 -4
  41. package/dist/cli/setup.js.map +1 -1
  42. package/dist/cli/utils.d.ts.map +1 -1
  43. package/dist/cli/utils.js +10 -0
  44. package/dist/cli/utils.js.map +1 -1
  45. package/dist/cli-runner.d.ts.map +1 -1
  46. package/dist/cli-runner.js +43 -2
  47. package/dist/cli-runner.js.map +1 -1
  48. package/dist/core-loop.d.ts +1 -1
  49. package/dist/core-loop.d.ts.map +1 -1
  50. package/dist/core-loop.js +7 -3
  51. package/dist/core-loop.js.map +1 -1
  52. package/dist/drive/drive-system.d.ts.map +1 -1
  53. package/dist/drive/drive-system.js +11 -2
  54. package/dist/drive/drive-system.js.map +1 -1
  55. package/dist/execution/issue-context-fetcher.d.ts +19 -0
  56. package/dist/execution/issue-context-fetcher.d.ts.map +1 -0
  57. package/dist/execution/issue-context-fetcher.js +73 -0
  58. package/dist/execution/issue-context-fetcher.js.map +1 -0
  59. package/dist/execution/session-manager.d.ts.map +1 -1
  60. package/dist/execution/session-manager.js +3 -0
  61. package/dist/execution/session-manager.js.map +1 -1
  62. package/dist/execution/task-generation.d.ts.map +1 -1
  63. package/dist/execution/task-generation.js +8 -0
  64. package/dist/execution/task-generation.js.map +1 -1
  65. package/dist/execution/task-lifecycle.d.ts.map +1 -1
  66. package/dist/execution/task-lifecycle.js +4 -1
  67. package/dist/execution/task-lifecycle.js.map +1 -1
  68. package/dist/execution/task-prompt-builder.d.ts.map +1 -1
  69. package/dist/execution/task-prompt-builder.js +30 -1
  70. package/dist/execution/task-prompt-builder.js.map +1 -1
  71. package/dist/execution/task-verifier.d.ts.map +1 -1
  72. package/dist/execution/task-verifier.js +16 -2
  73. package/dist/execution/task-verifier.js.map +1 -1
  74. package/dist/goal/goal-refiner.js +1 -1
  75. package/dist/goal/goal-refiner.js.map +1 -1
  76. package/dist/goal/goal-tree-manager.d.ts.map +1 -1
  77. package/dist/goal/goal-tree-manager.js +6 -0
  78. package/dist/goal/goal-tree-manager.js.map +1 -1
  79. package/dist/goal/refiner-prompts.d.ts.map +1 -1
  80. package/dist/goal/refiner-prompts.js +5 -1
  81. package/dist/goal/refiner-prompts.js.map +1 -1
  82. package/dist/goal/tree-loop-orchestrator.d.ts +3 -1
  83. package/dist/goal/tree-loop-orchestrator.d.ts.map +1 -1
  84. package/dist/goal/tree-loop-orchestrator.js +4 -4
  85. package/dist/goal/tree-loop-orchestrator.js.map +1 -1
  86. package/dist/loop/core-loop-phases.d.ts +1 -1
  87. package/dist/loop/core-loop-phases.d.ts.map +1 -1
  88. package/dist/loop/core-loop-phases.js +9 -3
  89. package/dist/loop/core-loop-phases.js.map +1 -1
  90. package/dist/loop/tree-loop-runner.d.ts.map +1 -1
  91. package/dist/loop/tree-loop-runner.js +10 -7
  92. package/dist/loop/tree-loop-runner.js.map +1 -1
  93. package/dist/observation/context-provider.d.ts +10 -0
  94. package/dist/observation/context-provider.d.ts.map +1 -1
  95. package/dist/observation/context-provider.js +35 -0
  96. package/dist/observation/context-provider.js.map +1 -1
  97. package/dist/observation/observation-engine.d.ts.map +1 -1
  98. package/dist/observation/observation-engine.js +1 -0
  99. package/dist/observation/observation-engine.js.map +1 -1
  100. package/dist/observation/observation-llm.d.ts.map +1 -1
  101. package/dist/observation/observation-llm.js +5 -1
  102. package/dist/observation/observation-llm.js.map +1 -1
  103. package/dist/observation/workspace-context.d.ts.map +1 -1
  104. package/dist/observation/workspace-context.js +59 -12
  105. package/dist/observation/workspace-context.js.map +1 -1
  106. package/dist/runtime/hook-manager.d.ts.map +1 -1
  107. package/dist/runtime/hook-manager.js +7 -0
  108. package/dist/runtime/hook-manager.js.map +1 -1
  109. package/dist/tui/entry.d.ts.map +1 -1
  110. package/dist/tui/entry.js +19 -1
  111. package/dist/tui/entry.js.map +1 -1
  112. package/dist/types/daemon.js +1 -1
  113. package/dist/types/daemon.js.map +1 -1
  114. package/dist/types/goal-refiner.d.ts +3 -0
  115. package/dist/types/goal-refiner.d.ts.map +1 -1
  116. package/dist/types/goal-refiner.js +1 -0
  117. package/dist/types/goal-refiner.js.map +1 -1
  118. package/dist/types/mcp.d.ts +6 -6
  119. package/dist/types/session.d.ts +4 -4
  120. package/dist/types/session.d.ts.map +1 -1
  121. package/dist/types/session.js +1 -0
  122. package/dist/types/session.js.map +1 -1
  123. package/dist/utils/execFileNoThrow.d.ts +20 -0
  124. package/dist/utils/execFileNoThrow.d.ts.map +1 -0
  125. package/dist/utils/execFileNoThrow.js +33 -0
  126. package/dist/utils/execFileNoThrow.js.map +1 -0
  127. package/package.json +1 -1
@@ -0,0 +1,80 @@
1
+ import { z } from "zod";
2
+ import type { StateManager } from "../state-manager.js";
3
+ export declare const ChatMessageSchema: z.ZodObject<{
4
+ role: z.ZodEnum<["user", "assistant"]>;
5
+ content: z.ZodString;
6
+ timestamp: z.ZodString;
7
+ turnIndex: z.ZodNumber;
8
+ }, "strip", z.ZodTypeAny, {
9
+ timestamp: string;
10
+ content: string;
11
+ role: "user" | "assistant";
12
+ turnIndex: number;
13
+ }, {
14
+ timestamp: string;
15
+ content: string;
16
+ role: "user" | "assistant";
17
+ turnIndex: number;
18
+ }>;
19
+ export type ChatMessage = z.infer<typeof ChatMessageSchema>;
20
+ export declare const ChatSessionSchema: z.ZodObject<{
21
+ id: z.ZodString;
22
+ cwd: z.ZodString;
23
+ createdAt: z.ZodString;
24
+ messages: z.ZodArray<z.ZodObject<{
25
+ role: z.ZodEnum<["user", "assistant"]>;
26
+ content: z.ZodString;
27
+ timestamp: z.ZodString;
28
+ turnIndex: z.ZodNumber;
29
+ }, "strip", z.ZodTypeAny, {
30
+ timestamp: string;
31
+ content: string;
32
+ role: "user" | "assistant";
33
+ turnIndex: number;
34
+ }, {
35
+ timestamp: string;
36
+ content: string;
37
+ role: "user" | "assistant";
38
+ turnIndex: number;
39
+ }>, "many">;
40
+ compactionSummary: z.ZodOptional<z.ZodString>;
41
+ }, "strip", z.ZodTypeAny, {
42
+ id: string;
43
+ cwd: string;
44
+ createdAt: string;
45
+ messages: {
46
+ timestamp: string;
47
+ content: string;
48
+ role: "user" | "assistant";
49
+ turnIndex: number;
50
+ }[];
51
+ compactionSummary?: string | undefined;
52
+ }, {
53
+ id: string;
54
+ cwd: string;
55
+ createdAt: string;
56
+ messages: {
57
+ timestamp: string;
58
+ content: string;
59
+ role: "user" | "assistant";
60
+ turnIndex: number;
61
+ }[];
62
+ compactionSummary?: string | undefined;
63
+ }>;
64
+ export type ChatSession = z.infer<typeof ChatSessionSchema>;
65
+ export declare class ChatHistory {
66
+ private readonly stateManager;
67
+ private readonly sessionId;
68
+ private readonly session;
69
+ constructor(stateManager: StateManager, sessionId: string, cwd: string);
70
+ /** Append a user message and persist to disk BEFORE adapter execution. */
71
+ appendUserMessage(content: string): Promise<void>;
72
+ /** Append an assistant message. Fire-and-forget persistence is acceptable here. */
73
+ appendAssistantMessage(content: string): void;
74
+ /** Clear all messages and persist the empty state. */
75
+ clear(): void;
76
+ getMessages(): ChatMessage[];
77
+ getSessionData(): ChatSession;
78
+ persist(): Promise<void>;
79
+ }
80
+ //# sourceMappingURL=chat-history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-history.d.ts","sourceRoot":"","sources":["../../src/chat/chat-history.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAIxD,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;EAK5B,CAAC;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAM5B,CAAC;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAI5D,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;gBAE1B,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IAWtE,0EAA0E;IACpE,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUvD,mFAAmF;IACnF,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAU7C,sDAAsD;IACtD,KAAK,IAAI,IAAI;IAKb,WAAW,IAAI,WAAW,EAAE;IAI5B,cAAc,IAAI,WAAW;IAIvB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAM/B"}
@@ -0,0 +1,70 @@
1
+ // ─── ChatHistory ───
2
+ //
3
+ // Manages conversation history for a chat session.
4
+ // Persists via StateManager.writeRaw (persist-before-execute principle).
5
+ import { z } from "zod";
6
+ // ─── Schemas ───
7
+ export const ChatMessageSchema = z.object({
8
+ role: z.enum(["user", "assistant"]),
9
+ content: z.string(),
10
+ timestamp: z.string(), // ISO 8601
11
+ turnIndex: z.number().int().min(0),
12
+ });
13
+ export const ChatSessionSchema = z.object({
14
+ id: z.string(),
15
+ cwd: z.string(), // git root at session start
16
+ createdAt: z.string(),
17
+ messages: z.array(ChatMessageSchema),
18
+ compactionSummary: z.string().optional(),
19
+ });
20
+ // ─── ChatHistory ───
21
+ export class ChatHistory {
22
+ stateManager;
23
+ sessionId;
24
+ session;
25
+ constructor(stateManager, sessionId, cwd) {
26
+ this.stateManager = stateManager;
27
+ this.sessionId = sessionId;
28
+ this.session = {
29
+ id: sessionId,
30
+ cwd,
31
+ createdAt: new Date().toISOString(),
32
+ messages: [],
33
+ };
34
+ }
35
+ /** Append a user message and persist to disk BEFORE adapter execution. */
36
+ async appendUserMessage(content) {
37
+ this.session.messages.push({
38
+ role: "user",
39
+ content,
40
+ timestamp: new Date().toISOString(),
41
+ turnIndex: this.session.messages.length,
42
+ });
43
+ await this.persist();
44
+ }
45
+ /** Append an assistant message. Fire-and-forget persistence is acceptable here. */
46
+ appendAssistantMessage(content) {
47
+ this.session.messages.push({
48
+ role: "assistant",
49
+ content,
50
+ timestamp: new Date().toISOString(),
51
+ turnIndex: this.session.messages.length,
52
+ });
53
+ void this.persist();
54
+ }
55
+ /** Clear all messages and persist the empty state. */
56
+ clear() {
57
+ this.session.messages = [];
58
+ void this.persist();
59
+ }
60
+ getMessages() {
61
+ return [...this.session.messages];
62
+ }
63
+ getSessionData() {
64
+ return { ...this.session, messages: [...this.session.messages] };
65
+ }
66
+ async persist() {
67
+ await this.stateManager.writeRaw(`chat/sessions/${this.sessionId}.json`, this.session);
68
+ }
69
+ }
70
+ //# sourceMappingURL=chat-history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-history.js","sourceRoot":"","sources":["../../src/chat/chat-history.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import type { StateManager } from "../state-manager.js";
2
+ import type { IAdapter } from "../execution/adapter-layer.js";
3
+ import type { ILLMClient } from "../llm/llm-client.js";
4
+ import type { EscalationHandler } from "./escalation.js";
5
+ export interface ChatRunnerDeps {
6
+ stateManager: StateManager;
7
+ adapter: IAdapter;
8
+ /** Optional: reserved for future escalation support (Phase 1c). */
9
+ llmClient?: ILLMClient;
10
+ /** Optional: escalation handler for /track command (Phase 1c). */
11
+ escalationHandler?: EscalationHandler;
12
+ }
13
+ export interface ChatRunResult {
14
+ success: boolean;
15
+ output: string;
16
+ elapsed_ms: number;
17
+ }
18
+ export declare class ChatRunner {
19
+ private readonly deps;
20
+ private history;
21
+ private sessionCwd;
22
+ /** True when startSession() has been called — enables session persistence across execute() calls. */
23
+ private sessionActive;
24
+ constructor(deps: ChatRunnerDeps);
25
+ /**
26
+ * Initialize a persistent session for interactive (multi-turn) mode.
27
+ * Must be called before the first execute() to share history across turns.
28
+ * If not called, execute() auto-creates a new session per call (Phase 1a behavior).
29
+ */
30
+ startSession(cwd: string): void;
31
+ private handleCommand;
32
+ private handleTrack;
33
+ /**
34
+ * Execute a single chat turn.
35
+ *
36
+ * Flow:
37
+ * 1. Intercept slash commands before adapter dispatch
38
+ * 2. Resolve git root → create ChatHistory
39
+ * 3. Build chat context and assemble prompt
40
+ * 4. Persist user message BEFORE calling adapter (crash-safe)
41
+ * 5. Execute via adapter
42
+ * 6. Persist assistant response (fire-and-forget)
43
+ */
44
+ execute(input: string, cwd: string, timeoutMs?: number): Promise<ChatRunResult>;
45
+ }
46
+ //# sourceMappingURL=chat-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-runner.d.ts","sourceRoot":"","sources":["../../src/chat/chat-runner.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAa,MAAM,+BAA+B,CAAC;AACzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAIzD,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,YAAY,CAAC;IAC3B,OAAO,EAAE,QAAQ,CAAC;IAClB,mEAAmE;IACnE,SAAS,CAAC,EAAE,UAAU,CAAC;IACvB,kEAAkE;IAClE,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;CACvC;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAcD,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiB;IACtC,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,UAAU,CAAuB;IACzC,qGAAqG;IACrG,OAAO,CAAC,aAAa,CAAS;gBAElB,IAAI,EAAE,cAAc;IAIhC;;;;OAIG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;YAQjB,aAAa;YA4Bb,WAAW;IAgCzB;;;;;;;;;;OAUG;IACG,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,SAAqB,GAAG,OAAO,CAAC,aAAa,CAAC;CA4ClG"}
@@ -0,0 +1,141 @@
1
+ // ─── ChatRunner ───
2
+ //
3
+ // Central coordinator for 1-shot chat execution (Tier 1).
4
+ // Bypasses TaskLifecycle — calls adapter.execute() directly.
5
+ import { ChatHistory } from "./chat-history.js";
6
+ import { buildChatContext, resolveGitRoot } from "../observation/context-provider.js";
7
+ const DEFAULT_TIMEOUT_MS = 120_000;
8
+ // ─── Command help text ───
9
+ const COMMAND_HELP = `Available commands:
10
+ /help Show this help message
11
+ /clear Clear conversation history
12
+ /exit Exit chat mode
13
+ /track Promote session to Tier 2 goal pursuit (not yet implemented)`;
14
+ // ─── ChatRunner ───
15
+ export class ChatRunner {
16
+ deps;
17
+ history = null;
18
+ sessionCwd = null;
19
+ /** True when startSession() has been called — enables session persistence across execute() calls. */
20
+ sessionActive = false;
21
+ constructor(deps) {
22
+ this.deps = deps;
23
+ }
24
+ /**
25
+ * Initialize a persistent session for interactive (multi-turn) mode.
26
+ * Must be called before the first execute() to share history across turns.
27
+ * If not called, execute() auto-creates a new session per call (Phase 1a behavior).
28
+ */
29
+ startSession(cwd) {
30
+ const gitRoot = resolveGitRoot(cwd);
31
+ const sessionId = crypto.randomUUID();
32
+ this.history = new ChatHistory(this.deps.stateManager, sessionId, gitRoot);
33
+ this.sessionCwd = gitRoot;
34
+ this.sessionActive = true;
35
+ }
36
+ async handleCommand(input) {
37
+ const trimmed = input.trim();
38
+ if (!trimmed.startsWith("/"))
39
+ return null;
40
+ const cmd = trimmed.toLowerCase().split(/\s+/)[0];
41
+ const start = Date.now();
42
+ if (cmd === "/help") {
43
+ return { success: true, output: COMMAND_HELP, elapsed_ms: Date.now() - start };
44
+ }
45
+ if (cmd === "/clear") {
46
+ this.history?.clear();
47
+ return { success: true, output: "Conversation history cleared.", elapsed_ms: Date.now() - start };
48
+ }
49
+ if (cmd === "/exit") {
50
+ return { success: true, output: "Exiting chat mode.", elapsed_ms: Date.now() - start };
51
+ }
52
+ if (cmd === "/track") {
53
+ return this.handleTrack(start);
54
+ }
55
+ return {
56
+ success: false,
57
+ output: `Unknown command: ${input.trim()}. Type /help for available commands.`,
58
+ elapsed_ms: Date.now() - start,
59
+ };
60
+ }
61
+ async handleTrack(start) {
62
+ if (!this.deps.escalationHandler) {
63
+ return {
64
+ success: false,
65
+ output: "Escalation not available — missing LLM configuration",
66
+ elapsed_ms: Date.now() - start,
67
+ };
68
+ }
69
+ if (!this.history || this.history.getMessages().length === 0) {
70
+ return {
71
+ success: false,
72
+ output: "No conversation to escalate. Chat first, then /track.",
73
+ elapsed_ms: Date.now() - start,
74
+ };
75
+ }
76
+ try {
77
+ const result = await this.deps.escalationHandler.escalateToGoal(this.history);
78
+ return {
79
+ success: true,
80
+ output: `Goal created: ${result.title} (ID: ${result.goalId})\nRun: pulseed run --goal ${result.goalId} --yes`,
81
+ elapsed_ms: Date.now() - start,
82
+ };
83
+ }
84
+ catch (err) {
85
+ const message = err instanceof Error ? err.message : String(err);
86
+ return {
87
+ success: false,
88
+ output: `Escalation failed: ${message}`,
89
+ elapsed_ms: Date.now() - start,
90
+ };
91
+ }
92
+ }
93
+ /**
94
+ * Execute a single chat turn.
95
+ *
96
+ * Flow:
97
+ * 1. Intercept slash commands before adapter dispatch
98
+ * 2. Resolve git root → create ChatHistory
99
+ * 3. Build chat context and assemble prompt
100
+ * 4. Persist user message BEFORE calling adapter (crash-safe)
101
+ * 5. Execute via adapter
102
+ * 6. Persist assistant response (fire-and-forget)
103
+ */
104
+ async execute(input, cwd, timeoutMs = DEFAULT_TIMEOUT_MS) {
105
+ // Intercept commands before any adapter call
106
+ const commandResult = await this.handleCommand(input);
107
+ if (commandResult !== null) {
108
+ return commandResult;
109
+ }
110
+ // Reuse session (interactive mode) or create a fresh one per call (1-shot mode)
111
+ if (!this.sessionActive) {
112
+ const gitRoot = resolveGitRoot(cwd);
113
+ const sessionId = crypto.randomUUID();
114
+ this.history = new ChatHistory(this.deps.stateManager, sessionId, gitRoot);
115
+ }
116
+ const gitRoot = this.sessionCwd ?? resolveGitRoot(cwd);
117
+ // history is always assigned by this point (either by startSession or the block above)
118
+ const history = this.history;
119
+ // Persist-before-execute: user message written to disk first
120
+ await history.appendUserMessage(input);
121
+ const context = buildChatContext(input, gitRoot);
122
+ const prompt = context ? `${context}\n\n${input}` : input;
123
+ const task = {
124
+ prompt,
125
+ timeout_ms: timeoutMs,
126
+ adapter_type: this.deps.adapter.adapterType,
127
+ cwd,
128
+ };
129
+ const start = Date.now();
130
+ const result = await this.deps.adapter.execute(task);
131
+ const elapsed_ms = Date.now() - start;
132
+ // Fire-and-forget: persist assistant response after completion
133
+ history.appendAssistantMessage(result.output);
134
+ return {
135
+ success: result.success,
136
+ output: result.output,
137
+ elapsed_ms,
138
+ };
139
+ }
140
+ }
141
+ //# sourceMappingURL=chat-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-runner.js","sourceRoot":"","sources":["../../src/chat/chat-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { StateManager } from "../state-manager.js";
2
+ import type { ILLMClient } from "../llm/llm-client.js";
3
+ import type { GoalNegotiator } from "../goal/goal-negotiator.js";
4
+ import type { ChatHistory } from "./chat-history.js";
5
+ export interface EscalationDeps {
6
+ stateManager: StateManager;
7
+ llmClient: ILLMClient;
8
+ goalNegotiator: GoalNegotiator;
9
+ }
10
+ export interface EscalationResult {
11
+ goalId: string;
12
+ title: string;
13
+ description: string;
14
+ }
15
+ export declare class EscalationHandler {
16
+ private readonly deps;
17
+ constructor(deps: EscalationDeps);
18
+ /**
19
+ * Convert conversation history to a tracked PulSeed Goal.
20
+ *
21
+ * Steps:
22
+ * 1. Build LLM messages from conversation history
23
+ * 2. Call LLM to extract goal description
24
+ * 3. GoalNegotiator.negotiate(description) — feasibility + threshold refinement
25
+ * 4. Goal is saved inside negotiate() — no separate saveGoal call needed
26
+ * 5. Return EscalationResult
27
+ */
28
+ escalateToGoal(history: ChatHistory): Promise<EscalationResult>;
29
+ }
30
+ //# sourceMappingURL=escalation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escalation.d.ts","sourceRoot":"","sources":["../../src/chat/escalation.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,YAAY,CAAC;IAC3B,SAAS,EAAE,UAAU,CAAC;IACtB,cAAc,EAAE,cAAc,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AASD,qBAAa,iBAAiB;IAChB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,cAAc;IAEjD;;;;;;;;;OASG;IACG,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAgCtE"}
@@ -0,0 +1,53 @@
1
+ // ─── EscalationHandler ───
2
+ //
3
+ // Handles /track command: converts conversation history to a PulSeed Goal (Tier 2 promotion).
4
+ // Phase 1c: creates the Goal but does NOT auto-start CoreLoop.
5
+ // User runs `pulseed run --goal <id>` to start the loop.
6
+ const SYSTEM_PROMPT = "You are generating a PulSeed goal from a conversation. " +
7
+ "Extract a clear, actionable goal description from the conversation below. " +
8
+ "Return ONLY the goal description, nothing else.";
9
+ // ─── EscalationHandler ───
10
+ export class EscalationHandler {
11
+ deps;
12
+ constructor(deps) {
13
+ this.deps = deps;
14
+ }
15
+ /**
16
+ * Convert conversation history to a tracked PulSeed Goal.
17
+ *
18
+ * Steps:
19
+ * 1. Build LLM messages from conversation history
20
+ * 2. Call LLM to extract goal description
21
+ * 3. GoalNegotiator.negotiate(description) — feasibility + threshold refinement
22
+ * 4. Goal is saved inside negotiate() — no separate saveGoal call needed
23
+ * 5. Return EscalationResult
24
+ */
25
+ async escalateToGoal(history) {
26
+ const messages = history.getMessages();
27
+ if (messages.length === 0) {
28
+ throw new Error("No conversation history to escalate.");
29
+ }
30
+ // Step 1: Build messages array for LLM
31
+ const llmMessages = messages.map((m) => ({
32
+ role: m.role,
33
+ content: m.content,
34
+ }));
35
+ // Step 2: Call LLM to extract goal description
36
+ const response = await this.deps.llmClient.sendMessage(llmMessages, {
37
+ system: SYSTEM_PROMPT,
38
+ });
39
+ const goalDescription = response.content.trim();
40
+ if (!goalDescription) {
41
+ throw new Error("LLM returned empty goal description.");
42
+ }
43
+ // Step 3: Negotiate goal (also persists it internally)
44
+ const { goal } = await this.deps.goalNegotiator.negotiate(goalDescription);
45
+ // Step 4: Return result
46
+ return {
47
+ goalId: goal.id,
48
+ title: goal.title,
49
+ description: goal.description,
50
+ };
51
+ }
52
+ }
53
+ //# sourceMappingURL=escalation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escalation.js","sourceRoot":"","sources":["../../src/chat/escalation.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,EAAE;AACF,8FAA8F;AAC9F,+DAA+D;AAC/D,yDAAyD;AAqBzD,MAAM,aAAa,GACjB,yDAAyD;IACzD,4EAA4E;IAC5E,iDAAiD,CAAC;AAEpD,4BAA4B;AAE5B,MAAM,OAAO,iBAAiB;IACC;IAA7B,YAA6B,IAAoB;QAApB,SAAI,GAAJ,IAAI,CAAgB;IAAG,CAAC;IAErD;;;;;;;;;OASG;IACH,KAAK,CAAC,cAAc,CAAC,OAAoB;QACvC,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QACvC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QAED,uCAAuC;QACvC,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvC,IAAI,EAAE,CAAC,CAAC,IAA4B;YACpC,OAAO,EAAE,CAAC,CAAC,OAAO;SACnB,CAAC,CAAC,CAAC;QAEJ,+CAA+C;QAC/C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE;YAClE,MAAM,EAAE,aAAa;SACtB,CAAC,CAAC;QACH,MAAM,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAEhD,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QAED,uDAAuD;QACvD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QAE3E,wBAAwB;QACxB,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ import { StateManager } from "../../state-manager.js";
2
+ export declare function cmdChat(stateManager: StateManager, argv: string[]): Promise<number>;
3
+ //# sourceMappingURL=chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/chat.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAwFtD,wBAAsB,OAAO,CAC3B,YAAY,EAAE,YAAY,EAC1B,IAAI,EAAE,MAAM,EAAE,GACb,OAAO,CAAC,MAAM,CAAC,CAgFjB"}
@@ -0,0 +1,148 @@
1
+ // ─── pulseed chat command ───
2
+ import React, { useState, useCallback, useEffect } from "react";
3
+ import { render, useApp } from "ink";
4
+ import { parseArgs } from "node:util";
5
+ import { ensureProviderConfig } from "../ensure-api-key.js";
6
+ import { buildLLMClient, buildAdapterRegistry } from "../../llm/provider-factory.js";
7
+ import { loadProviderConfig } from "../../llm/provider-config.js";
8
+ import { formatOperationError } from "../utils.js";
9
+ import { getCliLogger } from "../cli-logger.js";
10
+ import { Chat } from "../../tui/chat.js";
11
+ import { EthicsGate } from "../../traits/ethics-gate.js";
12
+ import { ObservationEngine } from "../../observation/observation-engine.js";
13
+ import { GoalNegotiator } from "../../goal/goal-negotiator.js";
14
+ import { EscalationHandler } from "../../chat/escalation.js";
15
+ const logger = getCliLogger();
16
+ function ChatApp({ chatRunner, cwd, timeoutMs }) {
17
+ const { exit } = useApp();
18
+ const [messages, setMessages] = useState([
19
+ {
20
+ role: "pulseed",
21
+ text: "Chat mode — type a task, /help for commands, /exit to quit.",
22
+ timestamp: new Date(),
23
+ messageType: "info",
24
+ },
25
+ ]);
26
+ const [isProcessing, setIsProcessing] = useState(false);
27
+ useEffect(() => {
28
+ chatRunner.startSession(cwd);
29
+ }, []);
30
+ const onSubmit = useCallback(async (input) => {
31
+ if (!input.trim() || isProcessing)
32
+ return;
33
+ if (input.trim().toLowerCase() === "/exit") {
34
+ exit();
35
+ return;
36
+ }
37
+ setMessages((prev) => [
38
+ ...prev,
39
+ { role: "user", text: input, timestamp: new Date() },
40
+ ]);
41
+ setIsProcessing(true);
42
+ try {
43
+ const result = await chatRunner.execute(input, cwd, timeoutMs);
44
+ setMessages((prev) => [
45
+ ...prev,
46
+ {
47
+ role: "pulseed",
48
+ text: result.output || "(no output)",
49
+ timestamp: new Date(),
50
+ messageType: result.success ? "info" : "error",
51
+ },
52
+ ]);
53
+ }
54
+ catch (err) {
55
+ const message = err instanceof Error ? err.message : String(err);
56
+ setMessages((prev) => [
57
+ ...prev,
58
+ {
59
+ role: "pulseed",
60
+ text: `Error: ${message}`,
61
+ timestamp: new Date(),
62
+ messageType: "error",
63
+ },
64
+ ]);
65
+ }
66
+ finally {
67
+ setIsProcessing(false);
68
+ }
69
+ }, [chatRunner, cwd, timeoutMs, isProcessing, exit]);
70
+ return React.createElement(Chat, { messages, onSubmit, isProcessing });
71
+ }
72
+ // ─── Command handler ───
73
+ export async function cmdChat(stateManager, argv) {
74
+ let values;
75
+ let positionals;
76
+ try {
77
+ const parsed = parseArgs({
78
+ args: argv,
79
+ options: {
80
+ adapter: { type: "string" },
81
+ timeout: { type: "string" },
82
+ },
83
+ allowPositionals: true,
84
+ strict: false,
85
+ });
86
+ values = parsed.values;
87
+ positionals = parsed.positionals;
88
+ }
89
+ catch (err) {
90
+ logger.error(formatOperationError("parse chat command arguments", err));
91
+ return 1;
92
+ }
93
+ const task = positionals[0];
94
+ try {
95
+ await ensureProviderConfig();
96
+ }
97
+ catch (err) {
98
+ logger.error(err instanceof Error ? err.message : String(err));
99
+ return 1;
100
+ }
101
+ const timeoutMs = values.timeout !== undefined ? parseInt(values.timeout, 10) : 120_000;
102
+ let adapterType = values.adapter;
103
+ if (!adapterType) {
104
+ try {
105
+ const providerConfig = await loadProviderConfig();
106
+ adapterType = providerConfig.adapter;
107
+ }
108
+ catch {
109
+ adapterType = "claude_code_cli";
110
+ }
111
+ }
112
+ try {
113
+ const llmClient = await buildLLMClient();
114
+ const adapterRegistry = await buildAdapterRegistry(llmClient);
115
+ const adapter = adapterRegistry.getAdapter(adapterType);
116
+ // Build escalation deps (optional — /track works only when LLM is available)
117
+ let escalationHandler;
118
+ try {
119
+ const ethicsGate = new EthicsGate(stateManager, llmClient);
120
+ const observationEngine = new ObservationEngine(stateManager, [], llmClient);
121
+ const goalNegotiator = new GoalNegotiator(stateManager, llmClient, ethicsGate, observationEngine);
122
+ escalationHandler = new EscalationHandler({ stateManager, llmClient, goalNegotiator });
123
+ }
124
+ catch {
125
+ // Non-fatal: /track will show "not available" if escalation fails to init
126
+ logger.warn("Escalation handler could not be initialized — /track will be unavailable");
127
+ }
128
+ const { ChatRunner } = await import("../../chat/chat-runner.js");
129
+ const chatRunner = new ChatRunner({ adapter, stateManager, llmClient, escalationHandler });
130
+ // Non-interactive: single turn
131
+ if (task) {
132
+ const result = await chatRunner.execute(task, process.cwd(), timeoutMs);
133
+ if (result.output) {
134
+ process.stdout.write(result.output + "\n");
135
+ }
136
+ return result.success ? 0 : 1;
137
+ }
138
+ // Interactive REPL
139
+ const { waitUntilExit } = render(React.createElement(ChatApp, { chatRunner, cwd: process.cwd(), timeoutMs }));
140
+ await waitUntilExit();
141
+ return 0;
142
+ }
143
+ catch (err) {
144
+ logger.error(formatOperationError("execute chat command", err));
145
+ return 1;
146
+ }
147
+ }
148
+ //# sourceMappingURL=chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../src/cli/commands/chat.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/daemon.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAW1E,wBAAsB,QAAQ,CAC5B,YAAY,EAAE,YAAY,EAC1B,sBAAsB,EAAE,sBAAsB,EAC9C,IAAI,EAAE,MAAM,EAAE,GACb,OAAO,CAAC,IAAI,CAAC,CA2Gf;AAED,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoDpE;AAED,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA0B5D;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6B3D"}
1
+ {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/daemon.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAW1E,wBAAsB,QAAQ,CAC5B,YAAY,EAAE,YAAY,EAC1B,sBAAsB,EAAE,sBAAsB,EAC9C,IAAI,EAAE,MAAM,EAAE,GACb,OAAO,CAAC,IAAI,CAAC,CAmIf;AAsBD,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAwEpE;AAED,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA0B5D;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6B3D"}