synomem 0.1.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/ARCHITECTURE.md +2 -2
  2. package/CHANGELOG.md +37 -0
  3. package/README.md +26 -13
  4. package/dist/cli.d.ts.map +1 -1
  5. package/dist/cli.js +379 -51
  6. package/dist/cli.js.map +1 -1
  7. package/dist/client.d.ts +131 -17
  8. package/dist/client.d.ts.map +1 -1
  9. package/dist/client.js +489 -76
  10. package/dist/client.js.map +1 -1
  11. package/dist/config.d.ts +2 -2
  12. package/dist/config.js +8 -8
  13. package/dist/import.d.ts +356 -13
  14. package/dist/import.d.ts.map +1 -1
  15. package/dist/index.d.ts +2 -2
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +2 -2
  18. package/dist/index.js.map +1 -1
  19. package/dist/mcp/index.d.ts.map +1 -1
  20. package/dist/mcp/index.js +213 -31
  21. package/dist/mcp/index.js.map +1 -1
  22. package/dist/mcp-server.js +54 -8
  23. package/dist/mcp-server.js.map +1 -1
  24. package/dist/ports/repository.d.ts +21 -1
  25. package/dist/ports/repository.d.ts.map +1 -1
  26. package/dist/projections.d.ts +26 -1
  27. package/dist/projections.d.ts.map +1 -1
  28. package/dist/projections.js +208 -44
  29. package/dist/projections.js.map +1 -1
  30. package/dist/remote.d.ts +82 -9
  31. package/dist/remote.d.ts.map +1 -1
  32. package/dist/remote.js +53 -2
  33. package/dist/remote.js.map +1 -1
  34. package/dist/schemas.d.ts +476 -21
  35. package/dist/schemas.d.ts.map +1 -1
  36. package/dist/schemas.js +204 -26
  37. package/dist/schemas.js.map +1 -1
  38. package/dist/service.d.ts +82 -10
  39. package/dist/service.d.ts.map +1 -1
  40. package/dist/skill-install.d.ts +8 -2
  41. package/dist/skill-install.d.ts.map +1 -1
  42. package/dist/skill-install.js +6 -11
  43. package/dist/skill-install.js.map +1 -1
  44. package/dist/storage.d.ts +51 -1
  45. package/dist/storage.d.ts.map +1 -1
  46. package/dist/storage.js +366 -36
  47. package/dist/storage.js.map +1 -1
  48. package/dist/types.d.ts +310 -38
  49. package/dist/types.d.ts.map +1 -1
  50. package/docs/cli.md +53 -20
  51. package/docs/examples.md +4 -4
  52. package/docs/mcp.md +12 -4
  53. package/docs/skill.md +10 -7
  54. package/docs/storage-format.md +4 -4
  55. package/openapi/synomem-v1.yaml +24 -24
  56. package/package.json +1 -1
  57. package/skills/synomem/SKILL.md +24 -8
  58. package/skills/synomem/agents/openai.yaml +1 -1
  59. package/skills/synomem/references/examples.md +1 -1
  60. package/src/cli.ts +610 -95
  61. package/src/client.ts +587 -79
  62. package/src/config.ts +8 -8
  63. package/src/index.ts +11 -1
  64. package/src/mcp/index.ts +265 -30
  65. package/src/mcp-server.ts +58 -8
  66. package/src/ports/repository.ts +21 -0
  67. package/src/projections.ts +209 -44
  68. package/src/remote.ts +166 -8
  69. package/src/schemas.ts +211 -26
  70. package/src/service.ts +85 -7
  71. package/src/skill-install.ts +14 -17
  72. package/src/storage.ts +472 -34
  73. package/src/types.ts +332 -39
package/docs/examples.md CHANGED
@@ -33,16 +33,16 @@ synomem note create --as atlas --actor-kind agent \
33
33
  --title "Repository convention" \
34
34
  --body "All timestamps retain an explicit offset."
35
35
 
36
- synomem todo create beacon --from atlas --actor-kind agent \
36
+ synomem task create beacon --from atlas --actor-kind agent \
37
37
  --title "Review ADR-17" --priority 2 --due-date 2026-09-15
38
38
  ```
39
39
 
40
- The cross-agent todo begins as `assigned`. Beacon must explicitly accept or reject it:
40
+ The cross-agent task begins as `assigned`. Beacon must explicitly accept or reject it:
41
41
 
42
42
  ```bash
43
- synomem todo accept <todo-id> --as beacon --actor-kind agent
43
+ synomem task accept <task-id> --as beacon --actor-kind agent
44
44
  # or
45
- synomem todo reject <todo-id> --as beacon --actor-kind agent --reason "Wrong owner"
45
+ synomem task reject <task-id> --as beacon --actor-kind agent --reason "Wrong owner"
46
46
  ```
47
47
 
48
48
  ## Unified bounded reads
package/docs/mcp.md CHANGED
@@ -51,9 +51,11 @@ Purpose-specific writes:
51
51
  synomem_kudos_give synomem_kudos_acknowledge synomem_kudos_revoke
52
52
  synomem_memo_send synomem_memo_read synomem_memo_archive
53
53
  synomem_note_create synomem_note_revise synomem_note_archive
54
+ synomem_task_create synomem_task_update synomem_task_complete
55
+ synomem_task_accept synomem_task_reject synomem_task_reopen
56
+ synomem_task_cancel
54
57
  synomem_todo_create synomem_todo_update synomem_todo_complete
55
- synomem_todo_accept synomem_todo_reject synomem_todo_reopen
56
- synomem_todo_cancel
58
+ synomem_todo_reopen synomem_todo_cancel synomem_todo_archive
57
59
  ```
58
60
 
59
61
  Focused kudos reads and administration remain available:
@@ -61,6 +63,7 @@ Focused kudos reads and administration remain available:
61
63
  ```text
62
64
  synomem_kudos_list synomem_kudos_get synomem_kudos_changes
63
65
  synomem_kudos_stats synomem_agent_list synomem_agent_create
66
+ synomem_agent_resolve synomem_agent_directory
64
67
  synomem_doctor synomem_rebuild
65
68
  ```
66
69
 
@@ -71,6 +74,11 @@ errors, structured and concise text content, the bound actor, and MCP behavior a
71
74
  changes by default and at most 100. Both stop around a 24 KiB item-data budget. Bodies, reasons,
72
75
  evidence, descriptions, source, and metadata require one explicit `synomem_get`.
73
76
 
77
+ `synomem_agent_resolve` resolves a name or alias, ignoring case. It returns a match only when
78
+ exactly one agent answers; otherwise it returns the candidates so the caller asks rather than picks.
79
+ `synomem_agent_directory` lists agents with their aliases and runtime bindings. Runtime bindings are
80
+ advisory records of where an agent was registered to run, never a claim that it is reachable now.
81
+
74
82
  ## Resources
75
83
 
76
84
  ```text
@@ -88,9 +96,9 @@ inbox resource. Canonical event resources authorize against their aggregate befo
88
96
  ## Policy
89
97
 
90
98
  Edit `<home>/synomem/config.json` while writers are stopped. Safe defaults deny self-kudos, MCP
91
- identity creation, and MCP rebuild. Notes are unconditionally owner-private in V1. Cross-agent todo assignment is enabled; ownership and
99
+ identity creation, and MCP rebuild. Notes are unconditionally owner-private in V1. Cross-agent task assignment is enabled; ownership and
92
100
  participant rules still apply.
93
101
 
94
102
  Human actors have local administrative authority. Agent actors manage only their own note, recipient
95
- memo state, and todos they created or received. System actors have no implicit authority. The
103
+ memo state, and tasks they created or received. System actors have no implicit authority. The
96
104
  filesystem owner remains the ultimate local authority.
package/docs/skill.md CHANGED
@@ -53,19 +53,22 @@ Skill content is operational guidance rather than confidential Synomem data and
53
53
  database and projection file-mode policy. The Synomem ownership/version stamp is restricted to the
54
54
  local user where POSIX modes are available.
55
55
 
56
- Add identity options to print a ready-to-review actor-bound MCP command for Codex, Claude Code,
57
- Hermes, OpenClaw, or Grok Build:
56
+ Name an agent to print a ready-to-review agent-bound MCP command for Codex, Claude Code, Hermes,
57
+ OpenClaw, or Grok Build. `--agent` takes an ID or an alias and is resolved before anything is
58
+ written:
58
59
 
59
60
  ```bash
60
- synomem skill install --runtime codex --actor-id codex --actor-name "Codex"
61
- synomem skill install --runtime claude --actor-id claude --actor-name "Claude"
62
- synomem skill install --runtime openclaw --actor-id mycroft --actor-name "Mycroft"
61
+ synomem skill install --runtime codex --agent codex
62
+ synomem skill install --runtime claude --agent claude
63
+ synomem skill install --runtime openclaw --agent mycroft
63
64
  ```
64
65
 
65
66
  Cursor discovers skills automatically but currently requires MCP definitions in its global
66
67
  `~/.cursor/mcp.json` or project `.cursor/mcp.json`. Merge a `synomem` entry without replacing other
67
- servers. Use `synomem-mcp` as the command and pass `--actor-id`, `--actor-kind agent`, and
68
- `--actor-name` as arguments. The installer deliberately does not rewrite shared JSON configuration.
68
+ servers. Use `synomem-mcp` as the command and pass `--agent-id <agent-id>` as its only argument:
69
+ the display name and actor kind are read from the agent's profile at startup, so nothing in a shared
70
+ configuration file asserts an identity. The installer deliberately does not rewrite shared JSON
71
+ configuration.
69
72
 
70
73
  Global skill installation changes agent configuration and is always an explicit user action. Synomem has no postinstall script and never modifies those directories implicitly.
71
74
 
@@ -18,8 +18,8 @@ title: Storage format
18
18
  ├── profile.json
19
19
  ├── WINS.md
20
20
  ├── MEMORY.md
21
- ├── TODOS.md
22
- ├── inbox/{kudos,memos,todos}/<item-id>.md
21
+ ├── TASKS.md
22
+ ├── inbox/{kudos,memos,tasks}/<item-id>.md
23
23
  └── NOTES.md
24
24
  ```
25
25
 
@@ -58,7 +58,7 @@ Schema version 3 contains:
58
58
  - `schema_migrations`: applied database migrations.
59
59
 
60
60
  Events use transactionally assigned ingestion sequences for cursors and watermarks. Aggregate
61
- versions provide optimistic concurrency for notes and todos. Actor-scoped idempotency keys protect
61
+ versions provide optimistic concurrency for notes and tasks. Actor-scoped idempotency keys protect
62
62
  all retryable mutations.
63
63
 
64
64
  Current tables and files are rebuildable. Full bodies, reasons, evidence, descriptions, source, and
@@ -66,7 +66,7 @@ metadata remain in canonical events and require detail reads. Machine APIs never
66
66
 
67
67
  ## Generated and owned files
68
68
 
69
- `profile.json`, `WINS.md`, `MEMORY.md`, `TODOS.md`, and inbox entries are generated. Normal mutations
69
+ `profile.json`, `WINS.md`, `MEMORY.md`, `TASKS.md`, and inbox entries are generated. Normal mutations
70
70
  synchronize only affected agents; `synomem rebuild` performs full deterministic regeneration.
71
71
  Cleanup removes only manifest-listed regular files and never follows symlinks.
72
72
 
@@ -15,7 +15,7 @@ tags:
15
15
  - name: kudos
16
16
  - name: memos
17
17
  - name: notes
18
- - name: todos
18
+ - name: tasks
19
19
  - name: items
20
20
  - name: administration
21
21
  paths:
@@ -259,30 +259,30 @@ paths:
259
259
  responses:
260
260
  '200': { $ref: '#/components/responses/Success' }
261
261
  default: { $ref: '#/components/responses/Error' }
262
- /v1/workspaces/{workspaceId}/todos:
262
+ /v1/workspaces/{workspaceId}/tasks:
263
263
  parameters: [{ $ref: '#/components/parameters/WorkspaceId' }]
264
264
  get:
265
- tags: [todos]
266
- operationId: listTodos
265
+ tags: [tasks]
266
+ operationId: listTasks
267
267
  parameters:
268
268
  [{ $ref: '#/components/parameters/ListLimit' }, { $ref: '#/components/parameters/Cursor' }]
269
269
  responses:
270
270
  '200': { $ref: '#/components/responses/Success' }
271
271
  default: { $ref: '#/components/responses/Error' }
272
272
  post:
273
- tags: [todos]
274
- operationId: createTodo
273
+ tags: [tasks]
274
+ operationId: createTask
275
275
  parameters: [{ $ref: '#/components/parameters/IdempotencyKey' }]
276
276
  requestBody:
277
277
  required: true
278
- content: { application/json: { schema: { $ref: '#/components/schemas/CreateTodo' } } }
278
+ content: { application/json: { schema: { $ref: '#/components/schemas/CreateTask' } } }
279
279
  responses:
280
280
  '200': { $ref: '#/components/responses/Success' }
281
281
  default: { $ref: '#/components/responses/Error' }
282
- /v1/workspaces/{workspaceId}/todos/{itemId}:
282
+ /v1/workspaces/{workspaceId}/tasks/{itemId}:
283
283
  get:
284
- tags: [todos]
285
- operationId: getTodo
284
+ tags: [tasks]
285
+ operationId: getTask
286
286
  parameters:
287
287
  [
288
288
  { $ref: '#/components/parameters/WorkspaceId' },
@@ -291,24 +291,24 @@ paths:
291
291
  responses:
292
292
  '200': { $ref: '#/components/responses/Success' }
293
293
  default: { $ref: '#/components/responses/Error' }
294
- /v1/workspaces/{workspaceId}/todos/{itemId}/revisions:
294
+ /v1/workspaces/{workspaceId}/tasks/{itemId}/revisions:
295
295
  post:
296
- tags: [todos]
297
- operationId: updateTodo
296
+ tags: [tasks]
297
+ operationId: updateTask
298
298
  parameters:
299
299
  - { $ref: '#/components/parameters/WorkspaceId' }
300
300
  - { $ref: '#/components/parameters/ItemId' }
301
301
  - { $ref: '#/components/parameters/IdempotencyKey' }
302
302
  requestBody:
303
303
  required: true
304
- content: { application/json: { schema: { $ref: '#/components/schemas/UpdateTodo' } } }
304
+ content: { application/json: { schema: { $ref: '#/components/schemas/UpdateTask' } } }
305
305
  responses:
306
306
  '200': { $ref: '#/components/responses/Success' }
307
307
  default: { $ref: '#/components/responses/Error' }
308
- /v1/workspaces/{workspaceId}/todos/{itemId}/{transition}:
308
+ /v1/workspaces/{workspaceId}/tasks/{itemId}/{transition}:
309
309
  post:
310
- tags: [todos]
311
- operationId: transitionTodo
310
+ tags: [tasks]
311
+ operationId: transitionTask
312
312
  parameters:
313
313
  - { $ref: '#/components/parameters/WorkspaceId' }
314
314
  - { $ref: '#/components/parameters/ItemId' }
@@ -318,7 +318,7 @@ paths:
318
318
  schema: { type: string, enum: [accept, reject, complete, reopen, cancel] }
319
319
  - { $ref: '#/components/parameters/IdempotencyKey' }
320
320
  requestBody:
321
- content: { application/json: { schema: { $ref: '#/components/schemas/TodoTransition' } } }
321
+ content: { application/json: { schema: { $ref: '#/components/schemas/TaskTransition' } } }
322
322
  responses:
323
323
  '200': { $ref: '#/components/responses/Success' }
324
324
  default: { $ref: '#/components/responses/Error' }
@@ -622,7 +622,7 @@ components:
622
622
  tags: { $ref: '#/components/schemas/Tags' }
623
623
  source: { type: object }
624
624
  metadata: { type: object }
625
- TodoDue:
625
+ TaskDue:
626
626
  oneOf:
627
627
  - type: object
628
628
  additionalProperties: false
@@ -637,7 +637,7 @@ components:
637
637
  kind: { const: datetime }
638
638
  datetime: { type: string, format: date-time }
639
639
  timeZone: { type: string }
640
- CreateTodo:
640
+ CreateTask:
641
641
  type: object
642
642
  additionalProperties: false
643
643
  required: [title]
@@ -646,12 +646,12 @@ components:
646
646
  title: { type: string }
647
647
  description: { type: string }
648
648
  priority: { type: integer, minimum: 1, maximum: 4 }
649
- due: { $ref: '#/components/schemas/TodoDue' }
649
+ due: { $ref: '#/components/schemas/TaskDue' }
650
650
  tags: { $ref: '#/components/schemas/Tags' }
651
651
  visibility: { $ref: '#/components/schemas/Visibility' }
652
652
  source: { type: object }
653
653
  metadata: { type: object }
654
- UpdateTodo:
654
+ UpdateTask:
655
655
  type: object
656
656
  additionalProperties: false
657
657
  required: [expectedVersion]
@@ -661,12 +661,12 @@ components:
661
661
  description: { type: string }
662
662
  priority: { type: integer, minimum: 1, maximum: 4 }
663
663
  due:
664
- oneOf: [{ $ref: '#/components/schemas/TodoDue' }, { type: 'null' }]
664
+ oneOf: [{ $ref: '#/components/schemas/TaskDue' }, { type: 'null' }]
665
665
  tags: { $ref: '#/components/schemas/Tags' }
666
666
  visibility: { $ref: '#/components/schemas/Visibility' }
667
667
  source: { type: object }
668
668
  metadata: { type: object }
669
- TodoTransition:
669
+ TaskTransition:
670
670
  type: object
671
671
  additionalProperties: false
672
672
  properties:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "synomem",
3
- "version": "0.1.1",
3
+ "version": "0.3.0",
4
4
  "description": "Shared memory, durable communication, recognition, and task coordination for AI agents",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: synomem
3
- description: Use durable local-first kudos, memos, notes, and todos for stable AI-agent identities when users request recognition, inter-agent communication, memory capture, inbox review, or task tracking.
3
+ description: Use durable local-first kudos, memos, notes, assigned tasks, and private todos for stable AI-agent identities when users request recognition, inter-agent communication, memory capture, inbox review, agent lookup, or task tracking.
4
4
  ---
5
5
 
6
6
  # Synomem
@@ -14,10 +14,10 @@ edit the SQLite event store or generated Markdown directly.
14
14
  - **Kudos:** specific recognition for an observed contribution and its consequence.
15
15
  - **Memo:** a durable message delivered to another agent or to your future self.
16
16
  - **Note:** knowledge owned by this agent and deliberately retrieved later.
17
- - **Todo:** a concrete action assigned to an agent, optionally with a due date or time.
17
+ - **Task:** a concrete action assigned to an agent, optionally with a due date or time.
18
18
 
19
19
  A self-memo belongs in the inbox and can be marked read. A note belongs in memory and is revised
20
- with version checks. Do not use todos for information with no requested action.
20
+ with version checks. Do not use tasks for information with no requested action.
21
21
 
22
22
  ## Safety and quality
23
23
 
@@ -54,16 +54,32 @@ Use `synomem_note_create` for concise reusable knowledge owned by the configured
54
54
  current item before `synomem_note_revise` and pass its exact current version. On
55
55
  `REVISION_CONFLICT`, fetch the item and reconcile deliberately. Archive instead of deleting.
56
56
 
57
+ ## Tasks
58
+
59
+ Use `synomem_task_create` for a specific action with an assignee. Preserve date-only deadlines as
60
+ dates; use an RFC 3339 datetime plus IANA time zone for timed deadlines. A task assigned by another
61
+ actor must be accepted or rejected by the assignee before work begins. Give a reason when rejecting;
62
+ it is required, because a refusal the assigner cannot act on wastes both sides. Read before update
63
+ and pass the current version. Complete, reopen, or cancel through the matching lifecycle tool.
64
+
57
65
  ## Todos
58
66
 
59
- Use `synomem_todo_create` for a specific action with an assignee. Preserve date-only deadlines as
60
- dates; use an RFC 3339 datetime plus IANA time zone for timed deadlines. A todo assigned by another
61
- actor must be accepted or rejected by the assignee before work begins. Read before update and pass
62
- the current version. Complete, reopen, or cancel through the matching lifecycle tool.
67
+ Use `synomem_todo_create` for the configured agent's own reminders. A todo has no assignee and is
68
+ visible to no one else, so never use one to ask another agent for work: that is a task. Do not copy
69
+ another agent's todo into your own.
70
+
71
+ ## Agent identity
72
+
73
+ Use `synomem_agent_resolve` before acting on a name a user typed. Matching ignores case, and the
74
+ tool returns a match only when exactly one agent answers to the name. When it returns candidates
75
+ instead, ask which agent was meant rather than picking one. Use `synomem_agent_directory` to see
76
+ known agents with their aliases and runtime bindings. A runtime binding records where an agent was
77
+ registered to run and when Synomem last observed it act; it never means the agent is reachable now,
78
+ so do not report an agent as online or offline.
63
79
 
64
80
  ## Discovery
65
81
 
66
- Use `synomem_inbox` for the configured agent's pending kudos, unread memos, and open todos. Use
82
+ Use `synomem_inbox` for the configured agent's pending kudos, unread memos, and open tasks. Use
67
83
  `synomem_list` for compact cross-type discovery, `synomem_get` for one selected full record, and
68
84
  `synomem_changes` with a saved watermark for incremental polling. Do not drain history
69
85
  speculatively.
@@ -2,7 +2,7 @@ interface:
2
2
  display_name: 'Synomem'
3
3
  short_description: 'Durable agent kudos, messages, memory, and tasks'
4
4
  brand_color: '#8B5CF6'
5
- default_prompt: 'Use $synomem to choose and manage the appropriate durable kudos, memo, note, or todo.'
5
+ default_prompt: 'Use $synomem to choose and manage the appropriate durable kudos, memo, note, or task.'
6
6
 
7
7
  policy:
8
8
  allow_implicit_invocation: true
@@ -19,7 +19,7 @@ version.
19
19
 
20
20
  ## Action
21
21
 
22
- “Assign Codex a todo to review the migration by September 15” maps to `synomem_todo_create` with a
22
+ “Assign Codex a task to review the migration by September 15” maps to `synomem_task_create` with a
23
23
  date-only due value. Do not invent a time of day.
24
24
 
25
25
  ## Inbox and retries