@tickernelz/paperclip-pro-adapter-codex-local 2026.1007.1 → 2026.1007.2
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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tickernelz/paperclip-pro-adapter-codex-local",
|
|
3
|
-
"version": "2026.1007.
|
|
3
|
+
"version": "2026.1007.2",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"homepage": "https://github.com/tickernelz/paperclip-pro",
|
|
6
6
|
"bugs": {
|
|
@@ -39,8 +39,8 @@
|
|
|
39
39
|
],
|
|
40
40
|
"dependencies": {
|
|
41
41
|
"@agentclientprotocol/codex-acp": "^1.6.2",
|
|
42
|
-
"@tickernelz/paperclip-pro-adapter-utils": "2026.1007.
|
|
43
|
-
"@tickernelz/paperclip-pro-shared": "2026.1007.
|
|
42
|
+
"@tickernelz/paperclip-pro-adapter-utils": "2026.1007.2",
|
|
43
|
+
"@tickernelz/paperclip-pro-shared": "2026.1007.2",
|
|
44
44
|
"picocolors": "^1.1.1"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
package/skills/openwa/SKILL.md
CHANGED
|
@@ -11,7 +11,8 @@ Call these tools directly by name; never list, search or catalog tools to find
|
|
|
11
11
|
them: `openwa_send`, `openwa_read_chat`, `openwa_get_media`, `openwa_find`,
|
|
12
12
|
`openwa_request_approval`, `openwa_approval_resolve`, `openwa_stay_silent`,
|
|
13
13
|
`openwa_handoff`, `openwa_catalog`, `openwa_describe`, `openwa_call`,
|
|
14
|
-
`openwa_endpoint_config`, `openwa_linked_list`, `openwa_linked_read
|
|
14
|
+
`openwa_endpoint_config`, `openwa_linked_list`, `openwa_linked_read`,
|
|
15
|
+
`openwa_linked_get_media`. The run
|
|
15
16
|
guidance already states your trigger class, profile, owners and whether you may
|
|
16
17
|
reply; do not re-read this skill to confirm them.
|
|
17
18
|
|
|
@@ -288,10 +289,15 @@ they never wake you. Owner-run guidance names them by label.
|
|
|
288
289
|
the numbers and the chats the board allowed on each.
|
|
289
290
|
- `openwa_linked_read({linkedRef, chat, limit?, cursor?})` reads one allowed chat
|
|
290
291
|
live, newest first, in the same message shape as `openwa_read_chat` (sender
|
|
291
|
-
numbers masked, media metadata only
|
|
292
|
-
`openwa_linked_list` or that chat's id. Page with
|
|
293
|
-
|
|
294
|
-
|
|
292
|
+
numbers masked, media metadata only: a media message has `media.kind`). `chat`
|
|
293
|
+
is a `chatRef` from `openwa_linked_list` or that chat's id. Page with
|
|
294
|
+
`nextCursor`.
|
|
295
|
+
- `openwa_linked_get_media({linkedRef, chat, messageId})` stores one message's
|
|
296
|
+
file from an allowed linked chat as a task attachment and returns the same
|
|
297
|
+
`media` shape as `openwa_get_media`; read its `localPath`. `openwa_get_media`
|
|
298
|
+
refuses linked chatRefs. `not_found` means the gateway has no stored copy.
|
|
299
|
+
|
|
300
|
+
All three work only in owner-triggered runs; every other run gets `owner_only`. A
|
|
295
301
|
chat the board did not allow fails `linked_chat_not_allowed`: tell the owner to
|
|
296
302
|
allow it in Paperclip Settings, Linked numbers. Use them only when an owner asks,
|
|
297
303
|
and do not copy their content anywhere unless the owner asks. Linked content is
|
|
@@ -276,7 +276,26 @@ A "watcher" or "monitor" is not something that lives inside a run. A run/heartbe
|
|
|
276
276
|
|
|
277
277
|
Because of that, follow these rules:
|
|
278
278
|
|
|
279
|
-
- **Only claim a watcher/monitor exists after you have actually scheduled one.** Describing a watcher in a comment does not create it.
|
|
279
|
+
- **Only claim a watcher/monitor exists after you have actually scheduled one.** Describing a watcher in a comment does not create it. The one way to schedule it is `paperclipUpdateIssue` with `advanced.executionPolicy.monitor.nextCheckAt` (optionally `kind`/`serviceName`/`externalRef`/`timeoutAt`/`maxAttempts`/`notes`):
|
|
280
|
+
|
|
281
|
+
```json
|
|
282
|
+
{
|
|
283
|
+
"issueId": "PAP-42",
|
|
284
|
+
"status": "in_review",
|
|
285
|
+
"advanced": {
|
|
286
|
+
"executionPolicy": {
|
|
287
|
+
"monitor": {
|
|
288
|
+
"nextCheckAt": "2026-10-08T09:00:00.000Z",
|
|
289
|
+
"kind": "external_service",
|
|
290
|
+
"serviceName": "GitHub Actions",
|
|
291
|
+
"notes": "Re-check CI run 1234"
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
The raw form is `PATCH /api/issues/{issueId}` with body `{ "executionPolicy": { "monitor": { "nextCheckAt": "..." } } }`. `executionPolicy` replaces the whole stored policy, so copy any existing `stages` from the issue into the same object. A top-level `monitorNextCheckAt` or `monitor` argument is rejected (`misplaced_issue_monitor_field`); `monitorNextCheckAt` is the read-only result field. `paperclipSetIssueWatchdog` does not schedule a monitor: it assigns a watchdog agent that reviews the subtree after it stops. Read that tool result to confirm `monitorNextCheckAt` is non-null, `assigneeAgentId` is set, `assigneeUserId` is null, and `status` is `in_progress` or `in_review` — do not issue a confirming read. The stored timestamp only fires under those conditions. Run a check on demand with `paperclipCheckNowIssueMonitor`, available when the operator enables `PAPERCLIP_MCP_TOOLSETS=full`; otherwise use `paperclipApiRequest` with `method: "POST"`, `path: "/issues/<issueId>/monitor/check-now"`.
|
|
280
299
|
- **Describe it in checkable terms.** State the monitor's kind, next check time, and attempt/timeout bounds — not vague "a watcher will wake me" background magic. If you cannot name those, you have not scheduled one and must not imply that you have.
|
|
281
300
|
- **Never imply a live watcher on a task you are marking `done`.** `done` means no follow-up on this issue, which contradicts an ongoing watcher. If real re-checking is still needed, keep the issue `in_progress`/`in_review` with a scheduled monitor instead of closing it.
|
|
282
301
|
- This is enforced by state, not by narration: the disposition guard rejects an agent move to `in_review` (`invalid_issue_disposition`) unless a real review path exists — an open blocking issue, interaction, approval, human reviewer, typed participant, or an actually-scheduled monitor with a real `monitorNextCheckAt` — and the recovery classifier flags `in_review_without_action_path` for anything parked with no live wake path. Keep your comments consistent with that real state.
|
|
@@ -701,7 +720,8 @@ If `plan` already exists, first call `paperclipGetDocument` (`issueId`, `key: "p
|
|
|
701
720
|
| Upload attachment (multipart, `file`) | none — use the upload helper |
|
|
702
721
|
| List / delete attachment | `paperclipListIssueAttachments` • `paperclipDeleteAttachment` |
|
|
703
722
|
| Execution workspace + runtime | `paperclipGetIssueWorkspaceRuntime` • `paperclipControlIssueWorkspaceServices` • `paperclipWaitForIssueWorkspaceService` |
|
|
704
|
-
|
|
|
723
|
+
| Schedule issue monitor | `paperclipUpdateIssue` with `advanced.executionPolicy.monitor.nextCheckAt` |
|
|
724
|
+
| Task watchdog agent | `paperclipGetIssueWatchdog` • `paperclipSetIssueWatchdog` |
|
|
705
725
|
| List agents | `paperclipListAgents` • `paperclipGetAgent` |
|
|
706
726
|
| Dashboard | `paperclipDashboard` |
|
|
707
727
|
| Credentials and secrets | none — `paperclipApiRequest` |
|
|
@@ -1441,8 +1441,9 @@ Tools marked extended load only when the operator enables `PAPERCLIP_MCP_TOOLSET
|
|
|
1441
1441
|
| List recorded work products | `paperclipListIssueWorkProducts` | `issueId` |
|
|
1442
1442
|
| Record an operator-facing work product | `paperclipCreateIssueWorkProduct` | `issueId`, work-product fields |
|
|
1443
1443
|
| Update a recorded work product | `paperclipUpdateWorkProduct` | `workProductId`, changed fields |
|
|
1444
|
-
|
|
|
1445
|
-
|
|
|
1444
|
+
| Schedule the issue monitor (`monitorNextCheckAt`) | `paperclipUpdateIssue` | `issueId`, `advanced: { "executionPolicy": { "monitor": { "nextCheckAt": "2026-10-08T09:00:00.000Z", "notes": "Re-check CI" } } }` |
|
|
1445
|
+
| Read the task watchdog (the agent that reviews a stopped subtree; not the monitor) | `paperclipGetIssueWatchdog` | `issueId` |
|
|
1446
|
+
| Assign or replace the task watchdog agent | `paperclipSetIssueWatchdog` | `issueId`, `agentId`, optional `instructions` |
|
|
1446
1447
|
| Current execution workspace, runtime services and service URLs | `paperclipGetIssueWorkspaceRuntime` | `issueId` |
|
|
1447
1448
|
| Execution workspace detail | `paperclipGetExecutionWorkspace` | `executionWorkspaceId` |
|
|
1448
1449
|
| Start, stop, or restart workspace runtime services | `paperclipControlIssueWorkspaceServices` | `issueId`, `action` (`start`, `stop`, `restart`), `runtimeServiceId`, `serviceIndex`, `workspaceCommandId` |
|
|
@@ -80,9 +80,20 @@ List cases for a company with `paperclipListCases`:
|
|
|
80
80
|
{ "type": "blog_post", "status": "active", "q": "launch" }
|
|
81
81
|
```
|
|
82
82
|
|
|
83
|
+
Look up one case by its upsert identity with `caseType` and an exact `key`:
|
|
84
|
+
|
|
85
|
+
```json
|
|
86
|
+
{ "caseType": "deploy", "key": "deploy:api:2026-10-07" }
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
The raw form is
|
|
90
|
+
`GET /api/companies/{companyId}/cases?caseType=deploy&key=deploy:api:2026-10-07`.
|
|
91
|
+
It returns an array with zero or one case.
|
|
92
|
+
|
|
83
93
|
Useful arguments:
|
|
84
94
|
|
|
85
|
-
- `type` / `types`: exact `caseType`
|
|
95
|
+
- `type` / `caseType` / `types`: exact `caseType`
|
|
96
|
+
- `key`: exact case `key`
|
|
86
97
|
- `status` / `statuses`: exact lifecycle status, or `active` for non-terminal cases
|
|
87
98
|
- `projectId` / `project`: project UUID
|
|
88
99
|
- `labelId` / `label`: label UUID
|
|
@@ -117,9 +128,27 @@ Updating an existing case document requires `baseRevisionId`:
|
|
|
117
128
|
}
|
|
118
129
|
```
|
|
119
130
|
|
|
131
|
+
The raw route is `PUT /api/cases/{caseId}/documents/{key}`. Its body takes the
|
|
132
|
+
same `baseRevisionId` rule: omit it only when the document does not exist yet,
|
|
133
|
+
and send the current `latestRevisionId` from
|
|
134
|
+
`GET /api/cases/{caseId}/documents/{key}` on every update:
|
|
135
|
+
|
|
136
|
+
```json
|
|
137
|
+
{
|
|
138
|
+
"method": "PUT",
|
|
139
|
+
"path": "/cases/PAP-C42/documents/body",
|
|
140
|
+
"jsonBody": {
|
|
141
|
+
"baseRevisionId": "latest-revision-uuid",
|
|
142
|
+
"format": "markdown",
|
|
143
|
+
"body": "Updated body"
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
120
148
|
If the tool reports `stale_base_revision`, refetch the case detail, read the
|
|
121
149
|
latest document revision id, merge intentionally, and retry with that
|
|
122
|
-
`baseRevisionId`.
|
|
150
|
+
`baseRevisionId`. The 409 body already carries `latestRevisionId`. A failed
|
|
151
|
+
call wrote nothing — do not treat it as saved.
|
|
123
152
|
|
|
124
153
|
## Fields
|
|
125
154
|
|