dot-agents 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +238 -0
- package/dist/cli/commands/daemon.d.ts +3 -0
- package/dist/cli/commands/daemon.d.ts.map +1 -0
- package/dist/cli/commands/daemon.js +179 -0
- package/dist/cli/commands/daemon.js.map +1 -0
- package/dist/cli/commands/index.d.ts +6 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/index.js +6 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/list.d.ts +3 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +100 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/run.d.ts +3 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +107 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/schedule.d.ts +3 -0
- package/dist/cli/commands/schedule.d.ts.map +1 -0
- package/dist/cli/commands/schedule.js +172 -0
- package/dist/cli/commands/schedule.js.map +1 -0
- package/dist/cli/commands/show.d.ts +3 -0
- package/dist/cli/commands/show.d.ts.map +1 -0
- package/dist/cli/commands/show.js +122 -0
- package/dist/cli/commands/show.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +38 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/lib/index.d.ts +2 -0
- package/dist/cli/lib/index.d.ts.map +1 -0
- package/dist/cli/lib/index.js +2 -0
- package/dist/cli/lib/index.js.map +1 -0
- package/dist/cli/lib/runner.d.ts +41 -0
- package/dist/cli/lib/runner.d.ts.map +1 -0
- package/dist/cli/lib/runner.js +179 -0
- package/dist/cli/lib/runner.js.map +1 -0
- package/dist/daemon/api/index.d.ts +2 -0
- package/dist/daemon/api/index.d.ts.map +1 -0
- package/dist/daemon/api/index.js +2 -0
- package/dist/daemon/api/index.js.map +1 -0
- package/dist/daemon/api/server.d.ts +12 -0
- package/dist/daemon/api/server.d.ts.map +1 -0
- package/dist/daemon/api/server.js +111 -0
- package/dist/daemon/api/server.js.map +1 -0
- package/dist/daemon/daemon.d.ts +95 -0
- package/dist/daemon/daemon.d.ts.map +1 -0
- package/dist/daemon/daemon.js +265 -0
- package/dist/daemon/daemon.js.map +1 -0
- package/dist/daemon/index.d.ts +4 -0
- package/dist/daemon/index.d.ts.map +1 -0
- package/dist/daemon/index.js +4 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/daemon/lib/executor.d.ts +17 -0
- package/dist/daemon/lib/executor.d.ts.map +1 -0
- package/dist/daemon/lib/executor.js +169 -0
- package/dist/daemon/lib/executor.js.map +1 -0
- package/dist/daemon/lib/index.d.ts +4 -0
- package/dist/daemon/lib/index.d.ts.map +1 -0
- package/dist/daemon/lib/index.js +4 -0
- package/dist/daemon/lib/index.js.map +1 -0
- package/dist/daemon/lib/scheduler.d.ts +90 -0
- package/dist/daemon/lib/scheduler.d.ts.map +1 -0
- package/dist/daemon/lib/scheduler.js +176 -0
- package/dist/daemon/lib/scheduler.js.map +1 -0
- package/dist/daemon/lib/watcher.d.ts +48 -0
- package/dist/daemon/lib/watcher.d.ts.map +1 -0
- package/dist/daemon/lib/watcher.js +77 -0
- package/dist/daemon/lib/watcher.js.map +1 -0
- package/dist/lib/config.d.ts +14 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +76 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/frontmatter.d.ts +18 -0
- package/dist/lib/frontmatter.d.ts.map +1 -0
- package/dist/lib/frontmatter.js +26 -0
- package/dist/lib/frontmatter.js.map +1 -0
- package/dist/lib/index.d.ts +7 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +9 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/persona.d.ts +32 -0
- package/dist/lib/persona.d.ts.map +1 -0
- package/dist/lib/persona.js +177 -0
- package/dist/lib/persona.js.map +1 -0
- package/dist/lib/types/index.d.ts +69 -0
- package/dist/lib/types/index.d.ts.map +1 -0
- package/dist/lib/types/index.js +4 -0
- package/dist/lib/types/index.js.map +1 -0
- package/dist/lib/types/persona.d.ts +46 -0
- package/dist/lib/types/persona.d.ts.map +1 -0
- package/dist/lib/types/persona.js +2 -0
- package/dist/lib/types/persona.js.map +1 -0
- package/dist/lib/types/triggers.d.ts +96 -0
- package/dist/lib/types/triggers.d.ts.map +1 -0
- package/dist/lib/types/triggers.js +2 -0
- package/dist/lib/types/triggers.js.map +1 -0
- package/dist/lib/types/workflow.d.ts +75 -0
- package/dist/lib/types/workflow.d.ts.map +1 -0
- package/dist/lib/types/workflow.js +2 -0
- package/dist/lib/types/workflow.js.map +1 -0
- package/dist/lib/variables.d.ts +28 -0
- package/dist/lib/variables.d.ts.map +1 -0
- package/dist/lib/variables.js +113 -0
- package/dist/lib/variables.js.map +1 -0
- package/dist/lib/workflow.d.ts +29 -0
- package/dist/lib/workflow.d.ts.map +1 -0
- package/dist/lib/workflow.js +155 -0
- package/dist/lib/workflow.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate a unique run ID
|
|
3
|
+
*/
|
|
4
|
+
export function generateRunId() {
|
|
5
|
+
const timestamp = Date.now().toString(36);
|
|
6
|
+
const random = Math.random().toString(36).substring(2, 8);
|
|
7
|
+
return `${timestamp}-${random}`;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Create execution context with built-in variables
|
|
11
|
+
*/
|
|
12
|
+
export function createExecutionContext(overrides = {}) {
|
|
13
|
+
const now = new Date();
|
|
14
|
+
return {
|
|
15
|
+
DATE: now.toISOString().split("T")[0],
|
|
16
|
+
DATETIME: now.toISOString(),
|
|
17
|
+
TIME: now.toTimeString().split(" ")[0],
|
|
18
|
+
RUN_ID: generateRunId(),
|
|
19
|
+
...overrides,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Expand environment variables in a string
|
|
24
|
+
* Supports ${VAR} syntax
|
|
25
|
+
*/
|
|
26
|
+
export function expandVariables(template, context, env = process.env) {
|
|
27
|
+
// Combined context: explicit context takes precedence over env
|
|
28
|
+
const combined = { ...env, ...context };
|
|
29
|
+
return template.replace(/\$\{([^}]+)\}/g, (match, varName) => {
|
|
30
|
+
const value = combined[varName];
|
|
31
|
+
if (value !== undefined) {
|
|
32
|
+
return value;
|
|
33
|
+
}
|
|
34
|
+
// Leave unmatched variables as-is
|
|
35
|
+
return match;
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Expand variables in an object's string values (recursive)
|
|
40
|
+
*/
|
|
41
|
+
export function expandObjectVariables(obj, context, env) {
|
|
42
|
+
const result = {};
|
|
43
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
44
|
+
if (typeof value === "string") {
|
|
45
|
+
result[key] = expandVariables(value, context, env);
|
|
46
|
+
}
|
|
47
|
+
else if (Array.isArray(value)) {
|
|
48
|
+
result[key] = value.map((item) => typeof item === "string"
|
|
49
|
+
? expandVariables(item, context, env)
|
|
50
|
+
: typeof item === "object" && item !== null
|
|
51
|
+
? expandObjectVariables(item, context, env)
|
|
52
|
+
: item);
|
|
53
|
+
}
|
|
54
|
+
else if (typeof value === "object" && value !== null) {
|
|
55
|
+
result[key] = expandObjectVariables(value, context, env);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
result[key] = value;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Process simple conditionals in a template
|
|
65
|
+
* Supports: {{#if var}}...{{/if}} and {{#unless var}}...{{/unless}}
|
|
66
|
+
*/
|
|
67
|
+
export function processConditionals(template, context) {
|
|
68
|
+
let result = template;
|
|
69
|
+
// Process {{#if var}}...{{/if}}
|
|
70
|
+
result = result.replace(/\{\{#if\s+(\w+)\s*\}\}([\s\S]*?)\{\{\/if\}\}/g, (_, varName, content) => {
|
|
71
|
+
const value = context[varName];
|
|
72
|
+
// Truthy check: exists and not empty string/false/0
|
|
73
|
+
if (value && value !== "" && value !== false && value !== 0) {
|
|
74
|
+
return content;
|
|
75
|
+
}
|
|
76
|
+
return "";
|
|
77
|
+
});
|
|
78
|
+
// Process {{#unless var}}...{{/unless}}
|
|
79
|
+
result = result.replace(/\{\{#unless\s+(\w+)\s*\}\}([\s\S]*?)\{\{\/unless\}\}/g, (_, varName, content) => {
|
|
80
|
+
const value = context[varName];
|
|
81
|
+
// Falsy check
|
|
82
|
+
if (!value || value === "" || value === false || value === 0) {
|
|
83
|
+
return content;
|
|
84
|
+
}
|
|
85
|
+
return "";
|
|
86
|
+
});
|
|
87
|
+
// Process {{#if var == "value"}}...{{/if}}
|
|
88
|
+
result = result.replace(/\{\{#if\s+(\w+)\s*==\s*"([^"]+)"\s*\}\}([\s\S]*?)\{\{\/if\}\}/g, (_, varName, compareValue, content) => {
|
|
89
|
+
const value = context[varName];
|
|
90
|
+
if (String(value) === compareValue) {
|
|
91
|
+
return content;
|
|
92
|
+
}
|
|
93
|
+
return "";
|
|
94
|
+
});
|
|
95
|
+
return result;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Full template processing: conditionals then variable expansion
|
|
99
|
+
*/
|
|
100
|
+
export function processTemplate(template, context, env) {
|
|
101
|
+
// First process conditionals
|
|
102
|
+
let result = processConditionals(template, context);
|
|
103
|
+
// Then expand variables
|
|
104
|
+
const stringContext = {};
|
|
105
|
+
for (const [key, value] of Object.entries(context)) {
|
|
106
|
+
if (value !== undefined && value !== null) {
|
|
107
|
+
stringContext[key] = String(value);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
result = expandVariables(result, stringContext, env);
|
|
111
|
+
return result;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=variables.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variables.js","sourceRoot":"","sources":["../../src/lib/variables.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Workflow } from "./types/workflow.js";
|
|
2
|
+
/**
|
|
3
|
+
* Load a single workflow file
|
|
4
|
+
*/
|
|
5
|
+
export declare function loadWorkflow(workflowPath: string): Promise<Workflow>;
|
|
6
|
+
/**
|
|
7
|
+
* List all workflows in a directory (recursive)
|
|
8
|
+
*/
|
|
9
|
+
export declare function listWorkflows(workflowsRoot: string): Promise<string[]>;
|
|
10
|
+
/**
|
|
11
|
+
* Find a workflow by name
|
|
12
|
+
*/
|
|
13
|
+
export declare function findWorkflow(name: string, workflowsRoot: string): Promise<Workflow | null>;
|
|
14
|
+
/**
|
|
15
|
+
* Get all scheduled workflows
|
|
16
|
+
*/
|
|
17
|
+
export declare function getScheduledWorkflows(workflowsRoot: string): Promise<Workflow[]>;
|
|
18
|
+
/**
|
|
19
|
+
* Validate workflow inputs against definition
|
|
20
|
+
*/
|
|
21
|
+
export declare function validateInputs(workflow: Workflow, inputs: Record<string, unknown>): {
|
|
22
|
+
valid: boolean;
|
|
23
|
+
errors: string[];
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Get default values for workflow inputs
|
|
27
|
+
*/
|
|
28
|
+
export declare function getInputDefaults(workflow: Workflow): Record<string, string | number | boolean>;
|
|
29
|
+
//# sourceMappingURL=workflow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../src/lib/workflow.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAuB,MAAM,qBAAqB,CAAC;AAIzE;;GAEG;AACH,wBAAsB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CA+B1E;AAeD;;GAEG;AACH,wBAAsB,aAAa,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAuB5E;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAe1B;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAgBrB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CA2CtC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,QAAQ,GACjB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAU3C"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { readdir, stat } from "node:fs/promises";
|
|
2
|
+
import { join, dirname } from "node:path";
|
|
3
|
+
import { loadMarkdownFile } from "./frontmatter.js";
|
|
4
|
+
const WORKFLOW_FILENAME = "WORKFLOW.md";
|
|
5
|
+
/**
|
|
6
|
+
* Load a single workflow file
|
|
7
|
+
*/
|
|
8
|
+
export async function loadWorkflow(workflowPath) {
|
|
9
|
+
const filePath = workflowPath.endsWith(WORKFLOW_FILENAME)
|
|
10
|
+
? workflowPath
|
|
11
|
+
: join(workflowPath, WORKFLOW_FILENAME);
|
|
12
|
+
const { frontmatter, body } = await loadMarkdownFile(filePath);
|
|
13
|
+
if (!frontmatter.name) {
|
|
14
|
+
throw new Error(`Workflow missing required 'name' field: ${filePath}`);
|
|
15
|
+
}
|
|
16
|
+
if (!frontmatter.description) {
|
|
17
|
+
throw new Error(`Workflow missing required 'description' field: ${filePath}`);
|
|
18
|
+
}
|
|
19
|
+
if (!frontmatter.persona) {
|
|
20
|
+
throw new Error(`Workflow missing required 'persona' field: ${filePath}`);
|
|
21
|
+
}
|
|
22
|
+
if (!body) {
|
|
23
|
+
throw new Error(`Workflow missing task body: ${filePath}`);
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
...frontmatter,
|
|
27
|
+
path: dirname(filePath),
|
|
28
|
+
task: body,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Check if a directory contains a WORKFLOW.md file
|
|
33
|
+
*/
|
|
34
|
+
async function hasWorkflowFile(dirPath) {
|
|
35
|
+
try {
|
|
36
|
+
const filePath = join(dirPath, WORKFLOW_FILENAME);
|
|
37
|
+
const stats = await stat(filePath);
|
|
38
|
+
return stats.isFile();
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* List all workflows in a directory (recursive)
|
|
46
|
+
*/
|
|
47
|
+
export async function listWorkflows(workflowsRoot) {
|
|
48
|
+
const workflows = [];
|
|
49
|
+
async function scanDir(dir) {
|
|
50
|
+
try {
|
|
51
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
52
|
+
for (const entry of entries) {
|
|
53
|
+
if (entry.isDirectory()) {
|
|
54
|
+
const subDir = join(dir, entry.name);
|
|
55
|
+
if (await hasWorkflowFile(subDir)) {
|
|
56
|
+
workflows.push(subDir);
|
|
57
|
+
}
|
|
58
|
+
await scanDir(subDir);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// Directory doesn't exist or not readable
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
await scanDir(workflowsRoot);
|
|
67
|
+
return workflows;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Find a workflow by name
|
|
71
|
+
*/
|
|
72
|
+
export async function findWorkflow(name, workflowsRoot) {
|
|
73
|
+
const workflowPaths = await listWorkflows(workflowsRoot);
|
|
74
|
+
for (const workflowPath of workflowPaths) {
|
|
75
|
+
try {
|
|
76
|
+
const workflow = await loadWorkflow(workflowPath);
|
|
77
|
+
if (workflow.name === name) {
|
|
78
|
+
return workflow;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// Skip invalid workflows
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Get all scheduled workflows
|
|
89
|
+
*/
|
|
90
|
+
export async function getScheduledWorkflows(workflowsRoot) {
|
|
91
|
+
const workflowPaths = await listWorkflows(workflowsRoot);
|
|
92
|
+
const scheduled = [];
|
|
93
|
+
for (const workflowPath of workflowPaths) {
|
|
94
|
+
try {
|
|
95
|
+
const workflow = await loadWorkflow(workflowPath);
|
|
96
|
+
if (workflow.on?.schedule && workflow.on.schedule.length > 0) {
|
|
97
|
+
scheduled.push(workflow);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// Skip invalid workflows
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return scheduled;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Validate workflow inputs against definition
|
|
108
|
+
*/
|
|
109
|
+
export function validateInputs(workflow, inputs) {
|
|
110
|
+
const errors = [];
|
|
111
|
+
for (const inputDef of workflow.inputs ?? []) {
|
|
112
|
+
const value = inputs[inputDef.name];
|
|
113
|
+
// Check required
|
|
114
|
+
if (inputDef.required && value === undefined) {
|
|
115
|
+
errors.push(`Missing required input: ${inputDef.name}`);
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
// Skip validation for undefined optional inputs
|
|
119
|
+
if (value === undefined)
|
|
120
|
+
continue;
|
|
121
|
+
// Type validation
|
|
122
|
+
if (inputDef.type) {
|
|
123
|
+
const actualType = typeof value;
|
|
124
|
+
if (inputDef.type === "path") {
|
|
125
|
+
if (actualType !== "string") {
|
|
126
|
+
errors.push(`Input '${inputDef.name}' must be a path (string), got ${actualType}`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
else if (actualType !== inputDef.type) {
|
|
130
|
+
errors.push(`Input '${inputDef.name}' must be ${inputDef.type}, got ${actualType}`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Enum validation
|
|
134
|
+
if (inputDef.enum && !inputDef.enum.includes(value)) {
|
|
135
|
+
errors.push(`Input '${inputDef.name}' must be one of: ${inputDef.enum.join(", ")}`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return {
|
|
139
|
+
valid: errors.length === 0,
|
|
140
|
+
errors,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Get default values for workflow inputs
|
|
145
|
+
*/
|
|
146
|
+
export function getInputDefaults(workflow) {
|
|
147
|
+
const defaults = {};
|
|
148
|
+
for (const inputDef of workflow.inputs ?? []) {
|
|
149
|
+
if (inputDef.default !== undefined) {
|
|
150
|
+
defaults[inputDef.name] = inputDef.default;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return defaults;
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=workflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../src/lib/workflow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGpD,MAAM,iBAAiB,GAAG,aAAa,CAAC;AAExC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,YAAoB;IACrD,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QACvD,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;IAE1C,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GACzB,MAAM,gBAAgB,CAAsB,QAAQ,CAAC,CAAC;IAExD,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,2CAA2C,QAAQ,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,kDAAkD,QAAQ,EAAE,CAC7D,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,8CAA8C,QAAQ,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO;QACL,GAAG,WAAW;QACd,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC;QACvB,IAAI,EAAE,IAAI;KACX,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,eAAe,CAAC,OAAe;IAC5C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnC,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,aAAqB;IACvD,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,KAAK,UAAU,OAAO,CAAC,GAAW;QAChC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAE5D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;oBACxB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;oBACrC,IAAI,MAAM,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;wBAClC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACzB,CAAC;oBACD,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,0CAA0C;QAC5C,CAAC;IACH,CAAC;IAED,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC;IAC7B,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAY,EACZ,aAAqB;IAErB,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,aAAa,CAAC,CAAC;IAEzD,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC,CAAC;YAClD,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;gBAC3B,OAAO,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,yBAAyB;QAC3B,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,aAAqB;IAErB,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,aAAa,CAAC,CAAC;IACzD,MAAM,SAAS,GAAe,EAAE,CAAC;IAEjC,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC,CAAC;YAClD,IAAI,QAAQ,CAAC,EAAE,EAAE,QAAQ,IAAI,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7D,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,yBAAyB;QAC3B,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,QAAkB,EAClB,MAA+B;IAE/B,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,QAAQ,IAAI,QAAQ,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAEpC,iBAAiB;QACjB,IAAI,QAAQ,CAAC,QAAQ,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAC7C,MAAM,CAAC,IAAI,CAAC,2BAA2B,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;YACxD,SAAS;QACX,CAAC;QAED,gDAAgD;QAChD,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAElC,kBAAkB;QAClB,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAClB,MAAM,UAAU,GAAG,OAAO,KAAK,CAAC;YAChC,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC7B,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;oBAC5B,MAAM,CAAC,IAAI,CACT,UAAU,QAAQ,CAAC,IAAI,kCAAkC,UAAU,EAAE,CACtE,CAAC;gBACJ,CAAC;YACH,CAAC;iBAAM,IAAI,UAAU,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACxC,MAAM,CAAC,IAAI,CACT,UAAU,QAAQ,CAAC,IAAI,aAAa,QAAQ,CAAC,IAAI,SAAS,UAAU,EAAE,CACvE,CAAC;YACJ,CAAC;QACH,CAAC;QAED,kBAAkB;QAClB,IAAI,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAwB,CAAC,EAAE,CAAC;YACvE,MAAM,CAAC,IAAI,CACT,UAAU,QAAQ,CAAC,IAAI,qBAAqB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACvE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QAC1B,MAAM;KACP,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,QAAkB;IAElB,MAAM,QAAQ,GAA8C,EAAE,CAAC;IAE/D,KAAK,MAAM,QAAQ,IAAI,QAAQ,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QAC7C,IAAI,QAAQ,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YACnC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "dot-agents",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "A framework for building agentic workflows with personas and scheduled execution",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/lib/index.js",
|
|
7
|
+
"types": "./dist/lib/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"dot-agents": "./dist/cli/index.js"
|
|
10
|
+
},
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/lib/index.d.ts",
|
|
14
|
+
"import": "./dist/lib/index.js"
|
|
15
|
+
},
|
|
16
|
+
"./daemon": {
|
|
17
|
+
"types": "./dist/daemon/index.d.ts",
|
|
18
|
+
"import": "./dist/daemon/index.js"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsc",
|
|
23
|
+
"dev": "tsc --watch",
|
|
24
|
+
"typecheck": "tsc --noEmit",
|
|
25
|
+
"clean": "rm -rf dist *.tsbuildinfo",
|
|
26
|
+
"prepublishOnly": "npm run clean && npm run build"
|
|
27
|
+
},
|
|
28
|
+
"files": [
|
|
29
|
+
"dist",
|
|
30
|
+
"README.md",
|
|
31
|
+
"LICENSE"
|
|
32
|
+
],
|
|
33
|
+
"repository": {
|
|
34
|
+
"type": "git",
|
|
35
|
+
"url": "git+https://github.com/tnez/dot-agents.git"
|
|
36
|
+
},
|
|
37
|
+
"homepage": "https://github.com/tnez/dot-agents#readme",
|
|
38
|
+
"bugs": {
|
|
39
|
+
"url": "https://github.com/tnez/dot-agents/issues"
|
|
40
|
+
},
|
|
41
|
+
"author": "tnez",
|
|
42
|
+
"license": "MIT",
|
|
43
|
+
"keywords": [
|
|
44
|
+
"agents",
|
|
45
|
+
"ai",
|
|
46
|
+
"workflows",
|
|
47
|
+
"automation",
|
|
48
|
+
"claude",
|
|
49
|
+
"llm",
|
|
50
|
+
"cli"
|
|
51
|
+
],
|
|
52
|
+
"engines": {
|
|
53
|
+
"node": ">=20.0.0"
|
|
54
|
+
},
|
|
55
|
+
"dependencies": {
|
|
56
|
+
"chalk": "^5.3.0",
|
|
57
|
+
"chokidar": "^4.0.1",
|
|
58
|
+
"commander": "^12.1.0",
|
|
59
|
+
"cron": "^3.1.7",
|
|
60
|
+
"execa": "^9.5.1",
|
|
61
|
+
"express": "^4.21.1",
|
|
62
|
+
"glob": "^11.0.0",
|
|
63
|
+
"handlebars": "^4.7.8",
|
|
64
|
+
"yaml": "^2.6.1"
|
|
65
|
+
},
|
|
66
|
+
"devDependencies": {
|
|
67
|
+
"@types/express": "^5.0.0",
|
|
68
|
+
"@types/node": "^22.10.1",
|
|
69
|
+
"typescript": "^5.7.2"
|
|
70
|
+
}
|
|
71
|
+
}
|