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.
Files changed (189) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +259 -228
  3. package/dist/commands/cron-requests.d.ts +7 -0
  4. package/dist/commands/cron-requests.d.ts.map +1 -0
  5. package/dist/commands/cron-requests.js +31 -0
  6. package/dist/commands/cron-requests.js.map +1 -0
  7. package/dist/commands/crons.d.ts +10 -0
  8. package/dist/commands/crons.d.ts.map +1 -0
  9. package/dist/commands/crons.js +45 -0
  10. package/dist/commands/crons.js.map +1 -0
  11. package/dist/commands/hello.d.ts +5 -0
  12. package/dist/commands/hello.d.ts.map +1 -0
  13. package/dist/commands/hello.js +4 -0
  14. package/dist/commands/hello.js.map +1 -0
  15. package/dist/commands/messages.d.ts +5 -0
  16. package/dist/commands/messages.d.ts.map +1 -0
  17. package/dist/commands/messages.js +18 -0
  18. package/dist/commands/messages.js.map +1 -0
  19. package/dist/commands/sessions.d.ts +13 -0
  20. package/dist/commands/sessions.d.ts.map +1 -0
  21. package/dist/commands/sessions.js +58 -0
  22. package/dist/commands/sessions.js.map +1 -0
  23. package/dist/commands/task-columns.d.ts +2 -0
  24. package/dist/commands/task-columns.d.ts.map +1 -0
  25. package/dist/commands/task-columns.js +13 -0
  26. package/dist/commands/task-columns.js.map +1 -0
  27. package/dist/commands/tasks.d.ts +11 -0
  28. package/dist/commands/tasks.d.ts.map +1 -0
  29. package/dist/commands/tasks.js +75 -0
  30. package/dist/commands/tasks.js.map +1 -0
  31. package/dist/config.test.d.ts +2 -0
  32. package/dist/config.test.d.ts.map +1 -0
  33. package/dist/config.test.js +50 -0
  34. package/dist/config.test.js.map +1 -0
  35. package/dist/db/index.d.ts +6 -70
  36. package/dist/db/index.d.ts.map +1 -0
  37. package/dist/db/index.js +4 -11
  38. package/dist/db/index.js.map +1 -0
  39. package/dist/db/mock-storage.d.ts +79 -0
  40. package/dist/db/mock-storage.d.ts.map +1 -0
  41. package/dist/db/mock-storage.js +381 -0
  42. package/dist/db/mock-storage.js.map +1 -0
  43. package/dist/db/mock-storage.test.d.ts +2 -0
  44. package/dist/db/mock-storage.test.d.ts.map +1 -0
  45. package/dist/db/mock-storage.test.js +234 -0
  46. package/dist/db/mock-storage.test.js.map +1 -0
  47. package/dist/db/postgresql-storage.d.ts +10 -8
  48. package/dist/db/postgresql-storage.d.ts.map +1 -0
  49. package/dist/db/postgresql-storage.js +76 -42
  50. package/dist/db/postgresql-storage.js.map +1 -0
  51. package/dist/db/sqlite-storage.d.ts +9 -8
  52. package/dist/db/sqlite-storage.d.ts.map +1 -0
  53. package/dist/db/sqlite-storage.js +75 -41
  54. package/dist/db/sqlite-storage.js.map +1 -0
  55. package/dist/db/storage-base.d.ts +7 -8
  56. package/dist/db/storage-base.d.ts.map +1 -0
  57. package/dist/db/storage-base.js +3 -2
  58. package/dist/db/storage-base.js.map +1 -0
  59. package/dist/db/storage.d.ts +12 -12
  60. package/dist/db/storage.d.ts.map +1 -0
  61. package/dist/db/storage.js +1 -0
  62. package/dist/db/storage.js.map +1 -0
  63. package/dist/db/types.d.ts +67 -0
  64. package/dist/db/types.d.ts.map +1 -0
  65. package/dist/db/types.js +2 -0
  66. package/dist/db/types.js.map +1 -0
  67. package/dist/index.d.ts +2 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +397 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/index.test.d.ts +2 -0
  72. package/dist/index.test.d.ts.map +1 -0
  73. package/dist/index.test.js +49 -0
  74. package/dist/index.test.js.map +1 -0
  75. package/dist/lib/output.d.ts +2 -0
  76. package/dist/lib/output.d.ts.map +1 -0
  77. package/dist/lib/output.js +8 -0
  78. package/dist/lib/output.js.map +1 -0
  79. package/dist/services/cron-service.constraints.test.d.ts +2 -0
  80. package/dist/services/cron-service.constraints.test.d.ts.map +1 -0
  81. package/dist/services/cron-service.constraints.test.js +90 -0
  82. package/dist/services/cron-service.constraints.test.js.map +1 -0
  83. package/dist/services/cron-service.d.ts +45 -0
  84. package/dist/services/cron-service.d.ts.map +1 -0
  85. package/dist/services/cron-service.js +157 -0
  86. package/dist/services/cron-service.js.map +1 -0
  87. package/dist/services/cron-service.test.d.ts +2 -0
  88. package/dist/services/cron-service.test.d.ts.map +1 -0
  89. package/dist/services/cron-service.test.js +280 -0
  90. package/dist/services/cron-service.test.js.map +1 -0
  91. package/dist/services/index.d.ts +5 -0
  92. package/dist/services/index.d.ts.map +1 -0
  93. package/dist/services/index.js +5 -0
  94. package/dist/services/index.js.map +1 -0
  95. package/dist/services/message-service.d.ts +16 -0
  96. package/dist/services/message-service.d.ts.map +1 -0
  97. package/dist/services/message-service.js +39 -0
  98. package/dist/services/message-service.js.map +1 -0
  99. package/dist/services/message-service.test.d.ts +2 -0
  100. package/dist/services/message-service.test.d.ts.map +1 -0
  101. package/dist/services/message-service.test.js +145 -0
  102. package/dist/services/message-service.test.js.map +1 -0
  103. package/dist/services/session-service.constraints.test.d.ts +2 -0
  104. package/dist/services/session-service.constraints.test.d.ts.map +1 -0
  105. package/dist/services/session-service.constraints.test.js +34 -0
  106. package/dist/services/session-service.constraints.test.js.map +1 -0
  107. package/dist/services/session-service.d.ts +27 -0
  108. package/dist/services/session-service.d.ts.map +1 -0
  109. package/dist/services/session-service.js +55 -0
  110. package/dist/services/session-service.js.map +1 -0
  111. package/dist/services/session-service.test.d.ts +2 -0
  112. package/dist/services/session-service.test.d.ts.map +1 -0
  113. package/dist/services/session-service.test.js +87 -0
  114. package/dist/services/session-service.test.js.map +1 -0
  115. package/dist/services/task-service.d.ts +25 -0
  116. package/dist/services/task-service.d.ts.map +1 -0
  117. package/dist/services/task-service.js +87 -0
  118. package/dist/services/task-service.js.map +1 -0
  119. package/dist/services/task-service.test.d.ts +2 -0
  120. package/dist/services/task-service.test.d.ts.map +1 -0
  121. package/dist/services/task-service.test.js +180 -0
  122. package/dist/services/task-service.test.js.map +1 -0
  123. package/package.json +41 -42
  124. package/dist/cli.d.ts +0 -2
  125. package/dist/cli.js +0 -317
  126. package/dist/commands/communicator.d.ts +0 -9
  127. package/dist/commands/communicator.js +0 -2232
  128. package/dist/commands/manage.d.ts +0 -5
  129. package/dist/commands/manage.js +0 -20
  130. package/dist/commands/notifier.d.ts +0 -11
  131. package/dist/commands/notifier.js +0 -100
  132. package/dist/commands/screensaver.d.ts +0 -8
  133. package/dist/commands/screensaver.js +0 -1280
  134. package/dist/commands/serve.d.ts +0 -13
  135. package/dist/commands/serve.js +0 -95
  136. package/dist/commands/task-board.d.ts +0 -29
  137. package/dist/commands/task-board.js +0 -251
  138. package/dist/commands/worker.d.ts +0 -16
  139. package/dist/commands/worker.js +0 -145
  140. package/dist/db/migrate.d.ts +0 -2
  141. package/dist/db/migrate.js +0 -3
  142. package/dist/lib/agentic-coding-server.d.ts +0 -66
  143. package/dist/lib/agentic-coding-server.js +0 -7
  144. package/dist/lib/notifier.d.ts +0 -18
  145. package/dist/lib/notifier.js +0 -15
  146. package/dist/lib/opencode-coding-server.d.ts +0 -11
  147. package/dist/lib/opencode-coding-server.js +0 -66
  148. package/dist/lib/pi-coding-server.d.ts +0 -20
  149. package/dist/lib/pi-coding-server.js +0 -162
  150. package/dist/manage/app.d.ts +0 -6
  151. package/dist/manage/app.js +0 -128
  152. package/dist/manage/components/AgentCode.d.ts +0 -8
  153. package/dist/manage/components/AgentCode.js +0 -73
  154. package/dist/manage/components/CreateSession.d.ts +0 -8
  155. package/dist/manage/components/CreateSession.js +0 -37
  156. package/dist/manage/components/CronList.d.ts +0 -9
  157. package/dist/manage/components/CronList.js +0 -321
  158. package/dist/manage/components/CronRequests.d.ts +0 -8
  159. package/dist/manage/components/CronRequests.js +0 -181
  160. package/dist/manage/components/DeleteSession.d.ts +0 -7
  161. package/dist/manage/components/DeleteSession.js +0 -55
  162. package/dist/manage/components/InjectText.d.ts +0 -8
  163. package/dist/manage/components/InjectText.js +0 -51
  164. package/dist/manage/components/ItemSelector.d.ts +0 -7
  165. package/dist/manage/components/ItemSelector.js +0 -20
  166. package/dist/manage/components/MenuSelect.d.ts +0 -13
  167. package/dist/manage/components/MenuSelect.js +0 -22
  168. package/dist/manage/components/MyMail.d.ts +0 -9
  169. package/dist/manage/components/MyMail.js +0 -143
  170. package/dist/manage/components/Profile.d.ts +0 -8
  171. package/dist/manage/components/Profile.js +0 -60
  172. package/dist/manage/components/ReadMail.d.ts +0 -8
  173. package/dist/manage/components/ReadMail.js +0 -110
  174. package/dist/manage/components/SendMessage.d.ts +0 -9
  175. package/dist/manage/components/SendMessage.js +0 -79
  176. package/dist/manage/components/SessionList.d.ts +0 -9
  177. package/dist/manage/components/SessionList.js +0 -608
  178. package/dist/manage/components/SessionSidebar.d.ts +0 -6
  179. package/dist/manage/components/SessionSidebar.js +0 -24
  180. package/dist/manage/components/TailMessages.d.ts +0 -8
  181. package/dist/manage/components/TailMessages.js +0 -126
  182. package/dist/manage/hooks/useApi.d.ts +0 -147
  183. package/dist/manage/hooks/useApi.js +0 -181
  184. package/dist/server/cron.d.ts +0 -25
  185. package/dist/server/cron.js +0 -107
  186. package/dist/server/index.d.ts +0 -4
  187. package/dist/server/index.js +0 -22
  188. package/dist/server/routes.d.ts +0 -13
  189. package/dist/server/routes.js +0 -1396
@@ -0,0 +1,180 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import { createMockStorage } from '../db/mock-storage.js';
3
+ import { TaskService } from './task-service.js';
4
+ describe('TaskService', () => {
5
+ let storage;
6
+ let service;
7
+ beforeEach(() => {
8
+ storage = createMockStorage();
9
+ service = new TaskService(storage);
10
+ });
11
+ describe('createTask', () => {
12
+ it('should create a new task', async () => {
13
+ const task = await service.createTask('Test Task', 'Description', null, 'idea', []);
14
+ expect(task.title).toBe('Test Task');
15
+ expect(task.description).toBe('Description');
16
+ expect(task.assignee).toBeNull();
17
+ expect(task.column).toBe('idea');
18
+ expect(task.dependencies).toEqual([]);
19
+ });
20
+ it('should throw error for invalid column', async () => {
21
+ await expect(service.createTask('Test', 'Desc', null, 'invalid-column', [])).rejects.toThrow('Invalid column "invalid-column"');
22
+ });
23
+ it('should create task with dependencies', async () => {
24
+ const depTask = await service.createTask('Dependency', 'Desc', null, 'idea', []);
25
+ const task = await service.createTask('Main Task', 'Desc', null, 'idea', [depTask.id]);
26
+ expect(task.dependencies).toContain(depTask.id);
27
+ });
28
+ });
29
+ describe('listTasks', () => {
30
+ it('should return empty array when no tasks exist', async () => {
31
+ const tasks = await service.listTasks();
32
+ expect(tasks).toEqual([]);
33
+ });
34
+ it('should return all tasks', async () => {
35
+ await service.createTask('Task 1', 'Desc 1', null, 'idea', []);
36
+ await service.createTask('Task 2', 'Desc 2', null, 'working on', []);
37
+ const tasks = await service.listTasks();
38
+ expect(tasks).toHaveLength(2);
39
+ });
40
+ });
41
+ describe('getTaskById', () => {
42
+ it('should return task by id', async () => {
43
+ const created = await service.createTask('Test', 'Desc', null, 'idea', []);
44
+ const retrieved = await service.getTaskById(created.id);
45
+ expect(retrieved).not.toBeNull();
46
+ expect(retrieved?.title).toBe('Test');
47
+ });
48
+ it('should return null for non-existent task', async () => {
49
+ const task = await service.getTaskById(999);
50
+ expect(task).toBeNull();
51
+ });
52
+ });
53
+ describe('updateTask', () => {
54
+ it('should update task title', async () => {
55
+ const task = await service.createTask('Original', 'Desc', null, 'idea', []);
56
+ const updated = await service.updateTask(task.id, { title: 'Updated' });
57
+ expect(updated.title).toBe('Updated');
58
+ });
59
+ it('should update task column', async () => {
60
+ const task = await service.createTask('Test', 'Desc', null, 'idea', []);
61
+ const updated = await service.updateTask(task.id, { column: 'working on' });
62
+ expect(updated.column).toBe('working on');
63
+ });
64
+ it('should throw error for invalid column', async () => {
65
+ const task = await service.createTask('Test', 'Desc', null, 'idea', []);
66
+ await expect(service.updateTask(task.id, { column: 'invalid' })).rejects.toThrow('Invalid column "invalid"');
67
+ });
68
+ it('should throw error for non-existent task', async () => {
69
+ await expect(service.updateTask(999, { title: 'Test' })).rejects.toThrow('Task 999 not found');
70
+ });
71
+ });
72
+ describe('deleteTask', () => {
73
+ it('should delete existing task', async () => {
74
+ const task = await service.createTask('Test', 'Desc', null, 'idea', []);
75
+ await service.deleteTask(task.id);
76
+ const deleted = await service.getTaskById(task.id);
77
+ expect(deleted).toBeNull();
78
+ });
79
+ it('should throw error for non-existent task', async () => {
80
+ await expect(service.deleteTask(999)).rejects.toThrow('Task 999 not found');
81
+ });
82
+ });
83
+ describe('searchTasks', () => {
84
+ it('should search by query in title', async () => {
85
+ await service.createTask('Feature A', 'Desc', null, 'idea', []);
86
+ await service.createTask('Feature B', 'Desc', null, 'idea', []);
87
+ await service.createTask('Bug Fix', 'Desc', null, 'idea', []);
88
+ const results = await service.searchTasks('Feature');
89
+ expect(results).toHaveLength(2);
90
+ });
91
+ it('should search by query in description', async () => {
92
+ await service.createTask('Task 1', 'Critical fix needed', null, 'idea', []);
93
+ await service.createTask('Task 2', 'Minor improvement', null, 'idea', []);
94
+ const results = await service.searchTasks('Critical');
95
+ expect(results).toHaveLength(1);
96
+ });
97
+ it('should filter by assignee', async () => {
98
+ await service.createTask('Task 1', 'Desc', 'Alice', 'idea', []);
99
+ await service.createTask('Task 2', 'Desc', 'Bob', 'idea', []);
100
+ const results = await service.searchTasks('', { assignee: 'Alice' });
101
+ expect(results).toHaveLength(1);
102
+ expect(results[0].assignee).toBe('Alice');
103
+ });
104
+ it('should filter by column', async () => {
105
+ await service.createTask('Task 1', 'Desc', null, 'idea', []);
106
+ await service.createTask('Task 2', 'Desc', null, 'working on', []);
107
+ const results = await service.searchTasks('', { column: 'idea' });
108
+ expect(results).toHaveLength(1);
109
+ expect(results[0].column).toBe('idea');
110
+ });
111
+ });
112
+ describe('assignTask', () => {
113
+ it('should assign task to user', async () => {
114
+ const task = await service.createTask('Test', 'Desc', null, 'idea', []);
115
+ const assigned = await service.assignTask(task.id, 'Alice');
116
+ expect(assigned.assignee).toBe('Alice');
117
+ });
118
+ });
119
+ describe('unassignTask', () => {
120
+ it('should remove assignee from task', async () => {
121
+ const task = await service.createTask('Test', 'Desc', 'Alice', 'idea', []);
122
+ const unassigned = await service.unassignTask(task.id);
123
+ expect(unassigned.assignee).toBeNull();
124
+ });
125
+ });
126
+ describe('moveTask', () => {
127
+ it('should move task to different column', async () => {
128
+ const task = await service.createTask('Test', 'Desc', null, 'idea', []);
129
+ const moved = await service.moveTask(task.id, 'working on');
130
+ expect(moved.column).toBe('working on');
131
+ });
132
+ it('should throw error when task already in column', async () => {
133
+ const task = await service.createTask('Test', 'Desc', null, 'idea', []);
134
+ await expect(service.moveTask(task.id, 'idea')).rejects.toThrow(`Task ${task.id} is already in column "idea"`);
135
+ });
136
+ it('should throw error for invalid column', async () => {
137
+ const task = await service.createTask('Test', 'Desc', null, 'idea', []);
138
+ await expect(service.moveTask(task.id, 'invalid')).rejects.toThrow('Invalid column "invalid"');
139
+ });
140
+ it('should throw error for non-existent task', async () => {
141
+ await expect(service.moveTask(999, 'working on')).rejects.toThrow('Task 999 not found');
142
+ });
143
+ });
144
+ describe('getColumnStats', () => {
145
+ it('should return stats for all columns', async () => {
146
+ await service.createTask('Task 1', 'Desc', null, 'idea', []);
147
+ await service.createTask('Task 2', 'Desc', null, 'idea', []);
148
+ await service.createTask('Task 3', 'Desc', null, 'working on', []);
149
+ const stats = await service.getColumnStats();
150
+ expect(stats).toHaveLength(6); // All valid columns
151
+ const ideaStat = stats.find(s => s.column === 'idea');
152
+ const workingStat = stats.find(s => s.column === 'working on');
153
+ expect(ideaStat?.count).toBe(2);
154
+ expect(workingStat?.count).toBe(1);
155
+ });
156
+ it('should return 0 for empty columns', async () => {
157
+ const stats = await service.getColumnStats();
158
+ for (const stat of stats) {
159
+ expect(stat.count).toBe(0);
160
+ }
161
+ });
162
+ });
163
+ describe('getTasksByAssignee', () => {
164
+ it('should return tasks for assignee', async () => {
165
+ await service.createTask('Task 1', 'Desc', 'Alice', 'idea', []);
166
+ await service.createTask('Task 2', 'Desc', 'Alice', 'working on', []);
167
+ await service.createTask('Task 3', 'Desc', 'Bob', 'idea', []);
168
+ const tasks = await service.getTasksByAssignee('Alice');
169
+ expect(tasks).toHaveLength(2);
170
+ });
171
+ it('should filter by column when specified', async () => {
172
+ await service.createTask('Task 1', 'Desc', 'Alice', 'idea', []);
173
+ await service.createTask('Task 2', 'Desc', 'Alice', 'working on', []);
174
+ const tasks = await service.getTasksByAssignee('Alice', 'idea');
175
+ expect(tasks).toHaveLength(1);
176
+ expect(tasks[0].column).toBe('idea');
177
+ });
178
+ });
179
+ });
180
+ //# sourceMappingURL=task-service.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-service.test.js","sourceRoot":"","sources":["../../src/services/task-service.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,58 +1,57 @@
1
1
  {
2
2
  "name": "agent-office",
3
- "version": "0.5.0",
4
- "description": "An office for your AI agents",
3
+ "version": "0.6.1",
4
+ "description": "A multi-agent office management system CLI",
5
5
  "type": "module",
6
- "license": "MIT",
7
- "author": "Richard Anaya",
6
+ "main": "./dist/index.js",
7
+ "bin": {
8
+ "agent-office": "./dist/index.js"
9
+ },
8
10
  "repository": {
9
11
  "type": "git",
10
- "url": "https://github.com/innercontext/agent-office"
12
+ "url": "git@github.com:innercontext/agent-office.git"
11
13
  },
12
- "homepage": "https://github.com/innercontext/agent-office#readme",
13
- "bugs": {
14
- "url": "https://github.com/innercontext/agent-office/issues"
15
- },
16
- "bin": {
17
- "agent-office": "./dist/cli.js"
18
- },
19
- "files": [
20
- "dist"
21
- ],
22
14
  "scripts": {
23
- "dev:serve": "tsx --watch src/cli.ts serve",
24
- "dev:manage": "tsx src/cli.ts manage",
25
- "dev:worker": "tsx src/cli.ts worker",
26
- "dev:app": "tsx src/cli.ts app",
15
+ "dev": "tsx watch src/index.ts",
27
16
  "build": "tsc",
28
- "clean": "rm -rf dist",
29
- "prepublishOnly": "npm run clean && npm run build"
30
- },
31
- "engines": {
32
- "node": ">=18.0.0"
17
+ "start": "tsx src/index.ts",
18
+ "typecheck": "tsc --noEmit",
19
+ "lint": "eslint src --ext .ts",
20
+ "format": "prettier --write \"src/**/*.{ts,tsx,js,json}\"",
21
+ "format:check": "prettier --check \"src/**/*.{ts,tsx,js,json}\"",
22
+ "test": "vitest run",
23
+ "test:watch": "vitest",
24
+ "test:coverage": "vitest run --coverage"
33
25
  },
26
+ "keywords": [
27
+ "cli",
28
+ "typescript",
29
+ "commander",
30
+ "multi-agent",
31
+ "office",
32
+ "management"
33
+ ],
34
+ "author": "Richard Anaya",
35
+ "license": "MIT",
36
+ "files": [
37
+ "dist",
38
+ "README.md"
39
+ ],
34
40
  "dependencies": {
35
- "@inkjs/ui": "^2.0.0",
36
- "@mariozechner/pi-ai": "^0.54.2",
37
- "@mariozechner/pi-coding-agent": "^0.54.2",
38
- "@opencode-ai/sdk": "^1.2.10",
39
- "agent-office": "^0.2.2",
40
- "better-sqlite3": "^12.6.2",
41
- "commander": "^14.0.0",
42
- "croner": "^10.0.1",
43
- "dotenv": "^17.0.0",
44
- "express": "^5.0.0",
45
- "ink": "^6.0.0",
46
- "postgres": "^3.4.0",
47
- "react": "^19.0.0",
48
- "resend": "^6.9.2"
41
+ "@toon-format/toon": "^2.1.0",
42
+ "better-sqlite3": "^12.3.1",
43
+ "commander": "^14.0.3",
44
+ "cron-schedule": "^6.0.0",
45
+ "g": "^2.0.1",
46
+ "postgres": "^3.4.8"
49
47
  },
50
48
  "devDependencies": {
51
49
  "@types/better-sqlite3": "^7.6.13",
52
- "@types/express": "^5.0.0",
53
- "@types/node": "^22.0.0",
54
- "@types/react": "^19.0.0",
50
+ "@types/node": "^22.15.14",
51
+ "@vitest/coverage-v8": "^4.0.18",
52
+ "prettier": "^3.5.0",
55
53
  "tsx": "^4.21.0",
56
- "typescript": "^5.0.0"
54
+ "typescript": "^5.9.3",
55
+ "vitest": "^4.0.18"
57
56
  }
58
57
  }
package/dist/cli.d.ts DELETED
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- import "dotenv/config";
package/dist/cli.js DELETED
@@ -1,317 +0,0 @@
1
- #!/usr/bin/env node
2
- import "dotenv/config";
3
- import { Command } from "commander";
4
- const program = new Command();
5
- program
6
- .name("agent-office")
7
- .description("Manage OpenCode sessions with named aliases.\n\n HUMAN OPERATORS: use 'serve' and 'manage'.\n AGENTS: use 'worker' subcommands only.")
8
- .version("0.1.0");
9
- program
10
- .command("serve")
11
- .description("[HUMAN ONLY] Start the agent-office HTTP server")
12
- .option("--database-url <url>", "PostgreSQL connection string", process.env.DATABASE_URL)
13
- .option("--sqlite <path>", "SQLite database file path (alternative to PostgreSQL)", process.env.AGENT_OFFICE_SQLITE)
14
- .option("--host <host>", "Host to bind to", "127.0.0.1")
15
- .option("--port <port>", "Port to serve on", "7654")
16
- .option("--password <password>", "REQUIRED. API password", process.env.AGENT_OFFICE_PASSWORD)
17
- .option("--opencode-url <url>", "URL of the OpenCode server (default: http://127.0.0.1:4096)", process.env.OPENCODE_URL ?? "http://127.0.0.1:4096")
18
- .option("--pi-vendor <vendor>", "PI coding vendor (e.g., xai, openai, anthropic). Required when using PI coding server.", process.env.PI_VENDOR)
19
- .option("--pi-model <model>", "PI coding model name (e.g., grok-code-fast-1). Required when using PI coding server.", process.env.PI_MODEL)
20
- .option("--pi-api-key <key>", "PI coding API key. Required when using PI coding server.", process.env.PI_API_KEY)
21
- .action(async (options) => {
22
- const { serve } = await import("./commands/serve.js");
23
- await serve(options);
24
- });
25
- program
26
- .command("manage")
27
- .description("[HUMAN ONLY] Launch the interactive TUI to manage sessions")
28
- .option("--url <url>", "URL of the agent-office server (e.g. http://127.0.0.1:7654)", process.env.AGENT_OFFICE_URL ?? "http://127.0.0.1:7654")
29
- .option("--password <password>", "REQUIRED. API password", process.env.AGENT_OFFICE_PASSWORD)
30
- .action(async (options) => {
31
- const { manage } = await import("./commands/manage.js");
32
- await manage(options.url, options);
33
- });
34
- const appCmd = program
35
- .command("app")
36
- .description("[HUMAN ONLY] Interactive visual applications");
37
- appCmd
38
- .command("chat")
39
- .description("Web chat interface for human to chat to coworkers")
40
- .option("--url <url>", "URL of the agent-office serve endpoint (e.g. http://127.0.0.1:7654)", process.env.AGENT_OFFICE_URL ?? "http://127.0.0.1:7654")
41
- .option("--password <password>", "API password for the agent-office server", process.env.AGENT_OFFICE_PASSWORD ?? "secret")
42
- .option("--host <host>", "Host to bind the web server to", "127.0.0.1")
43
- .option("--port <port>", "Port to run the web server on", "7655")
44
- .option("--xai-key <key>", "xAI API key for voice chat (enables voice button)", process.env.XAI_API_KEY)
45
- .action(async (options) => {
46
- const { appCoworkerChatWeb } = await import("./commands/communicator.js");
47
- await appCoworkerChatWeb(options);
48
- });
49
- appCmd.command("screensaver")
50
- .description("3D visualization of recent mail activity")
51
- .option("--url <url>", "URL of the agent-office serve endpoint (e.g. http://127.0.0.1:7654)", process.env.AGENT_OFFICE_URL ?? "http://127.0.0.1:7654")
52
- .option("--password <password>", "API password for the agent-office server", process.env.AGENT_OFFICE_PASSWORD ?? "secret")
53
- .option("--host <host>", "Host to bind the screensaver web server to", "127.0.0.1")
54
- .option("--port <port>", "Port to run the screensaver web server on", "7656")
55
- .action(async (options) => {
56
- const { appScreensaver } = await import("./commands/screensaver.js");
57
- await appScreensaver(options);
58
- });
59
- appCmd
60
- .command('notifier')
61
- .description('Notify human by email when unread messages have been waiting over certain amount of time')
62
- .option('--agent-office-url <url>', 'Agent Office server URL', process.env.AGENT_OFFICE_URL ?? 'http://127.0.0.1:7654')
63
- .option('--password <pw>', 'API password', process.env.AGENT_OFFICE_PASSWORD)
64
- .option('--to-email <email>', 'Recipient email address', process.env.TO_EMAIL)
65
- .option('--resend-api-key <key>', 'Resend API key', process.env.RESEND_API_KEY)
66
- .option('--domain <domain>', 'Sender domain (e.g. coworker.innercontext.com)', process.env.EMAIL_DOMAIN)
67
- .option('--wait-minutes <minutes>', 'Minutes a message must be unread before notifying', '15')
68
- .action(async (options) => {
69
- const { notifier } = await import('./commands/notifier.js');
70
- await notifier(options);
71
- });
72
- const workerCmd = program
73
- .command("worker")
74
- .description("Worker agent commands");
75
- const taskBoardCmd = workerCmd
76
- .command("task-board")
77
- .description("Manage a kanban-style task board with columns for task lifecycle tracking. Supports full CRUD operations, search, and analytics. Requires database connection (--database-url or --sqlite).")
78
- .option("--database-url <url>", "PostgreSQL database connection string for storing task data", process.env.DATABASE_URL)
79
- .option("--sqlite <path>", "Path to SQLite database file for storing task data (alternative to PostgreSQL)", process.env.AGENT_OFFICE_SQLITE);
80
- taskBoardCmd
81
- .command("list")
82
- .description("Display all tasks on the board, ordered by creation date (newest first). Use --column to filter tasks by their current column status.")
83
- .option("--column <column>", "Filter tasks to show only those in the specified column. Valid columns: idea, approved idea, working on, blocked, ready for review, done")
84
- .action(async (cmdOptions) => {
85
- const { listTasks } = await import("./commands/task-board.js");
86
- const options = taskBoardCmd.opts();
87
- await listTasks(options, cmdOptions);
88
- });
89
- taskBoardCmd
90
- .command("add <title> <description>")
91
- .description("Create a new task on the board. Title and description are required. Task starts in 'idea' column by default.")
92
- .option("--assignee <assignee>", "Assign the task to a specific person or team member")
93
- .option("--column <column>", "Place the task in a specific column (default: idea). Valid columns: idea, approved idea, working on, blocked, ready for review, done")
94
- .option("--dependencies <deps>", "Specify task IDs this new task depends on, as a comma-separated list (e.g., '1,3,5')")
95
- .action(async (title, description, cmdOptions) => {
96
- const { addTask } = await import("./commands/task-board.js");
97
- const options = taskBoardCmd.opts();
98
- await addTask(options, title, description, cmdOptions);
99
- });
100
- taskBoardCmd
101
- .command("update <id>")
102
- .description("Modify an existing task by its ID. You can update any combination of title, description, assignee, column, or dependencies. Only specified fields will be changed.")
103
- .option("--title <title>", "Update the task's title")
104
- .option("--description <desc>", "Update the task's description")
105
- .option("--assignee <assignee>", "Change or set the task assignee")
106
- .option("--column <column>", "Move the task to a different column. Valid columns: idea, approved idea, working on, blocked, ready for review, done")
107
- .option("--dependencies <deps>", "Update the task dependencies as a comma-separated list of task IDs (e.g., '2,4')")
108
- .action(async (id, cmdOptions) => {
109
- const { updateTask } = await import("./commands/task-board.js");
110
- const options = taskBoardCmd.opts();
111
- await updateTask(options, id, cmdOptions);
112
- });
113
- taskBoardCmd
114
- .command("delete <id>")
115
- .description("Permanently remove a task from the board by its ID. This action cannot be undone.")
116
- .action(async (id) => {
117
- const { deleteTask } = await import("./commands/task-board.js");
118
- const options = taskBoardCmd.opts();
119
- await deleteTask(options, id);
120
- });
121
- taskBoardCmd
122
- .command("move <id> <column>")
123
- .description("Change a task's status by moving it to a different column on the board. This is a quick way to update task progress.")
124
- .action(async (id, column) => {
125
- const { moveTask } = await import("./commands/task-board.js");
126
- const options = taskBoardCmd.opts();
127
- await moveTask(options, id, column);
128
- });
129
- taskBoardCmd
130
- .command("search <query>")
131
- .description("Find tasks that contain the query string at the beginning of their title or description (case-insensitive prefix search). Combine with filters for more precise results.")
132
- .option("--assignee <assignee>", "Only show tasks assigned to the specified person")
133
- .option("--column <column>", "Only show tasks in the specified column. Valid columns: idea, approved idea, working on, blocked, ready for review, done")
134
- .action(async (query, cmdOptions) => {
135
- const { searchTasks } = await import("./commands/task-board.js");
136
- const options = taskBoardCmd.opts();
137
- await searchTasks(options, query, cmdOptions);
138
- });
139
- taskBoardCmd
140
- .command("assign <id> <assignee>")
141
- .description("Assign an existing task to a specific person or team member. This updates only the assignee field without modifying other task properties.")
142
- .action(async (id, assignee) => {
143
- const { assignTask } = await import("./commands/task-board.js");
144
- const options = taskBoardCmd.opts();
145
- await assignTask(options, id, assignee);
146
- });
147
- taskBoardCmd
148
- .command("show <id>")
149
- .description("Display complete details for a specific task, including all fields, timestamps, and dependency information. Useful for getting full context about a task.")
150
- .action(async (id) => {
151
- const { showTask } = await import("./commands/task-board.js");
152
- const options = taskBoardCmd.opts();
153
- await showTask(options, id);
154
- });
155
- taskBoardCmd
156
- .command("stats")
157
- .description("Show comprehensive statistics about the entire task board, including total task count, distribution across columns, and assignment breakdown.")
158
- .action(async () => {
159
- const { showStats } = await import("./commands/task-board.js");
160
- const options = taskBoardCmd.opts();
161
- await showStats(options);
162
- });
163
- workerCmd
164
- .command("list-coworkers")
165
- .description("List all other workers (coworkers)")
166
- .argument("<token>", "Agent token in the format <agent_code>@<server-url>")
167
- .action(async (token) => {
168
- const { listCoworkers } = await import("./commands/worker.js");
169
- await listCoworkers(token);
170
- });
171
- workerCmd
172
- .command("set-status")
173
- .description("Set your public status (visible to coworkers and manager)")
174
- .argument("<token>", "Agent token in the format <agent_code>@<server-url>")
175
- .option("--status <status>", "Your status message (max 140 characters)")
176
- .option("--clear", "Clear your status")
177
- .action(async (token, options) => {
178
- if (options.clear) {
179
- const { setStatus } = await import("./commands/worker.js");
180
- await setStatus(token, null);
181
- }
182
- else if (options.status !== undefined) {
183
- const { setStatus } = await import("./commands/worker.js");
184
- await setStatus(token, options.status);
185
- }
186
- else {
187
- console.error("Error: either --status or --clear must be provided");
188
- process.exit(1);
189
- }
190
- });
191
- workerCmd
192
- .command("send-message")
193
- .description("Send a message to one or more coworkers")
194
- .argument("<token>", "Agent token in the format <agent_code>@<server-url>")
195
- .requiredOption("--name <name>", "Recipient name (can be specified multiple times)", (val, prev) => [...prev, val], [])
196
- .requiredOption("--body <body>", "Message body")
197
- .addHelpText("after", `
198
- Examples:
199
- agent-office worker send-message --name Alice --body "PR is ready" <token>
200
- agent-office worker send-message --name Alice --name Bob --body "Hello" <token>
201
-
202
- # Message body containing $: escape with \\ or use single quotes
203
- agent-office worker send-message --name Alice --body "Cost is \\$50" <token>
204
- agent-office worker send-message --name Alice --body 'Cost is $50' <token>
205
-
206
- Warning:
207
- The shell processes --body before the CLI receives it. Be mindful of bash
208
- special characters in your message body:
209
- $var, \${x} variable expansion → escape as \\$ or use single quotes
210
- \`cmd\`, $(x) command substitution → escape backticks or use single quotes
211
- !, \\\\, " history/escape chars → escape or use single quotes
212
- The safest option is always single quotes: --body 'your message here'
213
- (single quotes prevent all shell interpretation)`)
214
- .action(async (token, options) => {
215
- const { sendMessage } = await import("./commands/worker.js");
216
- await sendMessage(token, options.name, options.body);
217
- });
218
- // ── Worker Cron Commands (nested) ────────────────────────────────────────────────
219
- const cronCmd = workerCmd
220
- .command("cron")
221
- .description("Manage cron jobs");
222
- cronCmd
223
- .command("list")
224
- .argument("<token>", "Agent token in the format <agent_code>@<server-url>")
225
- .description("List all your cron jobs")
226
- .action(async (token) => {
227
- const { listCrons } = await import("./commands/worker.js");
228
- await listCrons(token);
229
- });
230
- cronCmd
231
- .command("request")
232
- .argument("<token>", "Agent token in the format <agent_code>@<server-url>")
233
- .description("Request a new cron job (requires human approval)")
234
- .requiredOption("--name <name>", "Cron job name")
235
- .requiredOption("--schedule <schedule>", "Cron expression (e.g., '0 9 * * *' for daily at 9am)")
236
- .requiredOption("--message <message>", "Action to perform when job fires")
237
- .requiredOption("--respond-to <respondTo>", "Who to respond to when done")
238
- .option("--timezone <timezone>", "IANA timezone (e.g., 'America/New_York')")
239
- .addHelpText("after", `
240
- Warning:
241
- The shell processes --message and --respond-to before the CLI receives them.
242
- Be mindful of bash special characters in these values:
243
- $var, \${x} variable expansion → escape as \\$ or use single quotes
244
- \`cmd\`, $(x) command substitution → escape backticks or use single quotes
245
- !, \\\\, " history/escape chars → escape or use single quotes
246
- The safest option is always single quotes: --message 'your message here'
247
- (single quotes prevent all shell interpretation)`)
248
- .action(async (token, options) => {
249
- const { requestCron } = await import("./commands/worker.js");
250
- await requestCron(token, options);
251
- });
252
- cronCmd
253
- .command("requests")
254
- .argument("<token>", "Agent token in the format <agent_code>@<server-url>")
255
- .description("List your cron job requests and their status")
256
- .action(async (token) => {
257
- const { listCronRequests } = await import("./commands/worker.js");
258
- await listCronRequests(token);
259
- });
260
- cronCmd
261
- .command("delete")
262
- .argument("<token>", "Agent token in the format <agent_code>@<server-url>")
263
- .argument("<id>", "Cron job ID")
264
- .description("Delete a cron job")
265
- .action(async (token, id) => {
266
- const cronId = parseInt(id, 10);
267
- if (isNaN(cronId)) {
268
- console.error("Error: Invalid cron job ID");
269
- process.exit(1);
270
- }
271
- const { deleteCron } = await import("./commands/worker.js");
272
- await deleteCron(token, cronId);
273
- });
274
- cronCmd
275
- .command("enable")
276
- .argument("<token>", "Agent token in the format <agent_code>@<server-url>")
277
- .argument("<id>", "Cron job ID")
278
- .description("Enable a cron job")
279
- .action(async (token, id) => {
280
- const cronId = parseInt(id, 10);
281
- if (isNaN(cronId)) {
282
- console.error("Error: Invalid cron job ID");
283
- process.exit(1);
284
- }
285
- const { enableCron } = await import("./commands/worker.js");
286
- await enableCron(token, cronId);
287
- });
288
- cronCmd
289
- .command("disable")
290
- .argument("<token>", "Agent token in the format <agent_code>@<server-url>")
291
- .argument("<id>", "Cron job ID")
292
- .description("Disable a cron job")
293
- .action(async (token, id) => {
294
- const cronId = parseInt(id, 10);
295
- if (isNaN(cronId)) {
296
- console.error("Error: Invalid cron job ID");
297
- process.exit(1);
298
- }
299
- const { disableCron } = await import("./commands/worker.js");
300
- await disableCron(token, cronId);
301
- });
302
- cronCmd
303
- .command("history")
304
- .argument("<token>", "Agent token in the format <agent_code>@<server-url>")
305
- .argument("<id>", "Cron job ID")
306
- .description("View execution history for a cron job")
307
- .option("--limit <limit>", "Maximum history entries (default 10)", "10")
308
- .action(async (token, id, options) => {
309
- const cronId = parseInt(id, 10);
310
- if (isNaN(cronId)) {
311
- console.error("Error: Invalid cron job ID");
312
- process.exit(1);
313
- }
314
- const { cronHistory } = await import("./commands/worker.js");
315
- await cronHistory(token, cronId);
316
- });
317
- program.parse();
@@ -1,9 +0,0 @@
1
- interface CommunicatorOptions {
2
- url: string;
3
- password: string;
4
- host: string;
5
- port: string;
6
- xaiKey?: string;
7
- }
8
- export declare function appCoworkerChatWeb(options: CommunicatorOptions): Promise<void>;
9
- export {};