@didim365/agent-cli-core 0.2.25 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/src/config/config.d.ts +8 -3
  2. package/dist/src/config/config.js +66 -15
  3. package/dist/src/config/config.js.map +1 -1
  4. package/dist/src/config/providerModels.js +8 -4
  5. package/dist/src/config/providerModels.js.map +1 -1
  6. package/dist/src/confirmation-bus/types.d.ts +4 -0
  7. package/dist/src/confirmation-bus/types.js.map +1 -1
  8. package/dist/src/core/prompts.js +29 -27
  9. package/dist/src/core/prompts.js.map +1 -1
  10. package/dist/src/generated/git-commit.d.ts +1 -1
  11. package/dist/src/generated/git-commit.js +1 -1
  12. package/dist/src/index.d.ts +0 -1
  13. package/dist/src/index.js +0 -1
  14. package/dist/src/index.js.map +1 -1
  15. package/dist/src/tools/ask-user.d.ts +2 -0
  16. package/dist/src/tools/ask-user.js +36 -0
  17. package/dist/src/tools/ask-user.js.map +1 -1
  18. package/dist/src/tools/task-create.d.ts +21 -0
  19. package/dist/src/tools/task-create.js +92 -0
  20. package/dist/src/tools/task-create.js.map +1 -0
  21. package/dist/src/tools/task-get.d.ts +18 -0
  22. package/dist/src/tools/task-get.js +66 -0
  23. package/dist/src/tools/task-get.js.map +1 -0
  24. package/dist/src/tools/task-list.d.ts +16 -0
  25. package/dist/src/tools/task-list.js +53 -0
  26. package/dist/src/tools/task-list.js.map +1 -0
  27. package/dist/src/tools/task-store.d.ts +78 -0
  28. package/dist/src/tools/task-store.js +267 -0
  29. package/dist/src/tools/task-store.js.map +1 -0
  30. package/dist/src/tools/task-update.d.ts +26 -0
  31. package/dist/src/tools/task-update.js +217 -0
  32. package/dist/src/tools/task-update.js.map +1 -0
  33. package/dist/src/tools/tool-names.d.ts +5 -2
  34. package/dist/src/tools/tool-names.js +8 -2
  35. package/dist/src/tools/tool-names.js.map +1 -1
  36. package/package.json +1 -1
  37. package/dist/src/tools/write-todos.d.ts +0 -50
  38. package/dist/src/tools/write-todos.js +0 -194
  39. package/dist/src/tools/write-todos.js.map +0 -1
@@ -3,5 +3,5 @@
3
3
  * Copyright 2026 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- export declare const GIT_COMMIT_INFO = "26ca36cf3";
6
+ export declare const GIT_COMMIT_INFO = "3acab2b58";
7
7
  export declare const CLI_VERSION = "0.30.0";
@@ -5,6 +5,6 @@
5
5
  */
6
6
  // This file is auto-generated by the build script (scripts/generate-git-commit-info.js)
7
7
  // Do not edit this file manually.
8
- export const GIT_COMMIT_INFO = '26ca36cf3';
8
+ export const GIT_COMMIT_INFO = '3acab2b58';
9
9
  export const CLI_VERSION = '0.30.0';
10
10
  //# sourceMappingURL=git-commit.js.map
@@ -129,7 +129,6 @@ export * from './tools/web-search.js';
129
129
  export * from './tools/read-many-files.js';
130
130
  export * from './tools/mcp-client.js';
131
131
  export * from './tools/mcp-tool.js';
132
- export * from './tools/write-todos.js';
133
132
  export { MCPOAuthProvider } from './mcp/oauth-provider.js';
134
133
  export type { OAuthToken, OAuthCredentials, } from './mcp/token-storage/types.js';
135
134
  export { MCPOAuthTokenStorage } from './mcp/oauth-token-storage.js';
package/dist/src/index.js CHANGED
@@ -140,7 +140,6 @@ export * from './tools/web-search.js';
140
140
  export * from './tools/read-many-files.js';
141
141
  export * from './tools/mcp-client.js';
142
142
  export * from './tools/mcp-tool.js';
143
- export * from './tools/write-todos.js';
144
143
  // MCP OAuth
145
144
  export { MCPOAuthProvider } from './mcp/oauth-provider.js';
146
145
  export { MCPOAuthTokenStorage } from './mcp/oauth-token-storage.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,gBAAgB;AAChB,cAAc,oBAAoB,CAAC;AACnC,cAAc,iCAAiC,CAAC;AAChD,cAAc,oBAAoB,CAAC;AACnC,OAAO,EACL,uBAAuB,EACvB,2BAA2B,EAC3B,uBAAuB,GAGxB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EACL,aAAa,EACb,YAAY,EACZ,gBAAgB,GAGjB,MAAM,4BAA4B,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mCAAmC,CAAC;AAClD,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mCAAmC,CAAC;AAElD,wBAAwB;AACxB,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AAEpC,oBAAoB;AACpB,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mCAAmC,CAAC;AAClD,cAAc,4BAA4B,CAAC,CAAC,gCAAgC;AAC5E,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC,CAAC,0BAA0B;AACtE,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qCAAqC,CAAC;AAEpD,cAAc,qBAAqB,CAAC;AAEpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mCAAmC,CAAC;AAElD,mBAAmB;AACnB,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACnD,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjE,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6CAA6C,CAAC;AAC5D,cAAc,kCAAkC,CAAC;AACjD,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oCAAoC,CAAC;AACnD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AAEvC,kBAAkB;AAClB,cAAc,oCAAoC,CAAC;AACnD,cAAc,0BAA0B,CAAC;AACzC,cAAc,oCAAoC,CAAC;AACnD,cAAc,iCAAiC,CAAC;AAChD,cAAc,mCAAmC,CAAC;AAClD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AAExC,4BAA4B;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,OAAO,EAAE,eAAe,EAAgB,MAAM,qBAAqB,CAAC;AACpE,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAE/B,iCAAiC;AACjC,cAAc,qCAAqC,CAAC;AAEpD,+BAA+B;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kCAAkC,CAAC;AAEjD,sBAAsB;AACtB,cAAc,0BAA0B,CAAC;AAEzC,2BAA2B;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAE3C,6BAA6B;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AAEvC,YAAY;AACZ,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAK3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAMpE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,6BAA6B;AAC7B,cAAc,sBAAsB,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,cAAc,oBAAoB,CAAC;AACnC,OAAO,EACL,OAAO,EACP,cAAc,EACd,eAAe,EACf,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAE7B,sBAAsB;AACtB,cAAc,kBAAkB,CAAC;AAEjC,oBAAoB;AACpB,cAAc,kBAAkB,CAAC;AAEjC,qBAAqB;AACrB,cAAc,mBAAmB,CAAC;AAElC,qBAAqB;AACrB,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -16,5 +16,7 @@ export declare class AskUserTool extends BaseDeclarativeTool<AskUserParams, Tool
16
16
  export declare class AskUserInvocation extends BaseToolInvocation<AskUserParams, ToolResult> {
17
17
  shouldConfirmExecute(_abortSignal: AbortSignal): Promise<ToolCallConfirmationDetails | false>;
18
18
  getDescription(): string;
19
+ /** Defensive timeout for response waiting (5 minutes). */
20
+ private static readonly RESPONSE_TIMEOUT_MS;
19
21
  execute(signal: AbortSignal): Promise<ToolResult>;
20
22
  }
@@ -52,6 +52,12 @@ export class AskUserTool extends BaseDeclarativeTool {
52
52
  type: 'string',
53
53
  description: 'Explanation of what this option means or what will happen if chosen. Useful for providing context about trade-offs or implications.',
54
54
  },
55
+ markdown: {
56
+ type: 'string',
57
+ description: 'Optional preview content shown in a monospace box when this option is focused. ' +
58
+ 'Use for ASCII mockups, code snippets, or diagrams that help users visually compare options. ' +
59
+ 'Supports multi-line text with newlines.',
60
+ },
55
61
  },
56
62
  },
57
63
  },
@@ -80,6 +86,8 @@ export class AskUserInvocation extends BaseToolInvocation {
80
86
  getDescription() {
81
87
  return `Asking user: ${this.params.questions.map((q) => q.question).join(', ')}`;
82
88
  }
89
+ /** Defensive timeout for response waiting (5 minutes). */
90
+ static RESPONSE_TIMEOUT_MS = 5 * 60 * 1000;
83
91
  async execute(signal) {
84
92
  const correlationId = randomUUID();
85
93
  const request = {
@@ -91,9 +99,21 @@ export class AskUserInvocation extends BaseToolInvocation {
91
99
  correlationId,
92
100
  };
93
101
  return new Promise((resolve, reject) => {
102
+ let timeoutId = null;
94
103
  const responseHandler = (response) => {
95
104
  if (response.correlationId === correlationId) {
96
105
  cleanup();
106
+ // Issue 1: Detect user cancellation (cancelled flag from CLI)
107
+ if (response.cancelled) {
108
+ resolve({
109
+ llmContent: 'User cancelled the question without answering.',
110
+ returnDisplay: 'Cancelled by user',
111
+ error: {
112
+ message: 'Cancelled',
113
+ },
114
+ });
115
+ return;
116
+ }
97
117
  // Build formatted key-value display
98
118
  const formattedAnswers = Object.entries(response.answers)
99
119
  .map(([index, answer]) => {
@@ -110,6 +130,10 @@ export class AskUserInvocation extends BaseToolInvocation {
110
130
  }
111
131
  };
112
132
  const cleanup = () => {
133
+ if (timeoutId !== null) {
134
+ clearTimeout(timeoutId);
135
+ timeoutId = null;
136
+ }
113
137
  if (responseHandler) {
114
138
  this.messageBus.unsubscribe(MessageBusType.ASK_USER_RESPONSE, responseHandler);
115
139
  }
@@ -125,10 +149,22 @@ export class AskUserInvocation extends BaseToolInvocation {
125
149
  },
126
150
  });
127
151
  };
152
+ const timeoutHandler = () => {
153
+ cleanup();
154
+ resolve({
155
+ llmContent: 'Ask user request timed out waiting for response.',
156
+ returnDisplay: 'Timed out',
157
+ error: {
158
+ message: 'Ask user request timed out waiting for response.',
159
+ },
160
+ });
161
+ };
128
162
  if (signal.aborted) {
129
163
  abortHandler();
130
164
  return;
131
165
  }
166
+ // Issue 3: Defensive timeout to prevent indefinite hang
167
+ timeoutId = setTimeout(timeoutHandler, AskUserInvocation.RESPONSE_TIMEOUT_MS);
132
168
  signal.addEventListener('abort', abortHandler);
133
169
  this.messageBus.subscribe(MessageBusType.ASK_USER_RESPONSE, responseHandler);
134
170
  // Publish request
@@ -1 +1 @@
1
- {"version":3,"file":"ask-user.js","sourceRoot":"","sources":["../../../src/tools/ask-user.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ask-user.js","sourceRoot":"","sources":["../../../src/tools/ask-user.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import type { ToolInvocation } from './tools.js';
7
+ import { BaseDeclarativeTool, type ToolResult } from './tools.js';
8
+ import type { MessageBus } from '../confirmation-bus/message-bus.js';
9
+ import type { TaskStore } from './task-store.js';
10
+ export interface TaskCreateToolParams {
11
+ subject: string;
12
+ description: string;
13
+ activeForm?: string;
14
+ metadata?: Record<string, unknown>;
15
+ }
16
+ export declare class TaskCreateTool extends BaseDeclarativeTool<TaskCreateToolParams, ToolResult> {
17
+ private readonly taskStore;
18
+ static readonly Name = "task_create";
19
+ constructor(taskStore: TaskStore, messageBus: MessageBus);
20
+ protected createInvocation(params: TaskCreateToolParams, messageBus: MessageBus, _toolName?: string, _displayName?: string): ToolInvocation<TaskCreateToolParams, ToolResult>;
21
+ }
@@ -0,0 +1,92 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { BaseDeclarativeTool, BaseToolInvocation, Kind, } from './tools.js';
7
+ import { ToolErrorType } from './tool-error.js';
8
+ // --- Tool description ---
9
+ const TASK_CREATE_DESCRIPTION = `Create a new task to track progress on a subtask. Each task gets an auto-incrementing ID and starts with 'pending' status.
10
+
11
+ Use this when you need to track individual work items with their own lifecycle (pending → in_progress → completed). For complex tasks, create multiple tasks and set up dependencies between them using TaskUpdate.
12
+
13
+ Parameters:
14
+ - subject (required): Brief imperative title (e.g., "Fix authentication bug in login flow")
15
+ - description (required): Detailed description of what needs to be done, including context and acceptance criteria
16
+ - activeForm (optional): Present continuous form shown while task is in_progress (e.g., "Fixing authentication bug")
17
+ - metadata (optional): Arbitrary key-value data to attach to the task`;
18
+ // --- Invocation ---
19
+ class TaskCreateToolInvocation extends BaseToolInvocation {
20
+ taskStore;
21
+ constructor(params, taskStore, messageBus, _toolName, _toolDisplayName) {
22
+ super(params, messageBus, _toolName, _toolDisplayName);
23
+ this.taskStore = taskStore;
24
+ }
25
+ getDescription() {
26
+ return `Create task: ${this.params.subject}`;
27
+ }
28
+ async execute(_signal, _updateOutput) {
29
+ try {
30
+ const task = this.taskStore.create({
31
+ subject: this.params.subject,
32
+ description: this.params.description,
33
+ activeForm: this.params.activeForm,
34
+ metadata: this.params.metadata,
35
+ });
36
+ return {
37
+ llmContent: JSON.stringify({
38
+ taskId: task.id,
39
+ subject: task.subject,
40
+ status: task.status,
41
+ }),
42
+ returnDisplay: { todos: this.taskStore.toTodoList() },
43
+ };
44
+ }
45
+ catch (error) {
46
+ const message = error instanceof Error ? error.message : String(error);
47
+ return {
48
+ llmContent: `Error: Failed to create task. Reason: ${message}`,
49
+ returnDisplay: message,
50
+ error: {
51
+ message,
52
+ type: ToolErrorType.EXECUTION_FAILED,
53
+ },
54
+ };
55
+ }
56
+ }
57
+ }
58
+ // --- Tool class ---
59
+ export class TaskCreateTool extends BaseDeclarativeTool {
60
+ taskStore;
61
+ static Name = 'task_create';
62
+ constructor(taskStore, messageBus) {
63
+ super(TaskCreateTool.Name, 'TaskCreate', TASK_CREATE_DESCRIPTION, Kind.Other, {
64
+ type: 'object',
65
+ properties: {
66
+ subject: {
67
+ type: 'string',
68
+ description: 'Brief imperative title for the task (e.g., "Fix authentication bug in login flow")',
69
+ },
70
+ description: {
71
+ type: 'string',
72
+ description: 'Detailed description of what needs to be done, including context and acceptance criteria',
73
+ },
74
+ activeForm: {
75
+ type: 'string',
76
+ description: 'Present continuous form shown in spinner when task is in_progress (e.g., "Fixing authentication bug")',
77
+ },
78
+ metadata: {
79
+ type: 'object',
80
+ description: 'Arbitrary key-value data to attach to the task',
81
+ },
82
+ },
83
+ required: ['subject', 'description'],
84
+ additionalProperties: false,
85
+ }, messageBus);
86
+ this.taskStore = taskStore;
87
+ }
88
+ createInvocation(params, messageBus, _toolName, _displayName) {
89
+ return new TaskCreateToolInvocation(params, this.taskStore, messageBus, _toolName, _displayName);
90
+ }
91
+ }
92
+ //# sourceMappingURL=task-create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-create.js","sourceRoot":"","sources":["../../../src/tools/task-create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import type { ToolInvocation } from './tools.js';
7
+ import { BaseDeclarativeTool, type ToolResult } from './tools.js';
8
+ import type { MessageBus } from '../confirmation-bus/message-bus.js';
9
+ import type { TaskStore } from './task-store.js';
10
+ export interface TaskGetToolParams {
11
+ taskId: string;
12
+ }
13
+ export declare class TaskGetTool extends BaseDeclarativeTool<TaskGetToolParams, ToolResult> {
14
+ private readonly taskStore;
15
+ static readonly Name = "task_get";
16
+ constructor(taskStore: TaskStore, messageBus: MessageBus);
17
+ protected createInvocation(params: TaskGetToolParams, messageBus: MessageBus, _toolName?: string, _displayName?: string): ToolInvocation<TaskGetToolParams, ToolResult>;
18
+ }
@@ -0,0 +1,66 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { BaseDeclarativeTool, BaseToolInvocation, Kind, } from './tools.js';
7
+ import { ToolErrorType } from './tool-error.js';
8
+ // --- Tool description ---
9
+ const TASK_GET_DESCRIPTION = `Retrieve full details of a task by its ID.
10
+
11
+ Returns the complete task object including subject, description, status, dependencies (blocks/blockedBy), timestamps, and metadata. Use this to check task requirements before starting work or to understand task dependencies.
12
+
13
+ Parameters:
14
+ - taskId (required): The ID of the task to retrieve`;
15
+ // --- Invocation ---
16
+ class TaskGetToolInvocation extends BaseToolInvocation {
17
+ taskStore;
18
+ constructor(params, taskStore, messageBus, _toolName, _toolDisplayName) {
19
+ super(params, messageBus, _toolName, _toolDisplayName);
20
+ this.taskStore = taskStore;
21
+ }
22
+ getDescription() {
23
+ return `Get task ${this.params.taskId}`;
24
+ }
25
+ async execute(_signal, _updateOutput) {
26
+ const task = this.taskStore.get(this.params.taskId);
27
+ if (!task) {
28
+ const message = `Task ${this.params.taskId} not found.`;
29
+ return {
30
+ llmContent: message,
31
+ returnDisplay: message,
32
+ error: {
33
+ message,
34
+ type: ToolErrorType.INVALID_TOOL_PARAMS,
35
+ },
36
+ };
37
+ }
38
+ return {
39
+ llmContent: JSON.stringify(task),
40
+ returnDisplay: JSON.stringify(task, null, 2),
41
+ };
42
+ }
43
+ }
44
+ // --- Tool class ---
45
+ export class TaskGetTool extends BaseDeclarativeTool {
46
+ taskStore;
47
+ static Name = 'task_get';
48
+ constructor(taskStore, messageBus) {
49
+ super(TaskGetTool.Name, 'TaskGet', TASK_GET_DESCRIPTION, Kind.Other, {
50
+ type: 'object',
51
+ properties: {
52
+ taskId: {
53
+ type: 'string',
54
+ description: 'The ID of the task to retrieve',
55
+ },
56
+ },
57
+ required: ['taskId'],
58
+ additionalProperties: false,
59
+ }, messageBus);
60
+ this.taskStore = taskStore;
61
+ }
62
+ createInvocation(params, messageBus, _toolName, _displayName) {
63
+ return new TaskGetToolInvocation(params, this.taskStore, messageBus, _toolName, _displayName);
64
+ }
65
+ }
66
+ //# sourceMappingURL=task-get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-get.js","sourceRoot":"","sources":["../../../src/tools/task-get.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,IAAI,GAEL,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIhD,2BAA2B;AAE3B,MAAM,oBAAoB,GAAG;;;;;oDAKuB,CAAC;AAQrD,qBAAqB;AAErB,MAAM,qBAAsB,SAAQ,kBAGnC;IAGoB;IAFnB,YACE,MAAyB,EACR,SAAoB,EACrC,UAAsB,EACtB,SAAkB,EAClB,gBAAyB;QAEzB,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC;QALtC,cAAS,GAAT,SAAS,CAAW;IAMvC,CAAC;IAED,cAAc;QACZ,OAAO,YAAY,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,OAAO,CACX,OAAoB,EACpB,aAAwC;QAExC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAEpD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,OAAO,GAAG,QAAQ,IAAI,CAAC,MAAM,CAAC,MAAM,aAAa,CAAC;YACxD,OAAO;gBACL,UAAU,EAAE,OAAO;gBACnB,aAAa,EAAE,OAAO;gBACtB,KAAK,EAAE;oBACL,OAAO;oBACP,IAAI,EAAE,aAAa,CAAC,mBAAmB;iBACxC;aACF,CAAC;QACJ,CAAC;QAED,OAAO;YACL,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAChC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;SAC7C,CAAC;IACJ,CAAC;CACF;AAED,qBAAqB;AAErB,MAAM,OAAO,WAAY,SAAQ,mBAGhC;IAIoB;IAHnB,MAAM,CAAU,IAAI,GAAG,UAAU,CAAC;IAElC,YACmB,SAAoB,EACrC,UAAsB;QAEtB,KAAK,CACH,WAAW,CAAC,IAAI,EAChB,SAAS,EACT,oBAAoB,EACpB,IAAI,CAAC,KAAK,EACV;YACE,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,gCAAgC;iBAC9C;aACF;YACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;YACpB,oBAAoB,EAAE,KAAK;SAC5B,EACD,UAAU,CACX,CAAC;QApBe,cAAS,GAAT,SAAS,CAAW;IAqBvC,CAAC;IAES,gBAAgB,CACxB,MAAyB,EACzB,UAAsB,EACtB,SAAkB,EAClB,YAAqB;QAErB,OAAO,IAAI,qBAAqB,CAC9B,MAAM,EACN,IAAI,CAAC,SAAS,EACd,UAAU,EACV,SAAS,EACT,YAAY,CACb,CAAC;IACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import type { ToolInvocation } from './tools.js';
7
+ import { BaseDeclarativeTool, type ToolResult } from './tools.js';
8
+ import type { MessageBus } from '../confirmation-bus/message-bus.js';
9
+ import type { TaskStore } from './task-store.js';
10
+ export type TaskListToolParams = Record<string, never>;
11
+ export declare class TaskListTool extends BaseDeclarativeTool<TaskListToolParams, ToolResult> {
12
+ private readonly taskStore;
13
+ static readonly Name = "task_list";
14
+ constructor(taskStore: TaskStore, messageBus: MessageBus);
15
+ protected createInvocation(params: TaskListToolParams, messageBus: MessageBus, _toolName?: string, _displayName?: string): ToolInvocation<TaskListToolParams, ToolResult>;
16
+ }
@@ -0,0 +1,53 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { BaseDeclarativeTool, BaseToolInvocation, Kind, } from './tools.js';
7
+ // --- Tool description ---
8
+ const TASK_LIST_DESCRIPTION = `List all tasks with summary information.
9
+
10
+ Returns an array of task summaries including id, subject, status, owner, and active blockers. Use this to check overall progress, find available tasks, or identify blocked work.
11
+
12
+ No parameters required.`;
13
+ // --- Invocation ---
14
+ class TaskListToolInvocation extends BaseToolInvocation {
15
+ taskStore;
16
+ constructor(params, taskStore, messageBus, _toolName, _toolDisplayName) {
17
+ super(params, messageBus, _toolName, _toolDisplayName);
18
+ this.taskStore = taskStore;
19
+ }
20
+ getDescription() {
21
+ return 'List all tasks';
22
+ }
23
+ async execute(_signal, _updateOutput) {
24
+ const summaries = this.taskStore.list();
25
+ if (summaries.length === 0) {
26
+ return {
27
+ llmContent: 'No tasks found.',
28
+ returnDisplay: { todos: [] },
29
+ };
30
+ }
31
+ return {
32
+ llmContent: JSON.stringify(summaries),
33
+ returnDisplay: { todos: this.taskStore.toTodoList() },
34
+ };
35
+ }
36
+ }
37
+ // --- Tool class ---
38
+ export class TaskListTool extends BaseDeclarativeTool {
39
+ taskStore;
40
+ static Name = 'task_list';
41
+ constructor(taskStore, messageBus) {
42
+ super(TaskListTool.Name, 'TaskList', TASK_LIST_DESCRIPTION, Kind.Other, {
43
+ type: 'object',
44
+ properties: {},
45
+ additionalProperties: false,
46
+ }, messageBus);
47
+ this.taskStore = taskStore;
48
+ }
49
+ createInvocation(params, messageBus, _toolName, _displayName) {
50
+ return new TaskListToolInvocation(params, this.taskStore, messageBus, _toolName, _displayName);
51
+ }
52
+ }
53
+ //# sourceMappingURL=task-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-list.js","sourceRoot":"","sources":["../../../src/tools/task-list.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,IAAI,GAEL,MAAM,YAAY,CAAC;AAIpB,2BAA2B;AAE3B,MAAM,qBAAqB,GAAG;;;;wBAIN,CAAC;AAMzB,qBAAqB;AAErB,MAAM,sBAAuB,SAAQ,kBAGpC;IAGoB;IAFnB,YACE,MAA0B,EACT,SAAoB,EACrC,UAAsB,EACtB,SAAkB,EAClB,gBAAyB;QAEzB,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC;QALtC,cAAS,GAAT,SAAS,CAAW;IAMvC,CAAC;IAED,cAAc;QACZ,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,OAAO,CACX,OAAoB,EACpB,aAAwC;QAExC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAExC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO;gBACL,UAAU,EAAE,iBAAiB;gBAC7B,aAAa,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;aAC7B,CAAC;QACJ,CAAC;QAED,OAAO;YACL,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;YACrC,aAAa,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE;SACtD,CAAC;IACJ,CAAC;CACF;AAED,qBAAqB;AAErB,MAAM,OAAO,YAAa,SAAQ,mBAGjC;IAIoB;IAHnB,MAAM,CAAU,IAAI,GAAG,WAAW,CAAC;IAEnC,YACmB,SAAoB,EACrC,UAAsB;QAEtB,KAAK,CACH,YAAY,CAAC,IAAI,EACjB,UAAU,EACV,qBAAqB,EACrB,IAAI,CAAC,KAAK,EACV;YACE,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,EAAE;YACd,oBAAoB,EAAE,KAAK;SAC5B,EACD,UAAU,CACX,CAAC;QAde,cAAS,GAAT,SAAS,CAAW;IAevC,CAAC;IAES,gBAAgB,CACxB,MAA0B,EAC1B,UAAsB,EACtB,SAAkB,EAClB,YAAqB;QAErB,OAAO,IAAI,sBAAsB,CAC/B,MAAM,EACN,IAAI,CAAC,SAAS,EACd,UAAU,EACV,SAAS,EACT,YAAY,CACb,CAAC;IACJ,CAAC"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import type { Todo } from './tools.js';
7
+ export type TaskStatus = 'pending' | 'in_progress' | 'completed';
8
+ export interface Task {
9
+ id: string;
10
+ subject: string;
11
+ description: string;
12
+ status: TaskStatus;
13
+ activeForm?: string;
14
+ owner?: string;
15
+ metadata?: Record<string, unknown>;
16
+ blocks: string[];
17
+ blockedBy: string[];
18
+ createdAt: number;
19
+ updatedAt: number;
20
+ }
21
+ export interface TaskSummary {
22
+ id: string;
23
+ subject: string;
24
+ status: TaskStatus;
25
+ owner?: string;
26
+ blockedBy: string[];
27
+ }
28
+ export interface TaskCreateParams {
29
+ subject: string;
30
+ description: string;
31
+ activeForm?: string;
32
+ metadata?: Record<string, unknown>;
33
+ }
34
+ export interface TaskUpdateParams {
35
+ status?: TaskStatus;
36
+ subject?: string;
37
+ description?: string;
38
+ activeForm?: string;
39
+ owner?: string;
40
+ metadata?: Record<string, unknown | null>;
41
+ }
42
+ /** Describes a dependency target that was skipped during addBlocks/addBlockedBy. */
43
+ export interface DependencySkip {
44
+ targetId: string;
45
+ reason: 'not_found' | 'self' | 'completed_target' | 'cycle';
46
+ }
47
+ export declare class TaskStore {
48
+ private tasks;
49
+ private nextId;
50
+ /** Creates a new task with auto-incrementing string ID and 'pending' status. */
51
+ create(params: TaskCreateParams): Task;
52
+ /** Returns the task with the given ID, or null if not found. */
53
+ get(id: string): Task | null;
54
+ /** Updates task fields. Returns null if task not found, completed, or invalid. */
55
+ update(id: string, params: TaskUpdateParams): Task | null;
56
+ /** Deletes the task and cleans up all dependency references. */
57
+ delete(id: string): boolean;
58
+ /** Marks taskId as blocking each of the given blockedIds. Returns skipped targets with reasons. */
59
+ addBlocks(taskId: string, blockedIds: string[]): DependencySkip[];
60
+ /** Marks taskId as blocked by each of the given blockingIds. Returns skipped targets with reasons. */
61
+ addBlockedBy(taskId: string, blockingIds: string[]): DependencySkip[];
62
+ /** Returns IDs of non-completed tasks that block the given task. */
63
+ getOpenBlockers(taskId: string): string[];
64
+ /** Returns summary of all tasks with only open (non-completed) blockers. */
65
+ list(): TaskSummary[];
66
+ /** Converts all tasks to the existing Todo[] format for CLI TodoTray compatibility. */
67
+ toTodoList(): Todo[];
68
+ /**
69
+ * Issue 5: Checks if adding taskId → targetId dependency in the given direction
70
+ * would create a cycle. Uses BFS traversal along the *forward* direction
71
+ * from targetId to see if it can reach taskId.
72
+ *
73
+ * Example: if direction='blocks' and we want to add "A blocks B",
74
+ * we check if B already (transitively) blocks A. If so, adding it creates a cycle.
75
+ */
76
+ private wouldCreateCycle;
77
+ private addDependency;
78
+ }