agent-office 0.5.0 → 0.6.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.
- package/LICENSE +1 -1
- package/README.md +259 -228
- package/dist/commands/cron-requests.d.ts +7 -0
- package/dist/commands/cron-requests.d.ts.map +1 -0
- package/dist/commands/cron-requests.js +31 -0
- package/dist/commands/cron-requests.js.map +1 -0
- package/dist/commands/crons.d.ts +10 -0
- package/dist/commands/crons.d.ts.map +1 -0
- package/dist/commands/crons.js +45 -0
- package/dist/commands/crons.js.map +1 -0
- package/dist/commands/hello.d.ts +5 -0
- package/dist/commands/hello.d.ts.map +1 -0
- package/dist/commands/hello.js +4 -0
- package/dist/commands/hello.js.map +1 -0
- package/dist/commands/messages.d.ts +5 -0
- package/dist/commands/messages.d.ts.map +1 -0
- package/dist/commands/messages.js +18 -0
- package/dist/commands/messages.js.map +1 -0
- package/dist/commands/sessions.d.ts +13 -0
- package/dist/commands/sessions.d.ts.map +1 -0
- package/dist/commands/sessions.js +58 -0
- package/dist/commands/sessions.js.map +1 -0
- package/dist/commands/task-columns.d.ts +2 -0
- package/dist/commands/task-columns.d.ts.map +1 -0
- package/dist/commands/task-columns.js +13 -0
- package/dist/commands/task-columns.js.map +1 -0
- package/dist/commands/tasks.d.ts +11 -0
- package/dist/commands/tasks.d.ts.map +1 -0
- package/dist/commands/tasks.js +75 -0
- package/dist/commands/tasks.js.map +1 -0
- package/dist/config.test.d.ts +2 -0
- package/dist/config.test.d.ts.map +1 -0
- package/dist/config.test.js +50 -0
- package/dist/config.test.js.map +1 -0
- package/dist/db/index.d.ts +6 -70
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +4 -11
- package/dist/db/index.js.map +1 -0
- package/dist/db/mock-storage.d.ts +79 -0
- package/dist/db/mock-storage.d.ts.map +1 -0
- package/dist/db/mock-storage.js +381 -0
- package/dist/db/mock-storage.js.map +1 -0
- package/dist/db/mock-storage.test.d.ts +2 -0
- package/dist/db/mock-storage.test.d.ts.map +1 -0
- package/dist/db/mock-storage.test.js +234 -0
- package/dist/db/mock-storage.test.js.map +1 -0
- package/dist/db/postgresql-storage.d.ts +10 -8
- package/dist/db/postgresql-storage.d.ts.map +1 -0
- package/dist/db/postgresql-storage.js +76 -42
- package/dist/db/postgresql-storage.js.map +1 -0
- package/dist/db/sqlite-storage.d.ts +9 -8
- package/dist/db/sqlite-storage.d.ts.map +1 -0
- package/dist/db/sqlite-storage.js +75 -41
- package/dist/db/sqlite-storage.js.map +1 -0
- package/dist/db/storage-base.d.ts +7 -8
- package/dist/db/storage-base.d.ts.map +1 -0
- package/dist/db/storage-base.js +3 -2
- package/dist/db/storage-base.js.map +1 -0
- package/dist/db/storage.d.ts +12 -12
- package/dist/db/storage.d.ts.map +1 -0
- package/dist/db/storage.js +1 -0
- package/dist/db/storage.js.map +1 -0
- package/dist/db/types.d.ts +67 -0
- package/dist/db/types.d.ts.map +1 -0
- package/dist/db/types.js +2 -0
- package/dist/db/types.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +397 -0
- package/dist/index.js.map +1 -0
- package/dist/index.test.d.ts +2 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +49 -0
- package/dist/index.test.js.map +1 -0
- package/dist/lib/output.d.ts +2 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +8 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/services/cron-service.constraints.test.d.ts +2 -0
- package/dist/services/cron-service.constraints.test.d.ts.map +1 -0
- package/dist/services/cron-service.constraints.test.js +90 -0
- package/dist/services/cron-service.constraints.test.js.map +1 -0
- package/dist/services/cron-service.d.ts +45 -0
- package/dist/services/cron-service.d.ts.map +1 -0
- package/dist/services/cron-service.js +157 -0
- package/dist/services/cron-service.js.map +1 -0
- package/dist/services/cron-service.test.d.ts +2 -0
- package/dist/services/cron-service.test.d.ts.map +1 -0
- package/dist/services/cron-service.test.js +280 -0
- package/dist/services/cron-service.test.js.map +1 -0
- package/dist/services/index.d.ts +5 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +5 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/message-service.d.ts +16 -0
- package/dist/services/message-service.d.ts.map +1 -0
- package/dist/services/message-service.js +39 -0
- package/dist/services/message-service.js.map +1 -0
- package/dist/services/message-service.test.d.ts +2 -0
- package/dist/services/message-service.test.d.ts.map +1 -0
- package/dist/services/message-service.test.js +145 -0
- package/dist/services/message-service.test.js.map +1 -0
- package/dist/services/session-service.constraints.test.d.ts +2 -0
- package/dist/services/session-service.constraints.test.d.ts.map +1 -0
- package/dist/services/session-service.constraints.test.js +34 -0
- package/dist/services/session-service.constraints.test.js.map +1 -0
- package/dist/services/session-service.d.ts +27 -0
- package/dist/services/session-service.d.ts.map +1 -0
- package/dist/services/session-service.js +55 -0
- package/dist/services/session-service.js.map +1 -0
- package/dist/services/session-service.test.d.ts +2 -0
- package/dist/services/session-service.test.d.ts.map +1 -0
- package/dist/services/session-service.test.js +87 -0
- package/dist/services/session-service.test.js.map +1 -0
- package/dist/services/task-service.d.ts +25 -0
- package/dist/services/task-service.d.ts.map +1 -0
- package/dist/services/task-service.js +87 -0
- package/dist/services/task-service.js.map +1 -0
- package/dist/services/task-service.test.d.ts +2 -0
- package/dist/services/task-service.test.d.ts.map +1 -0
- package/dist/services/task-service.test.js +180 -0
- package/dist/services/task-service.test.js.map +1 -0
- package/package.json +41 -42
- package/dist/cli.d.ts +0 -2
- package/dist/cli.js +0 -317
- package/dist/commands/communicator.d.ts +0 -9
- package/dist/commands/communicator.js +0 -2232
- package/dist/commands/manage.d.ts +0 -5
- package/dist/commands/manage.js +0 -20
- package/dist/commands/notifier.d.ts +0 -11
- package/dist/commands/notifier.js +0 -100
- package/dist/commands/screensaver.d.ts +0 -8
- package/dist/commands/screensaver.js +0 -1280
- package/dist/commands/serve.d.ts +0 -13
- package/dist/commands/serve.js +0 -95
- package/dist/commands/task-board.d.ts +0 -29
- package/dist/commands/task-board.js +0 -251
- package/dist/commands/worker.d.ts +0 -16
- package/dist/commands/worker.js +0 -145
- package/dist/db/migrate.d.ts +0 -2
- package/dist/db/migrate.js +0 -3
- package/dist/lib/agentic-coding-server.d.ts +0 -66
- package/dist/lib/agentic-coding-server.js +0 -7
- package/dist/lib/notifier.d.ts +0 -18
- package/dist/lib/notifier.js +0 -15
- package/dist/lib/opencode-coding-server.d.ts +0 -11
- package/dist/lib/opencode-coding-server.js +0 -66
- package/dist/lib/pi-coding-server.d.ts +0 -20
- package/dist/lib/pi-coding-server.js +0 -162
- package/dist/manage/app.d.ts +0 -6
- package/dist/manage/app.js +0 -128
- package/dist/manage/components/AgentCode.d.ts +0 -8
- package/dist/manage/components/AgentCode.js +0 -73
- package/dist/manage/components/CreateSession.d.ts +0 -8
- package/dist/manage/components/CreateSession.js +0 -37
- package/dist/manage/components/CronList.d.ts +0 -9
- package/dist/manage/components/CronList.js +0 -321
- package/dist/manage/components/CronRequests.d.ts +0 -8
- package/dist/manage/components/CronRequests.js +0 -181
- package/dist/manage/components/DeleteSession.d.ts +0 -7
- package/dist/manage/components/DeleteSession.js +0 -55
- package/dist/manage/components/InjectText.d.ts +0 -8
- package/dist/manage/components/InjectText.js +0 -51
- package/dist/manage/components/ItemSelector.d.ts +0 -7
- package/dist/manage/components/ItemSelector.js +0 -20
- package/dist/manage/components/MenuSelect.d.ts +0 -13
- package/dist/manage/components/MenuSelect.js +0 -22
- package/dist/manage/components/MyMail.d.ts +0 -9
- package/dist/manage/components/MyMail.js +0 -143
- package/dist/manage/components/Profile.d.ts +0 -8
- package/dist/manage/components/Profile.js +0 -60
- package/dist/manage/components/ReadMail.d.ts +0 -8
- package/dist/manage/components/ReadMail.js +0 -110
- package/dist/manage/components/SendMessage.d.ts +0 -9
- package/dist/manage/components/SendMessage.js +0 -79
- package/dist/manage/components/SessionList.d.ts +0 -9
- package/dist/manage/components/SessionList.js +0 -608
- package/dist/manage/components/SessionSidebar.d.ts +0 -6
- package/dist/manage/components/SessionSidebar.js +0 -24
- package/dist/manage/components/TailMessages.d.ts +0 -8
- package/dist/manage/components/TailMessages.js +0 -126
- package/dist/manage/hooks/useApi.d.ts +0 -147
- package/dist/manage/hooks/useApi.js +0 -181
- package/dist/server/cron.d.ts +0 -25
- package/dist/server/cron.js +0 -107
- package/dist/server/index.d.ts +0 -4
- package/dist/server/index.js +0 -22
- package/dist/server/routes.d.ts +0 -13
- package/dist/server/routes.js +0 -1396
package/dist/commands/serve.d.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
interface ServeOptions {
|
|
2
|
-
databaseUrl?: string;
|
|
3
|
-
sqlite?: string;
|
|
4
|
-
host: string;
|
|
5
|
-
port: string;
|
|
6
|
-
password?: string;
|
|
7
|
-
opencodeUrl: string;
|
|
8
|
-
piVendor?: string;
|
|
9
|
-
piModel?: string;
|
|
10
|
-
piApiKey?: string;
|
|
11
|
-
}
|
|
12
|
-
export declare function serve(options: ServeOptions): Promise<void>;
|
|
13
|
-
export {};
|
package/dist/commands/serve.js
DELETED
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import { createPostgresqlStorage, createSqliteStorage } from "../db/index.js";
|
|
2
|
-
import { runMigrations } from "../db/migrate.js";
|
|
3
|
-
import { OpenCodeCodingServer } from "../lib/opencode-coding-server.js";
|
|
4
|
-
import { PiCodingServer } from "../lib/pi-coding-server.js";
|
|
5
|
-
import { createApp } from "../server/index.js";
|
|
6
|
-
import { CronScheduler } from "../server/cron.js";
|
|
7
|
-
export async function serve(options) {
|
|
8
|
-
const password = options.password;
|
|
9
|
-
if (!password) {
|
|
10
|
-
console.error("Error: --password is required (or set AGENT_OFFICE_PASSWORD)");
|
|
11
|
-
process.exit(1);
|
|
12
|
-
}
|
|
13
|
-
const port = parseInt(options.port, 10);
|
|
14
|
-
if (isNaN(port) || port < 1 || port > 65535) {
|
|
15
|
-
console.error(`Error: invalid port "${options.port}"`);
|
|
16
|
-
process.exit(1);
|
|
17
|
-
}
|
|
18
|
-
// Determine storage backend
|
|
19
|
-
let storage;
|
|
20
|
-
if (options.sqlite) {
|
|
21
|
-
console.log(`Connecting to SQLite database at ${options.sqlite}...`);
|
|
22
|
-
storage = createSqliteStorage(options.sqlite);
|
|
23
|
-
}
|
|
24
|
-
else if (options.databaseUrl) {
|
|
25
|
-
console.log("Connecting to PostgreSQL database...");
|
|
26
|
-
storage = createPostgresqlStorage(options.databaseUrl);
|
|
27
|
-
}
|
|
28
|
-
else {
|
|
29
|
-
console.error("Error: either --database-url (or DATABASE_URL) or --sqlite (or AGENT_OFFICE_SQLITE) is required");
|
|
30
|
-
process.exit(1);
|
|
31
|
-
}
|
|
32
|
-
// Run migrations
|
|
33
|
-
console.log("Running migrations...");
|
|
34
|
-
try {
|
|
35
|
-
await runMigrations(storage);
|
|
36
|
-
console.log("Migrations complete.");
|
|
37
|
-
}
|
|
38
|
-
catch (err) {
|
|
39
|
-
console.error("Migration failed:", err);
|
|
40
|
-
await storage.close();
|
|
41
|
-
process.exit(1);
|
|
42
|
-
}
|
|
43
|
-
// Init agentic coding server
|
|
44
|
-
let agenticCodingServer;
|
|
45
|
-
const piVendor = options.piVendor;
|
|
46
|
-
const piModel = options.piModel;
|
|
47
|
-
const piApiKey = options.piApiKey;
|
|
48
|
-
const hasAllPiOptions = piVendor && piModel && piApiKey;
|
|
49
|
-
const hasSomePiOptions = piVendor || piModel || piApiKey;
|
|
50
|
-
if (hasAllPiOptions) {
|
|
51
|
-
// Use PI Coding Server
|
|
52
|
-
agenticCodingServer = new PiCodingServer(piVendor, piModel, piApiKey);
|
|
53
|
-
console.log(`Using PI coding server with ${piVendor} ${piModel}...`);
|
|
54
|
-
}
|
|
55
|
-
else if (hasSomePiOptions) {
|
|
56
|
-
// Partial PI options - error
|
|
57
|
-
console.error("Error: All PI coding options must be provided together: --pi-vendor, --pi-model, --pi-api-key");
|
|
58
|
-
console.error(" Or set environment variables: PI_VENDOR, PI_MODEL, PI_API_KEY");
|
|
59
|
-
await storage.close();
|
|
60
|
-
process.exit(1);
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
// Use OpenCode Coding Server (default)
|
|
64
|
-
agenticCodingServer = new OpenCodeCodingServer(options.opencodeUrl);
|
|
65
|
-
if (options.opencodeUrl === "http://127.0.0.1:4096") {
|
|
66
|
-
console.log(`Connecting to default OpenCode server at ${options.opencodeUrl}...`);
|
|
67
|
-
}
|
|
68
|
-
else {
|
|
69
|
-
console.log(`Connecting to OpenCode server at ${options.opencodeUrl}...`);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
const serverUrl = `http://${options.host}:${port}`;
|
|
73
|
-
// Create cron scheduler
|
|
74
|
-
const cronScheduler = new CronScheduler();
|
|
75
|
-
// Create Express app
|
|
76
|
-
const app = createApp(storage, agenticCodingServer, password, serverUrl, cronScheduler);
|
|
77
|
-
// Start cron scheduler
|
|
78
|
-
await cronScheduler.start(storage, agenticCodingServer, serverUrl);
|
|
79
|
-
// Start server
|
|
80
|
-
const server = app.listen(port, options.host, () => {
|
|
81
|
-
console.log(`agent-office server listening on ${serverUrl}`);
|
|
82
|
-
});
|
|
83
|
-
// Graceful shutdown
|
|
84
|
-
const shutdown = async () => {
|
|
85
|
-
console.log("\nShutting down...");
|
|
86
|
-
server.close(async () => {
|
|
87
|
-
cronScheduler.stop();
|
|
88
|
-
await storage.close();
|
|
89
|
-
console.log("Goodbye.");
|
|
90
|
-
process.exit(0);
|
|
91
|
-
});
|
|
92
|
-
};
|
|
93
|
-
process.on("SIGINT", shutdown);
|
|
94
|
-
process.on("SIGTERM", shutdown);
|
|
95
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
interface TaskBoardOptions {
|
|
2
|
-
databaseUrl?: string;
|
|
3
|
-
sqlite?: string;
|
|
4
|
-
}
|
|
5
|
-
export declare function listTasks(options: TaskBoardOptions, cmdOptions: {
|
|
6
|
-
column?: string;
|
|
7
|
-
}): Promise<void>;
|
|
8
|
-
export declare function addTask(options: TaskBoardOptions, title: string, description: string, cmdOptions: {
|
|
9
|
-
assignee?: string;
|
|
10
|
-
column: string;
|
|
11
|
-
dependencies: string;
|
|
12
|
-
}): Promise<void>;
|
|
13
|
-
export declare function updateTask(options: TaskBoardOptions, idStr: string, cmdOptions: {
|
|
14
|
-
title?: string;
|
|
15
|
-
description?: string;
|
|
16
|
-
assignee?: string;
|
|
17
|
-
column?: string;
|
|
18
|
-
dependencies?: string;
|
|
19
|
-
}): Promise<void>;
|
|
20
|
-
export declare function deleteTask(options: TaskBoardOptions, idStr: string): Promise<void>;
|
|
21
|
-
export declare function moveTask(options: TaskBoardOptions, idStr: string, column: string): Promise<void>;
|
|
22
|
-
export declare function searchTasks(options: TaskBoardOptions, query: string, cmdOptions: {
|
|
23
|
-
assignee?: string;
|
|
24
|
-
column?: string;
|
|
25
|
-
}): Promise<void>;
|
|
26
|
-
export declare function assignTask(options: TaskBoardOptions, idStr: string, assignee: string): Promise<void>;
|
|
27
|
-
export declare function showTask(options: TaskBoardOptions, idStr: string): Promise<void>;
|
|
28
|
-
export declare function showStats(options: TaskBoardOptions): Promise<void>;
|
|
29
|
-
export {};
|
|
@@ -1,251 +0,0 @@
|
|
|
1
|
-
import { createPostgresqlStorage, createSqliteStorage } from "../db/index.js";
|
|
2
|
-
import { runMigrations } from "../db/migrate.js";
|
|
3
|
-
const VALID_COLUMNS = ["idea", "approved idea", "working on", "blocked", "ready for review", "done"];
|
|
4
|
-
function validateColumn(column) {
|
|
5
|
-
if (!VALID_COLUMNS.includes(column)) {
|
|
6
|
-
console.error(`Error: invalid column "${column}". Valid columns are: ${VALID_COLUMNS.join(", ")}`);
|
|
7
|
-
process.exit(1);
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
async function getStorage(options) {
|
|
11
|
-
let storage;
|
|
12
|
-
if (options.sqlite) {
|
|
13
|
-
storage = createSqliteStorage(options.sqlite);
|
|
14
|
-
}
|
|
15
|
-
else if (options.databaseUrl) {
|
|
16
|
-
storage = createPostgresqlStorage(options.databaseUrl);
|
|
17
|
-
}
|
|
18
|
-
else {
|
|
19
|
-
console.error("Error: either --database-url or --sqlite is required");
|
|
20
|
-
process.exit(1);
|
|
21
|
-
}
|
|
22
|
-
// Run migrations
|
|
23
|
-
await runMigrations(storage);
|
|
24
|
-
return storage;
|
|
25
|
-
}
|
|
26
|
-
export async function listTasks(options, cmdOptions) {
|
|
27
|
-
const storage = await getStorage(options);
|
|
28
|
-
try {
|
|
29
|
-
const tasks = await storage.listTasks();
|
|
30
|
-
let filtered = tasks;
|
|
31
|
-
if (cmdOptions.column) {
|
|
32
|
-
validateColumn(cmdOptions.column);
|
|
33
|
-
filtered = tasks.filter(t => t.column === cmdOptions.column);
|
|
34
|
-
}
|
|
35
|
-
if (filtered.length === 0) {
|
|
36
|
-
console.log("No tasks found.");
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
for (const task of filtered) {
|
|
40
|
-
console.log(`#${task.id} [${task.column}] ${task.title}`);
|
|
41
|
-
if (task.assignee)
|
|
42
|
-
console.log(` Assignee: ${task.assignee}`);
|
|
43
|
-
console.log(` Description: ${task.description}`);
|
|
44
|
-
if (task.dependencies.length > 0) {
|
|
45
|
-
console.log(` Dependencies: ${task.dependencies.join(", ")}`);
|
|
46
|
-
}
|
|
47
|
-
console.log(` Created: ${task.created_at.toISOString()}`);
|
|
48
|
-
console.log();
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
finally {
|
|
52
|
-
await storage.close();
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
export async function addTask(options, title, description, cmdOptions) {
|
|
56
|
-
const storage = await getStorage(options);
|
|
57
|
-
try {
|
|
58
|
-
validateColumn(cmdOptions.column);
|
|
59
|
-
const dependencies = cmdOptions.dependencies ? cmdOptions.dependencies.split(",").map(s => parseInt(s.trim(), 10)).filter(n => !isNaN(n)) : [];
|
|
60
|
-
const task = await storage.createTask(title, description, cmdOptions.assignee || null, cmdOptions.column, dependencies);
|
|
61
|
-
console.log(`Task #${task.id} created.`);
|
|
62
|
-
}
|
|
63
|
-
finally {
|
|
64
|
-
await storage.close();
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
export async function updateTask(options, idStr, cmdOptions) {
|
|
68
|
-
const storage = await getStorage(options);
|
|
69
|
-
try {
|
|
70
|
-
const id = parseInt(idStr, 10);
|
|
71
|
-
if (isNaN(id)) {
|
|
72
|
-
console.error("Error: invalid task ID");
|
|
73
|
-
process.exit(1);
|
|
74
|
-
}
|
|
75
|
-
const updates = {};
|
|
76
|
-
if (cmdOptions.title !== undefined)
|
|
77
|
-
updates.title = cmdOptions.title;
|
|
78
|
-
if (cmdOptions.description !== undefined)
|
|
79
|
-
updates.description = cmdOptions.description;
|
|
80
|
-
if (cmdOptions.assignee !== undefined)
|
|
81
|
-
updates.assignee = cmdOptions.assignee;
|
|
82
|
-
if (cmdOptions.column !== undefined) {
|
|
83
|
-
validateColumn(cmdOptions.column);
|
|
84
|
-
updates.column = cmdOptions.column;
|
|
85
|
-
}
|
|
86
|
-
if (cmdOptions.dependencies !== undefined) {
|
|
87
|
-
updates.dependencies = cmdOptions.dependencies.split(",").map(s => parseInt(s.trim(), 10)).filter(n => !isNaN(n));
|
|
88
|
-
}
|
|
89
|
-
const task = await storage.updateTask(id, updates);
|
|
90
|
-
if (!task) {
|
|
91
|
-
console.error("Error: task not found");
|
|
92
|
-
process.exit(1);
|
|
93
|
-
}
|
|
94
|
-
console.log(`Task #${task.id} updated.`);
|
|
95
|
-
}
|
|
96
|
-
finally {
|
|
97
|
-
await storage.close();
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
export async function deleteTask(options, idStr) {
|
|
101
|
-
const storage = await getStorage(options);
|
|
102
|
-
try {
|
|
103
|
-
const id = parseInt(idStr, 10);
|
|
104
|
-
if (isNaN(id)) {
|
|
105
|
-
console.error("Error: invalid task ID");
|
|
106
|
-
process.exit(1);
|
|
107
|
-
}
|
|
108
|
-
await storage.deleteTask(id);
|
|
109
|
-
console.log(`Task #${id} deleted.`);
|
|
110
|
-
}
|
|
111
|
-
finally {
|
|
112
|
-
await storage.close();
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
export async function moveTask(options, idStr, column) {
|
|
116
|
-
const storage = await getStorage(options);
|
|
117
|
-
try {
|
|
118
|
-
const id = parseInt(idStr, 10);
|
|
119
|
-
if (isNaN(id)) {
|
|
120
|
-
console.error("Error: invalid task ID");
|
|
121
|
-
process.exit(1);
|
|
122
|
-
}
|
|
123
|
-
validateColumn(column);
|
|
124
|
-
const task = await storage.updateTask(id, { column });
|
|
125
|
-
if (!task) {
|
|
126
|
-
console.error("Error: task not found");
|
|
127
|
-
process.exit(1);
|
|
128
|
-
}
|
|
129
|
-
console.log(`Task #${task.id} moved to "${column}".`);
|
|
130
|
-
}
|
|
131
|
-
finally {
|
|
132
|
-
await storage.close();
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
export async function searchTasks(options, query, cmdOptions) {
|
|
136
|
-
const storage = await getStorage(options);
|
|
137
|
-
try {
|
|
138
|
-
if (cmdOptions.column) {
|
|
139
|
-
validateColumn(cmdOptions.column);
|
|
140
|
-
}
|
|
141
|
-
const tasks = await storage.searchTasks(query, cmdOptions);
|
|
142
|
-
if (tasks.length === 0) {
|
|
143
|
-
console.log("No tasks found matching the search criteria.");
|
|
144
|
-
return;
|
|
145
|
-
}
|
|
146
|
-
console.log(`Found ${tasks.length} task(s) matching "${query}":`);
|
|
147
|
-
console.log();
|
|
148
|
-
for (const task of tasks) {
|
|
149
|
-
console.log(`#${task.id} [${task.column}] ${task.title}`);
|
|
150
|
-
if (task.assignee)
|
|
151
|
-
console.log(` Assignee: ${task.assignee}`);
|
|
152
|
-
console.log(` Description: ${task.description}`);
|
|
153
|
-
if (task.dependencies.length > 0) {
|
|
154
|
-
console.log(` Dependencies: ${task.dependencies.join(", ")}`);
|
|
155
|
-
}
|
|
156
|
-
console.log(` Created: ${task.created_at.toISOString()}`);
|
|
157
|
-
console.log();
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
finally {
|
|
161
|
-
await storage.close();
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
export async function assignTask(options, idStr, assignee) {
|
|
165
|
-
const storage = await getStorage(options);
|
|
166
|
-
try {
|
|
167
|
-
const id = parseInt(idStr, 10);
|
|
168
|
-
if (isNaN(id)) {
|
|
169
|
-
console.error("Error: invalid task ID");
|
|
170
|
-
process.exit(1);
|
|
171
|
-
}
|
|
172
|
-
const task = await storage.updateTask(id, { assignee });
|
|
173
|
-
if (!task) {
|
|
174
|
-
console.error("Error: task not found");
|
|
175
|
-
process.exit(1);
|
|
176
|
-
}
|
|
177
|
-
console.log(`Task #${task.id} assigned to "${assignee}".`);
|
|
178
|
-
}
|
|
179
|
-
finally {
|
|
180
|
-
await storage.close();
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
export async function showTask(options, idStr) {
|
|
184
|
-
const storage = await getStorage(options);
|
|
185
|
-
try {
|
|
186
|
-
const id = parseInt(idStr, 10);
|
|
187
|
-
if (isNaN(id)) {
|
|
188
|
-
console.error("Error: invalid task ID");
|
|
189
|
-
process.exit(1);
|
|
190
|
-
}
|
|
191
|
-
const task = await storage.getTaskById(id);
|
|
192
|
-
if (!task) {
|
|
193
|
-
console.error("Error: task not found");
|
|
194
|
-
process.exit(1);
|
|
195
|
-
}
|
|
196
|
-
console.log(`Task #${task.id}`);
|
|
197
|
-
console.log(`Title: ${task.title}`);
|
|
198
|
-
console.log(`Description: ${task.description}`);
|
|
199
|
-
console.log(`Column: ${task.column}`);
|
|
200
|
-
console.log(`Assignee: ${task.assignee || "Unassigned"}`);
|
|
201
|
-
console.log(`Dependencies: ${task.dependencies.length > 0 ? task.dependencies.join(", ") : "None"}`);
|
|
202
|
-
console.log(`Created: ${task.created_at.toISOString()}`);
|
|
203
|
-
console.log(`Updated: ${task.updated_at.toISOString()}`);
|
|
204
|
-
}
|
|
205
|
-
finally {
|
|
206
|
-
await storage.close();
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
export async function showStats(options) {
|
|
210
|
-
const storage = await getStorage(options);
|
|
211
|
-
try {
|
|
212
|
-
const tasks = await storage.listTasks();
|
|
213
|
-
const stats = {
|
|
214
|
-
total: tasks.length,
|
|
215
|
-
byColumn: {},
|
|
216
|
-
byAssignee: {},
|
|
217
|
-
unassigned: 0,
|
|
218
|
-
};
|
|
219
|
-
for (const task of tasks) {
|
|
220
|
-
// By column
|
|
221
|
-
stats.byColumn[task.column] = (stats.byColumn[task.column] || 0) + 1;
|
|
222
|
-
// By assignee
|
|
223
|
-
if (task.assignee) {
|
|
224
|
-
stats.byAssignee[task.assignee] = (stats.byAssignee[task.assignee] || 0) + 1;
|
|
225
|
-
}
|
|
226
|
-
else {
|
|
227
|
-
stats.unassigned++;
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
console.log("Task Board Statistics");
|
|
231
|
-
console.log("====================");
|
|
232
|
-
console.log(`Total tasks: ${stats.total}`);
|
|
233
|
-
console.log();
|
|
234
|
-
console.log("Tasks by column:");
|
|
235
|
-
for (const column of VALID_COLUMNS) {
|
|
236
|
-
const count = stats.byColumn[column] || 0;
|
|
237
|
-
console.log(` ${column}: ${count}`);
|
|
238
|
-
}
|
|
239
|
-
console.log();
|
|
240
|
-
console.log("Tasks by assignee:");
|
|
241
|
-
if (stats.unassigned > 0) {
|
|
242
|
-
console.log(` Unassigned: ${stats.unassigned}`);
|
|
243
|
-
}
|
|
244
|
-
for (const [assignee, count] of Object.entries(stats.byAssignee)) {
|
|
245
|
-
console.log(` ${assignee}: ${count}`);
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
finally {
|
|
249
|
-
await storage.close();
|
|
250
|
-
}
|
|
251
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
export declare function listCoworkers(token: string): Promise<void>;
|
|
2
|
-
export declare function setStatus(token: string, status: string | null): Promise<void>;
|
|
3
|
-
export declare function sendMessage(token: string, recipients: string[], body: string): Promise<void>;
|
|
4
|
-
export declare function listCrons(token: string): Promise<void>;
|
|
5
|
-
export declare function requestCron(token: string, options: {
|
|
6
|
-
name: string;
|
|
7
|
-
schedule: string;
|
|
8
|
-
message: string;
|
|
9
|
-
respondTo: string;
|
|
10
|
-
timezone?: string;
|
|
11
|
-
}): Promise<void>;
|
|
12
|
-
export declare function listCronRequests(token: string): Promise<void>;
|
|
13
|
-
export declare function deleteCron(token: string, cronId: number): Promise<void>;
|
|
14
|
-
export declare function enableCron(token: string, cronId: number): Promise<void>;
|
|
15
|
-
export declare function disableCron(token: string, cronId: number): Promise<void>;
|
|
16
|
-
export declare function cronHistory(token: string, cronId: number): Promise<void>;
|
package/dist/commands/worker.js
DELETED
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
2
|
-
function parseToken(token) {
|
|
3
|
-
const atIndex = token.indexOf("@");
|
|
4
|
-
if (atIndex === -1) {
|
|
5
|
-
console.error("Error: token must be in the format <agent_code>@<server-url>");
|
|
6
|
-
console.error("Example: 550e8400-e29b-41d4-a716-446655440000@http://127.0.0.1:7654");
|
|
7
|
-
process.exit(1);
|
|
8
|
-
}
|
|
9
|
-
const agentCode = token.slice(0, atIndex);
|
|
10
|
-
const serverUrl = token.slice(atIndex + 1);
|
|
11
|
-
if (!UUID_RE.test(agentCode)) {
|
|
12
|
-
console.error(`Error: "${agentCode}" is not a valid UUID agent code`);
|
|
13
|
-
process.exit(1);
|
|
14
|
-
}
|
|
15
|
-
try {
|
|
16
|
-
new URL(serverUrl);
|
|
17
|
-
}
|
|
18
|
-
catch {
|
|
19
|
-
console.error(`Error: "${serverUrl}" is not a valid URL`);
|
|
20
|
-
process.exit(1);
|
|
21
|
-
}
|
|
22
|
-
return { agentCode, serverUrl };
|
|
23
|
-
}
|
|
24
|
-
async function fetchWorker(token, endpoint) {
|
|
25
|
-
const { agentCode, serverUrl } = parseToken(token);
|
|
26
|
-
const url = `${serverUrl}${endpoint}?code=${encodeURIComponent(agentCode)}`;
|
|
27
|
-
let res;
|
|
28
|
-
try {
|
|
29
|
-
res = await fetch(url);
|
|
30
|
-
}
|
|
31
|
-
catch (err) {
|
|
32
|
-
console.error(`Error: could not reach ${serverUrl}`);
|
|
33
|
-
console.error(err instanceof Error ? err.message : String(err));
|
|
34
|
-
process.exit(1);
|
|
35
|
-
}
|
|
36
|
-
let body;
|
|
37
|
-
try {
|
|
38
|
-
body = await res.json();
|
|
39
|
-
}
|
|
40
|
-
catch {
|
|
41
|
-
console.error(`Error: invalid response from server`);
|
|
42
|
-
process.exit(1);
|
|
43
|
-
}
|
|
44
|
-
if (!res.ok) {
|
|
45
|
-
const msg = body.error ?? `HTTP ${res.status}`;
|
|
46
|
-
console.error(`Error: ${msg}`);
|
|
47
|
-
process.exit(1);
|
|
48
|
-
}
|
|
49
|
-
return body;
|
|
50
|
-
}
|
|
51
|
-
async function postWorker(token, endpoint, payload) {
|
|
52
|
-
const { agentCode, serverUrl } = parseToken(token);
|
|
53
|
-
const url = `${serverUrl}${endpoint}?code=${encodeURIComponent(agentCode)}`;
|
|
54
|
-
let res;
|
|
55
|
-
try {
|
|
56
|
-
res = await fetch(url, {
|
|
57
|
-
method: "POST",
|
|
58
|
-
headers: { "Content-Type": "application/json" },
|
|
59
|
-
body: JSON.stringify(payload),
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
catch (err) {
|
|
63
|
-
console.error(`Error: could not reach ${serverUrl}`);
|
|
64
|
-
console.error(err instanceof Error ? err.message : String(err));
|
|
65
|
-
process.exit(1);
|
|
66
|
-
}
|
|
67
|
-
let body;
|
|
68
|
-
try {
|
|
69
|
-
body = await res.json();
|
|
70
|
-
}
|
|
71
|
-
catch {
|
|
72
|
-
console.error(`Error: invalid response from server`);
|
|
73
|
-
process.exit(1);
|
|
74
|
-
}
|
|
75
|
-
if (!res.ok) {
|
|
76
|
-
const msg = body.error ?? `HTTP ${res.status}`;
|
|
77
|
-
console.error(`Error: ${msg}`);
|
|
78
|
-
process.exit(1);
|
|
79
|
-
}
|
|
80
|
-
return body;
|
|
81
|
-
}
|
|
82
|
-
export async function listCoworkers(token) {
|
|
83
|
-
const workers = await fetchWorker(token, "/worker/list-coworkers");
|
|
84
|
-
console.log(JSON.stringify(workers, null, 2));
|
|
85
|
-
}
|
|
86
|
-
export async function setStatus(token, status) {
|
|
87
|
-
const result = await postWorker(token, "/worker/set-status", { status });
|
|
88
|
-
console.log(JSON.stringify(result, null, 2));
|
|
89
|
-
}
|
|
90
|
-
export async function sendMessage(token, recipients, body) {
|
|
91
|
-
const result = await postWorker(token, "/worker/send-message", { to: recipients, body });
|
|
92
|
-
console.log(JSON.stringify(result, null, 2));
|
|
93
|
-
}
|
|
94
|
-
export async function listCrons(token) {
|
|
95
|
-
const crons = await fetchWorker(token, "/worker/crons");
|
|
96
|
-
console.log(JSON.stringify(crons, null, 2));
|
|
97
|
-
}
|
|
98
|
-
export async function requestCron(token, options) {
|
|
99
|
-
const finalMessage = `Action: ${options.message}\n\nWho to respond to when done: ${options.respondTo}`;
|
|
100
|
-
const request = await postWorker(token, "/worker/cron-requests", { name: options.name, schedule: options.schedule, message: finalMessage, timezone: options.timezone });
|
|
101
|
-
console.log(JSON.stringify(request, null, 2));
|
|
102
|
-
}
|
|
103
|
-
export async function listCronRequests(token) {
|
|
104
|
-
const requests = await fetchWorker(token, "/worker/cron-requests");
|
|
105
|
-
console.log(JSON.stringify(requests, null, 2));
|
|
106
|
-
}
|
|
107
|
-
export async function deleteCron(token, cronId) {
|
|
108
|
-
const { agentCode, serverUrl } = parseToken(token);
|
|
109
|
-
const url = `${serverUrl}/worker/crons/${cronId}?code=${encodeURIComponent(agentCode)}`;
|
|
110
|
-
let res;
|
|
111
|
-
try {
|
|
112
|
-
res = await fetch(url, { method: "DELETE" });
|
|
113
|
-
}
|
|
114
|
-
catch (err) {
|
|
115
|
-
console.error(`Error: could not reach ${serverUrl}`);
|
|
116
|
-
console.error(err instanceof Error ? err.message : String(err));
|
|
117
|
-
process.exit(1);
|
|
118
|
-
}
|
|
119
|
-
let body;
|
|
120
|
-
try {
|
|
121
|
-
body = await res.json();
|
|
122
|
-
}
|
|
123
|
-
catch {
|
|
124
|
-
console.error(`Error: invalid response from server`);
|
|
125
|
-
process.exit(1);
|
|
126
|
-
}
|
|
127
|
-
if (!res.ok) {
|
|
128
|
-
const msg = body.error ?? `HTTP ${res.status}`;
|
|
129
|
-
console.error(`Error: ${msg}`);
|
|
130
|
-
process.exit(1);
|
|
131
|
-
}
|
|
132
|
-
console.log(JSON.stringify(body, null, 2));
|
|
133
|
-
}
|
|
134
|
-
export async function enableCron(token, cronId) {
|
|
135
|
-
const result = await fetchWorker(token, `/worker/crons/${cronId}/enable`);
|
|
136
|
-
console.log(JSON.stringify(result, null, 2));
|
|
137
|
-
}
|
|
138
|
-
export async function disableCron(token, cronId) {
|
|
139
|
-
const result = await fetchWorker(token, `/worker/crons/${cronId}/disable`);
|
|
140
|
-
console.log(JSON.stringify(result, null, 2));
|
|
141
|
-
}
|
|
142
|
-
export async function cronHistory(token, cronId) {
|
|
143
|
-
const history = await fetchWorker(token, `/worker/crons/${cronId}/history`);
|
|
144
|
-
console.log(JSON.stringify(history, null, 2));
|
|
145
|
-
}
|
package/dist/db/migrate.d.ts
DELETED
package/dist/db/migrate.js
DELETED
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* AgenticCodingServer — abstract interface for interacting with an agentic
|
|
3
|
-
* coding backend. The application code depends only on this interface;
|
|
4
|
-
* concrete implementations (e.g. OpenCodeCodingServer) supply the wiring
|
|
5
|
-
* to a specific server.
|
|
6
|
-
*/
|
|
7
|
-
/** Minimal representation of a message part. */
|
|
8
|
-
export interface MessagePart {
|
|
9
|
-
type: string;
|
|
10
|
-
[key: string]: unknown;
|
|
11
|
-
}
|
|
12
|
-
/** A single message inside a session. */
|
|
13
|
-
export interface SessionMessage {
|
|
14
|
-
id: string;
|
|
15
|
-
role: string;
|
|
16
|
-
parts: MessagePart[];
|
|
17
|
-
}
|
|
18
|
-
/** An agent mode advertised by the server. */
|
|
19
|
-
export interface AgentMode {
|
|
20
|
-
name: string;
|
|
21
|
-
description: string;
|
|
22
|
-
model: string;
|
|
23
|
-
}
|
|
24
|
-
export interface AgenticCodingServer {
|
|
25
|
-
/**
|
|
26
|
-
* Create a new session.
|
|
27
|
-
* @param title display title shown in the OpenCode UI.
|
|
28
|
-
* @returns the server-assigned session ID.
|
|
29
|
-
*/
|
|
30
|
-
createSession(title: string): Promise<string>;
|
|
31
|
-
/**
|
|
32
|
-
* Permanently delete a session.
|
|
33
|
-
*/
|
|
34
|
-
deleteSession(sessionID: string): Promise<void>;
|
|
35
|
-
/**
|
|
36
|
-
* Inject a text message into a session (fire-and-forget).
|
|
37
|
-
* The server processes the message asynchronously.
|
|
38
|
-
*
|
|
39
|
-
* @param agent agent-mode identifier to route the prompt.
|
|
40
|
-
* @param system system prompt appended after the agent's built-in system
|
|
41
|
-
* prompt. Always pass the worker briefing here so the agent
|
|
42
|
-
* has persistent identity/context on every message turn.
|
|
43
|
-
*/
|
|
44
|
-
sendMessage(sessionID: string, text: string, agent: string, system: string): Promise<void>;
|
|
45
|
-
/**
|
|
46
|
-
* Retrieve the message history for a session.
|
|
47
|
-
*
|
|
48
|
-
* @param limit maximum number of messages to return (server may cap this).
|
|
49
|
-
*/
|
|
50
|
-
getMessages(sessionID: string, limit?: number): Promise<SessionMessage[]>;
|
|
51
|
-
/**
|
|
52
|
-
* Return the list of agent modes the server knows about.
|
|
53
|
-
*/
|
|
54
|
-
getAgentModes(): Promise<AgentMode[]>;
|
|
55
|
-
/**
|
|
56
|
-
* Start a headless OpenCode server instance.
|
|
57
|
-
* Returns the server URL once it's ready.
|
|
58
|
-
* Optional - not needed when connecting to an existing server.
|
|
59
|
-
*/
|
|
60
|
-
startServer?(): Promise<string>;
|
|
61
|
-
/**
|
|
62
|
-
* Stop the headless OpenCode server instance.
|
|
63
|
-
* Optional - not needed when connecting to an existing server.
|
|
64
|
-
*/
|
|
65
|
-
stopServer?(): Promise<void>;
|
|
66
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* AgenticCodingServer — abstract interface for interacting with an agentic
|
|
3
|
-
* coding backend. The application code depends only on this interface;
|
|
4
|
-
* concrete implementations (e.g. OpenCodeCodingServer) supply the wiring
|
|
5
|
-
* to a specific server.
|
|
6
|
-
*/
|
|
7
|
-
export {};
|
package/dist/lib/notifier.d.ts
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
export interface NotifyOptions {
|
|
2
|
-
from: string;
|
|
3
|
-
to: string;
|
|
4
|
-
subject: string;
|
|
5
|
-
text: string;
|
|
6
|
-
}
|
|
7
|
-
/**
|
|
8
|
-
* Abstract notification interface — swap out the implementation
|
|
9
|
-
* (email, SMS, webhook, etc.) without changing the daemon logic.
|
|
10
|
-
*/
|
|
11
|
-
export interface AgentOfficeNotifier {
|
|
12
|
-
send(opts: NotifyOptions): Promise<void>;
|
|
13
|
-
}
|
|
14
|
-
export declare class ResendNotifier implements AgentOfficeNotifier {
|
|
15
|
-
private resend;
|
|
16
|
-
constructor(apiKey: string);
|
|
17
|
-
send(opts: NotifyOptions): Promise<void>;
|
|
18
|
-
}
|
package/dist/lib/notifier.js
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { Resend } from "resend";
|
|
2
|
-
export class ResendNotifier {
|
|
3
|
-
resend;
|
|
4
|
-
constructor(apiKey) {
|
|
5
|
-
this.resend = new Resend(apiKey);
|
|
6
|
-
}
|
|
7
|
-
async send(opts) {
|
|
8
|
-
await this.resend.emails.send({
|
|
9
|
-
from: opts.from,
|
|
10
|
-
to: [opts.to],
|
|
11
|
-
subject: opts.subject,
|
|
12
|
-
text: opts.text,
|
|
13
|
-
});
|
|
14
|
-
}
|
|
15
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { AgenticCodingServer, SessionMessage, AgentMode } from "./agentic-coding-server.js";
|
|
2
|
-
export declare class OpenCodeCodingServer implements AgenticCodingServer {
|
|
3
|
-
private client;
|
|
4
|
-
private baseURL;
|
|
5
|
-
constructor(opencodeUrl: string);
|
|
6
|
-
createSession(title: string): Promise<string>;
|
|
7
|
-
deleteSession(sessionID: string): Promise<void>;
|
|
8
|
-
sendMessage(sessionID: string, text: string, agent: string, system: string): Promise<void>;
|
|
9
|
-
getMessages(sessionID: string, limit?: number): Promise<SessionMessage[]>;
|
|
10
|
-
getAgentModes(): Promise<AgentMode[]>;
|
|
11
|
-
}
|