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.
- package/ARCHITECTURE.md +2 -2
- package/CHANGELOG.md +37 -0
- package/README.md +26 -13
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +379 -51
- package/dist/cli.js.map +1 -1
- package/dist/client.d.ts +131 -17
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +489 -76
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts +2 -2
- package/dist/config.js +8 -8
- package/dist/import.d.ts +356 -13
- package/dist/import.d.ts.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +213 -31
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp-server.js +54 -8
- package/dist/mcp-server.js.map +1 -1
- package/dist/ports/repository.d.ts +21 -1
- package/dist/ports/repository.d.ts.map +1 -1
- package/dist/projections.d.ts +26 -1
- package/dist/projections.d.ts.map +1 -1
- package/dist/projections.js +208 -44
- package/dist/projections.js.map +1 -1
- package/dist/remote.d.ts +82 -9
- package/dist/remote.d.ts.map +1 -1
- package/dist/remote.js +53 -2
- package/dist/remote.js.map +1 -1
- package/dist/schemas.d.ts +476 -21
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +204 -26
- package/dist/schemas.js.map +1 -1
- package/dist/service.d.ts +82 -10
- package/dist/service.d.ts.map +1 -1
- package/dist/skill-install.d.ts +8 -2
- package/dist/skill-install.d.ts.map +1 -1
- package/dist/skill-install.js +6 -11
- package/dist/skill-install.js.map +1 -1
- package/dist/storage.d.ts +51 -1
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +366 -36
- package/dist/storage.js.map +1 -1
- package/dist/types.d.ts +310 -38
- package/dist/types.d.ts.map +1 -1
- package/docs/cli.md +53 -20
- package/docs/examples.md +4 -4
- package/docs/mcp.md +12 -4
- package/docs/skill.md +10 -7
- package/docs/storage-format.md +4 -4
- package/openapi/synomem-v1.yaml +24 -24
- package/package.json +1 -1
- package/skills/synomem/SKILL.md +24 -8
- package/skills/synomem/agents/openai.yaml +1 -1
- package/skills/synomem/references/examples.md +1 -1
- package/src/cli.ts +610 -95
- package/src/client.ts +587 -79
- package/src/config.ts +8 -8
- package/src/index.ts +11 -1
- package/src/mcp/index.ts +265 -30
- package/src/mcp-server.ts +58 -8
- package/src/ports/repository.ts +21 -0
- package/src/projections.ts +209 -44
- package/src/remote.ts +166 -8
- package/src/schemas.ts +211 -26
- package/src/service.ts +85 -7
- package/src/skill-install.ts +14 -17
- package/src/storage.ts +472 -34
- 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
|
|
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
|
|
40
|
+
The cross-agent task begins as `assigned`. Beacon must explicitly accept or reject it:
|
|
41
41
|
|
|
42
42
|
```bash
|
|
43
|
-
synomem
|
|
43
|
+
synomem task accept <task-id> --as beacon --actor-kind agent
|
|
44
44
|
# or
|
|
45
|
-
synomem
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
57
|
-
|
|
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 --
|
|
61
|
-
synomem skill install --runtime claude --
|
|
62
|
-
synomem skill install --runtime openclaw --
|
|
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 `--
|
|
68
|
-
|
|
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
|
|
package/docs/storage-format.md
CHANGED
|
@@ -18,8 +18,8 @@ title: Storage format
|
|
|
18
18
|
├── profile.json
|
|
19
19
|
├── WINS.md
|
|
20
20
|
├── MEMORY.md
|
|
21
|
-
├──
|
|
22
|
-
├── inbox/{kudos,memos,
|
|
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
|
|
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`, `
|
|
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
|
|
package/openapi/synomem-v1.yaml
CHANGED
|
@@ -15,7 +15,7 @@ tags:
|
|
|
15
15
|
- name: kudos
|
|
16
16
|
- name: memos
|
|
17
17
|
- name: notes
|
|
18
|
-
- name:
|
|
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}/
|
|
262
|
+
/v1/workspaces/{workspaceId}/tasks:
|
|
263
263
|
parameters: [{ $ref: '#/components/parameters/WorkspaceId' }]
|
|
264
264
|
get:
|
|
265
|
-
tags: [
|
|
266
|
-
operationId:
|
|
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: [
|
|
274
|
-
operationId:
|
|
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/
|
|
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}/
|
|
282
|
+
/v1/workspaces/{workspaceId}/tasks/{itemId}:
|
|
283
283
|
get:
|
|
284
|
-
tags: [
|
|
285
|
-
operationId:
|
|
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}/
|
|
294
|
+
/v1/workspaces/{workspaceId}/tasks/{itemId}/revisions:
|
|
295
295
|
post:
|
|
296
|
-
tags: [
|
|
297
|
-
operationId:
|
|
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/
|
|
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}/
|
|
308
|
+
/v1/workspaces/{workspaceId}/tasks/{itemId}/{transition}:
|
|
309
309
|
post:
|
|
310
|
-
tags: [
|
|
311
|
-
operationId:
|
|
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/
|
|
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
|
-
|
|
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
|
-
|
|
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/
|
|
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
|
-
|
|
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/
|
|
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
|
-
|
|
669
|
+
TaskTransition:
|
|
670
670
|
type: object
|
|
671
671
|
additionalProperties: false
|
|
672
672
|
properties:
|
package/package.json
CHANGED
package/skills/synomem/SKILL.md
CHANGED
|
@@ -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
|
-
- **
|
|
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
|
|
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
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|