zeitlich 0.1.1 → 0.2.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 (58) hide show
  1. package/README.md +165 -180
  2. package/dist/index.cjs +1314 -0
  3. package/dist/index.cjs.map +1 -0
  4. package/dist/index.d.cts +128 -0
  5. package/dist/index.d.ts +51 -75
  6. package/dist/index.js +741 -1091
  7. package/dist/index.js.map +1 -1
  8. package/dist/workflow-uVNF7zoe.d.cts +941 -0
  9. package/dist/workflow-uVNF7zoe.d.ts +941 -0
  10. package/dist/workflow.cjs +914 -0
  11. package/dist/workflow.cjs.map +1 -0
  12. package/dist/workflow.d.cts +5 -0
  13. package/dist/workflow.d.ts +2 -1
  14. package/dist/workflow.js +543 -423
  15. package/dist/workflow.js.map +1 -1
  16. package/package.json +19 -17
  17. package/src/activities.ts +112 -0
  18. package/src/index.ts +49 -0
  19. package/src/lib/fs.ts +80 -0
  20. package/src/lib/model-invoker.ts +75 -0
  21. package/src/lib/session.ts +216 -0
  22. package/src/lib/state-manager.ts +268 -0
  23. package/src/lib/thread-manager.ts +169 -0
  24. package/src/lib/tool-router.ts +717 -0
  25. package/src/lib/types.ts +354 -0
  26. package/src/plugin.ts +28 -0
  27. package/src/tools/ask-user-question/handler.ts +25 -0
  28. package/src/tools/ask-user-question/tool.ts +46 -0
  29. package/src/tools/bash/bash.test.ts +104 -0
  30. package/src/tools/bash/handler.ts +36 -0
  31. package/src/tools/bash/tool.ts +20 -0
  32. package/src/tools/edit/handler.ts +156 -0
  33. package/src/tools/edit/tool.ts +39 -0
  34. package/src/tools/glob/handler.ts +62 -0
  35. package/src/tools/glob/tool.ts +27 -0
  36. package/src/tools/grep/tool.ts +45 -0
  37. package/src/tools/read/tool.ts +33 -0
  38. package/src/tools/task/handler.ts +75 -0
  39. package/src/tools/task/tool.ts +96 -0
  40. package/src/tools/task-create/handler.ts +49 -0
  41. package/src/tools/task-create/tool.ts +66 -0
  42. package/src/tools/task-get/handler.ts +38 -0
  43. package/src/tools/task-get/tool.ts +11 -0
  44. package/src/tools/task-list/handler.ts +33 -0
  45. package/src/tools/task-list/tool.ts +9 -0
  46. package/src/tools/task-update/handler.ts +79 -0
  47. package/src/tools/task-update/tool.ts +20 -0
  48. package/src/tools/write/tool.ts +26 -0
  49. package/src/workflow.ts +138 -0
  50. package/tsup.config.ts +20 -0
  51. package/dist/index.d.mts +0 -152
  52. package/dist/index.mjs +0 -1587
  53. package/dist/index.mjs.map +0 -1
  54. package/dist/workflow-7_MT-5-w.d.mts +0 -1203
  55. package/dist/workflow-7_MT-5-w.d.ts +0 -1203
  56. package/dist/workflow.d.mts +0 -4
  57. package/dist/workflow.mjs +0 -739
  58. package/dist/workflow.mjs.map +0 -1
@@ -0,0 +1,11 @@
1
+ import z from "zod";
2
+
3
+ export const taskGetTool = {
4
+ name: "TaskGet" as const,
5
+ description: `Retrieve full task details including dependencies.`,
6
+ schema: z.object({
7
+ taskId: z.string().describe("The ID of the task to get"),
8
+ }),
9
+ };
10
+
11
+ export type TaskGetToolSchemaType = z.infer<typeof taskGetTool.schema>;
@@ -0,0 +1,33 @@
1
+ import type {
2
+ AgentStateManager,
3
+ JsonSerializable,
4
+ } from "../../lib/state-manager";
5
+ import type { ToolHandlerResponse } from "../../lib/tool-router";
6
+ import type { WorkflowTask } from "../../lib/types";
7
+ import type { TaskListToolSchemaType } from "./tool";
8
+
9
+ /**
10
+ * Creates a TaskList handler that returns all tasks.
11
+ *
12
+ * @param stateManager - State manager containing tasks state
13
+ * @returns A tool handler function
14
+ *
15
+ * @example
16
+ * const handler = createTaskListHandler(stateManager);
17
+ */
18
+ export function createTaskListHandler<
19
+ TCustom extends JsonSerializable<TCustom>,
20
+ >(
21
+ stateManager: AgentStateManager<TCustom>
22
+ ): (args: TaskListToolSchemaType) => ToolHandlerResponse<WorkflowTask[]> {
23
+ return (
24
+ _args: TaskListToolSchemaType
25
+ ): ToolHandlerResponse<WorkflowTask[]> => {
26
+ const taskList = stateManager.getTasks();
27
+
28
+ return {
29
+ content: JSON.stringify(taskList, null, 2),
30
+ result: taskList,
31
+ };
32
+ };
33
+ }
@@ -0,0 +1,9 @@
1
+ import z from "zod";
2
+
3
+ export const taskListTool = {
4
+ name: "TaskList" as const,
5
+ description: `List all tasks with current state.`,
6
+ schema: z.object({}),
7
+ };
8
+
9
+ export type TaskListToolSchemaType = z.infer<typeof taskListTool.schema>;
@@ -0,0 +1,79 @@
1
+ import type {
2
+ AgentStateManager,
3
+ JsonSerializable,
4
+ } from "../../lib/state-manager";
5
+ import type { ToolHandlerResponse } from "../../lib/tool-router";
6
+ import type { WorkflowTask } from "../../lib/types";
7
+ import type { TaskUpdateToolSchemaType } from "./tool";
8
+
9
+ /**
10
+ * Creates a TaskUpdate handler that modifies task status and dependencies.
11
+ *
12
+ * @param stateManager - State manager containing tasks state
13
+ * @returns A tool handler function
14
+ *
15
+ * @example
16
+ * const handler = createTaskUpdateHandler(stateManager);
17
+ */
18
+ export function createTaskUpdateHandler<
19
+ TCustom extends JsonSerializable<TCustom>,
20
+ >(
21
+ stateManager: AgentStateManager<TCustom>
22
+ ): (
23
+ args: TaskUpdateToolSchemaType
24
+ ) => ToolHandlerResponse<WorkflowTask | null> {
25
+ return (
26
+ args: TaskUpdateToolSchemaType
27
+ ): ToolHandlerResponse<WorkflowTask | null> => {
28
+ const task = stateManager.getTask(args.taskId);
29
+
30
+ if (!task) {
31
+ return {
32
+ content: JSON.stringify({ error: `Task not found: ${args.taskId}` }),
33
+ result: null,
34
+ };
35
+ }
36
+
37
+ // Update status if provided
38
+ if (args.status) {
39
+ task.status = args.status;
40
+ }
41
+
42
+ // Add blockedBy relationships (bidirectional)
43
+ if (args.addBlockedBy) {
44
+ for (const blockerId of args.addBlockedBy) {
45
+ if (!task.blockedBy.includes(blockerId)) {
46
+ task.blockedBy.push(blockerId);
47
+ }
48
+ // Update the blocker task's blocks array
49
+ const blockerTask = stateManager.getTask(blockerId);
50
+ if (blockerTask && !blockerTask.blocks.includes(task.id)) {
51
+ blockerTask.blocks.push(task.id);
52
+ stateManager.setTask(blockerTask);
53
+ }
54
+ }
55
+ }
56
+
57
+ // Add blocks relationships (bidirectional)
58
+ if (args.addBlocks) {
59
+ for (const blockedId of args.addBlocks) {
60
+ if (!task.blocks.includes(blockedId)) {
61
+ task.blocks.push(blockedId);
62
+ }
63
+ // Update the blocked task's blockedBy array
64
+ const blockedTask = stateManager.getTask(blockedId);
65
+ if (blockedTask && !blockedTask.blockedBy.includes(task.id)) {
66
+ blockedTask.blockedBy.push(task.id);
67
+ stateManager.setTask(blockedTask);
68
+ }
69
+ }
70
+ }
71
+
72
+ stateManager.setTask(task);
73
+
74
+ return {
75
+ content: JSON.stringify(task, null, 2),
76
+ result: task,
77
+ };
78
+ };
79
+ }
@@ -0,0 +1,20 @@
1
+ import z from "zod";
2
+
3
+ export const taskUpdateTool = {
4
+ name: "TaskUpdate" as const,
5
+ description: `Update status, add blockers, modify details.`,
6
+ schema: z.object({
7
+ taskId: z.string().describe("The ID of the task to get"),
8
+ status: z
9
+ .enum(["pending", "in_progress", "completed"])
10
+ .describe("The status of the task"),
11
+ addBlockedBy: z
12
+ .array(z.string())
13
+ .describe("The IDs of the tasks that are blocking this task"),
14
+ addBlocks: z
15
+ .array(z.string())
16
+ .describe("The IDs of the tasks that this task is blocking"),
17
+ }),
18
+ };
19
+
20
+ export type TaskUpdateToolSchemaType = z.infer<typeof taskUpdateTool.schema>;
@@ -0,0 +1,26 @@
1
+ import { z } from "zod";
2
+
3
+ export const writeTool = {
4
+ name: "FileWrite" as const,
5
+ description: `Create or overwrite a file with new content.
6
+
7
+ Usage:
8
+ - Provide the absolute virtual path to the file
9
+ - The file will be created if it doesn't exist
10
+ - If the file exists, it will be completely overwritten
11
+
12
+ IMPORTANT:
13
+ - You must read the file first (in this session) before writing to it
14
+ - This is an atomic write operation - the entire file is replaced
15
+ - Path must be absolute (e.g., "/docs/readme.md", not "docs/readme.md")
16
+ `,
17
+ schema: z.object({
18
+ file_path: z
19
+ .string()
20
+ .describe("The absolute virtual path to the file to write"),
21
+ content: z.string().describe("The content to write to the file"),
22
+ }),
23
+ strict: true,
24
+ };
25
+
26
+ export type WriteToolSchemaType = z.infer<typeof writeTool.schema>;
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Workflow-safe exports for use in Temporal workflow code.
3
+ *
4
+ * Import from '@bead-ai/zeitlich/workflow' in workflow files.
5
+ * These exports have no external dependencies (no Redis, no LangChain).
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * // In your workflow file
10
+ * import {
11
+ * createSession,
12
+ * createAgentStateManager,
13
+ * createToolRouter,
14
+ * } from '@bead-ai/zeitlich/workflow';
15
+ * ```
16
+ */
17
+
18
+ // Session
19
+ export { createSession } from "./lib/session";
20
+ export type { ZeitlichSession, SessionLifecycleHooks } from "./lib/session";
21
+
22
+ // State management
23
+ export {
24
+ createAgentStateManager,
25
+ AGENT_HANDLER_NAMES,
26
+ } from "./lib/state-manager";
27
+ export type {
28
+ AgentState,
29
+ AgentStateManager,
30
+ JsonSerializable,
31
+ JsonValue,
32
+ JsonPrimitive,
33
+ } from "./lib/state-manager";
34
+
35
+ // Tool router (includes registry functionality)
36
+ export { createToolRouter, hasNoOtherToolCalls } from "./lib/tool-router";
37
+ export type {
38
+ // Tool definition types
39
+ ToolDefinition,
40
+ ToolWithHandler,
41
+ ToolMap,
42
+ ToolNames,
43
+ RawToolCall,
44
+ ParsedToolCall,
45
+ ParsedToolCallUnion,
46
+ // Router types
47
+ ToolRouter,
48
+ // Handler types
49
+ ToolHandler,
50
+ ActivityToolHandler,
51
+ ToolHandlerContext,
52
+ ToolHandlerResponse,
53
+ // Result types
54
+ ToolArgs,
55
+ ToolResult,
56
+ ToolCallResult,
57
+ ToolCallResultUnion,
58
+ InferToolResults,
59
+ // Other
60
+ ToolMessageContent,
61
+ AppendToolResultFn,
62
+ ProcessToolCallsContext,
63
+ } from "./lib/tool-router";
64
+
65
+ // Types
66
+ export type {
67
+ AgentStatus,
68
+ BaseAgentState,
69
+ AgentFile,
70
+ AgentResponse,
71
+ ZeitlichAgentConfig,
72
+ RunAgentConfig,
73
+ RunAgentActivity,
74
+ ToolResultConfig,
75
+ SessionExitReason,
76
+ PreToolUseHook,
77
+ PreToolUseHookContext,
78
+ PreToolUseHookResult,
79
+ PostToolUseHook,
80
+ PostToolUseHookContext,
81
+ PostToolUseFailureHook,
82
+ PostToolUseFailureHookContext,
83
+ PostToolUseFailureHookResult,
84
+ SessionStartHook,
85
+ SessionStartHookContext,
86
+ SessionEndHook,
87
+ SessionEndHookContext,
88
+ SubagentConfig,
89
+ SubagentInput,
90
+ TaskStatus,
91
+ WorkflowTask,
92
+ } from "./lib/types";
93
+ export { isTerminalStatus } from "./lib/types";
94
+
95
+ // Subagent support
96
+ export { createTaskTool } from "./tools/task/tool";
97
+ export type {
98
+ TaskToolSchemaType,
99
+ GenericTaskToolSchemaType,
100
+ } from "./tools/task/tool";
101
+ export type { TaskHandlerResult } from "./tools/task/handler";
102
+
103
+ // Activity type interfaces (types only, no runtime code)
104
+ // These are safe to import in workflows for typing proxyActivities
105
+ export type { ZeitlichSharedActivities } from "./activities";
106
+
107
+ // Tool definitions (schemas only - no handlers)
108
+ export { askUserQuestionTool } from "./tools/ask-user-question/tool";
109
+ export type { AskUserQuestionToolSchemaType } from "./tools/ask-user-question/tool";
110
+ export { globTool } from "./tools/glob/tool";
111
+ export type { GlobToolSchemaType } from "./tools/glob/tool";
112
+ export { grepTool } from "./tools/grep/tool";
113
+ export type { GrepToolSchemaType } from "./tools/grep/tool";
114
+ export { readTool } from "./tools/read/tool";
115
+ export type { ReadToolSchemaType } from "./tools/read/tool";
116
+ export { writeTool } from "./tools/write/tool";
117
+ export type { WriteToolSchemaType } from "./tools/write/tool";
118
+ export { editTool } from "./tools/edit/tool";
119
+ export type { EditToolSchemaType } from "./tools/edit/tool";
120
+
121
+ // Workflow task tools (state-only, no activities needed)
122
+ export { taskCreateTool } from "./tools/task-create/tool";
123
+ export type { TaskCreateToolSchemaType } from "./tools/task-create/tool";
124
+ export { createTaskCreateHandler } from "./tools/task-create/handler";
125
+
126
+ export { taskGetTool } from "./tools/task-get/tool";
127
+ export type { TaskGetToolSchemaType } from "./tools/task-get/tool";
128
+ export { createTaskGetHandler } from "./tools/task-get/handler";
129
+
130
+ export { taskListTool } from "./tools/task-list/tool";
131
+ export { createTaskListHandler } from "./tools/task-list/handler";
132
+
133
+ export { taskUpdateTool } from "./tools/task-update/tool";
134
+ export type { TaskUpdateToolSchemaType } from "./tools/task-update/tool";
135
+ export { createTaskUpdateHandler } from "./tools/task-update/handler";
136
+
137
+ export { bashTool } from "./tools/bash/tool";
138
+ export type { bashToolSchemaType } from "./tools/bash/tool";
package/tsup.config.ts ADDED
@@ -0,0 +1,20 @@
1
+ import { defineConfig } from "tsup";
2
+
3
+ export default defineConfig({
4
+ entry: {
5
+ index: "src/index.ts",
6
+ workflow: "src/workflow.ts",
7
+ },
8
+ format: ["cjs", "esm"],
9
+ dts: true,
10
+ clean: true,
11
+ sourcemap: true,
12
+ splitting: false,
13
+ treeshake: true,
14
+ outDir: "dist",
15
+ external: [
16
+ /^@temporalio\//,
17
+ /^@langchain\//,
18
+ "ioredis",
19
+ ],
20
+ });
package/dist/index.d.mts DELETED
@@ -1,152 +0,0 @@
1
- import { T as ToolDefinition, I as InvocationConfig, A as AgentResponse, a as ActivityToolHandler, b as AskUserQuestionToolSchemaType, F as FileSystemProvider, c as FileNode, G as GlobToolSchemaType, d as GrepToolSchemaType, e as GrepMatch, R as ReadToolSchemaType, f as FileContent, W as WriteToolSchemaType, E as EditToolSchemaType } from './workflow-7_MT-5-w.mjs';
2
- export { g as AGENT_HANDLER_NAMES, h as AgentFile, i as AgentState, j as AgentStateManager, k as AgentStateManagerConfig, l as AgentStatus, m as AppendToolResultFn, B as BackendConfig, n as BaseAgentState, o as BaseFileSystemProvider, C as CompositeFileSystemProvider, p as FileResolver, q as FileSystemToolsConfig, r as FileTreeRenderOptions, s as GenericTaskToolSchemaType, t as GrepOptions, u as InMemoryFileSystemProvider, J as JsonPrimitive, v as JsonSerializable, w as JsonValue, P as ParsedToolCall, x as ParsedToolCallUnion, y as PostToolUseFailureHook, z as PostToolUseFailureHookContext, D as PostToolUseFailureHookResult, H as PostToolUseHook, K as PostToolUseHookContext, L as PreToolUseHook, M as PreToolUseHookContext, N as PreToolUseHookResult, O as ProcessToolCallsContext, Q as PromptManager, S as PromptManagerConfig, U as RawToolCall, V as RunAgentActivity, X as RunAgentConfig, Y as SessionEndHook, Z as SessionEndHookContext, _ as SessionExitReason, $ as SessionHooks, a0 as SessionLifecycleHooks, a1 as SessionStartHook, a2 as SessionStartHookContext, a3 as SubagentConfig, a4 as SubagentInput, a5 as SubagentSupportConfig, a6 as SubagentSupportResult, a7 as TaskHandlerResult, a8 as TaskToolSchemaType, a9 as ToolCallResult, aa as ToolCallResultUnion, ab as ToolHandler, ac as ToolHandlerMap, ad as ToolHandlerResponse, ae as ToolMap, af as ToolMessageContent, ag as ToolNames, ah as ToolRegistry, ai as ToolResultConfig, aj as ToolRouter, ak as ToolRouterHooks, al as ToolRouterOptions, am as ZeitlichAgentConfig, an as ZeitlichSession, ao as ZeitlichSharedActivities, ap as askUserQuestionTool, aq as buildFileTreePrompt, ar as createAgentStateManager, as as createPromptManager, at as createSession, au as createSharedActivities, av as createTaskHandler, aw as createTaskTool, ax as createToolRegistry, ay as createToolRouter, az as editTool, aA as fileContentToMessageContent, aB as findNodeByPath, aC as flattenFileTree, aD as globTool, aE as grepTool, aF as hasNoOtherToolCalls, aG as hasTaskTool, aH as isPathInScope, aI as isTerminalStatus, aJ as readTool, aK as withSubagentSupport, aL as writeTool } from './workflow-7_MT-5-w.mjs';
3
- import { SimplePlugin } from '@temporalio/plugin';
4
- import Redis from 'ioredis';
5
- import { BaseChatModel, BaseChatModelCallOptions, BindToolsInput } from '@langchain/core/language_models/chat_models';
6
- import { StoredMessage, ContentBlock } from '@langchain/core/messages';
7
- import 'zod';
8
-
9
- /**
10
- * Options for the Zeitlich plugin
11
- *
12
- * @experimental The Zeitlich plugin is an experimental feature; APIs may change without notice.
13
- */
14
- interface ZeitlichPluginOptions {
15
- redis: Redis;
16
- }
17
- /**
18
- * A Temporal plugin that integrates Zeitlich for use in workflows.
19
- * This plugin creates shared activities for thread management.
20
- * Workflow-specific activities (like runAgent) should be created separately.
21
- *
22
- * @experimental The Zeitlich plugin is an experimental feature; APIs may change without notice.
23
- */
24
- declare class ZeitlichPlugin extends SimplePlugin {
25
- constructor(options: ZeitlichPluginOptions);
26
- }
27
-
28
- /**
29
- * Configuration for invoking the model
30
- */
31
- interface InvokeModelConfig {
32
- threadId: string;
33
- agentName: string;
34
- tools: ToolDefinition[];
35
- }
36
- /**
37
- * Core model invocation logic - shared utility for workflow-specific activities
38
- *
39
- * @param redis - Redis client for thread management
40
- * @param config - Model invocation configuration
41
- * @param model - Pre-instantiated LangChain chat model
42
- * @param invocationConfig - Per-invocation configuration (system prompt, etc.)
43
- * @returns Agent response with message and metadata
44
- */
45
- declare function invokeModel(redis: Redis, { threadId, agentName, tools }: InvokeModelConfig, model: BaseChatModel<BaseChatModelCallOptions & {
46
- tools?: BindToolsInput;
47
- }>, { systemPrompt }: InvocationConfig): Promise<AgentResponse>;
48
-
49
- /**
50
- * Handle user interaction tool result - creates AI messages for display.
51
- */
52
- declare const handleAskUserQuestionToolResult: ActivityToolHandler<AskUserQuestionToolSchemaType, {
53
- chatMessages: StoredMessage[];
54
- }>;
55
-
56
- interface GlobHandlerConfig {
57
- provider: FileSystemProvider;
58
- scopedNodes: FileNode[];
59
- }
60
- /**
61
- * Create a glob handler that searches within the scoped file tree.
62
- */
63
- declare function createGlobHandler(config: GlobHandlerConfig): (args: GlobToolSchemaType) => Promise<{
64
- content: string;
65
- result: {
66
- files: FileNode[];
67
- };
68
- }>;
69
-
70
- interface GrepHandlerConfig {
71
- provider: FileSystemProvider;
72
- scopedNodes: FileNode[];
73
- }
74
- /**
75
- * Create a grep handler that searches within the scoped file tree.
76
- */
77
- declare function createGrepHandler(config: GrepHandlerConfig): (args: GrepToolSchemaType) => Promise<{
78
- content: string;
79
- result: {
80
- matches: GrepMatch[];
81
- };
82
- }>;
83
-
84
- interface ReadHandlerConfig {
85
- provider: FileSystemProvider;
86
- scopedNodes: FileNode[];
87
- }
88
- /**
89
- * Create a read handler that reads files within the scoped file tree.
90
- */
91
- declare function createReadHandler(config: ReadHandlerConfig): (args: ReadToolSchemaType) => Promise<{
92
- content: ContentBlock[];
93
- result: {
94
- path: string;
95
- content: FileContent;
96
- };
97
- }>;
98
-
99
- interface WriteHandlerConfig {
100
- provider: FileSystemProvider;
101
- scopedNodes: FileNode[];
102
- /**
103
- * Set of file paths that have been read in this session.
104
- * Required for enforcing read-before-write policy.
105
- */
106
- readFiles: Set<string>;
107
- /**
108
- * If true, skip the read-before-write check (not recommended)
109
- */
110
- skipReadCheck?: boolean;
111
- }
112
- interface WriteResult {
113
- path: string;
114
- success: boolean;
115
- created: boolean;
116
- bytesWritten: number;
117
- }
118
- /**
119
- * Create a write handler that writes files within the scoped file tree.
120
- */
121
- declare function createWriteHandler(config: WriteHandlerConfig): (args: WriteToolSchemaType) => Promise<{
122
- content: string;
123
- result: WriteResult;
124
- }>;
125
-
126
- interface EditHandlerConfig {
127
- provider: FileSystemProvider;
128
- scopedNodes: FileNode[];
129
- /**
130
- * Set of file paths that have been read in this session.
131
- * Required for enforcing read-before-write policy.
132
- */
133
- readFiles: Set<string>;
134
- /**
135
- * If true, skip the read-before-write check (not recommended)
136
- */
137
- skipReadCheck?: boolean;
138
- }
139
- interface EditResult {
140
- path: string;
141
- success: boolean;
142
- replacements: number;
143
- }
144
- /**
145
- * Create an edit handler that edits files within the scoped file tree.
146
- */
147
- declare function createEditHandler(config: EditHandlerConfig): (args: EditToolSchemaType) => Promise<{
148
- content: string;
149
- result: EditResult;
150
- }>;
151
-
152
- export { ActivityToolHandler, AgentResponse, AskUserQuestionToolSchemaType, type EditHandlerConfig, type EditResult, EditToolSchemaType, FileContent, FileNode, FileSystemProvider, type GlobHandlerConfig, GlobToolSchemaType, type GrepHandlerConfig, GrepMatch, GrepToolSchemaType, InvocationConfig, type InvokeModelConfig, type ReadHandlerConfig, ReadToolSchemaType, ToolDefinition, type WriteHandlerConfig, type WriteResult, WriteToolSchemaType, ZeitlichPlugin, type ZeitlichPluginOptions, createEditHandler, createGlobHandler, createGrepHandler, createReadHandler, createWriteHandler, handleAskUserQuestionToolResult, invokeModel };