@awak-app/simy-cli 0.7.29 → 0.7.32
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/README.md +88 -3
- package/package.json +2 -2
- package/src/agent.js +8 -2
- package/src/cli-contract.js +1 -1
- package/src/cli-observability.js +1 -1
- package/src/codex-plugins/simy/.codex-plugin/plugin.json +5 -3
- package/src/codex-plugins/simy/hooks/acceptance-policy.mjs +7 -0
- package/src/codex-plugins/simy/hooks/delivery-loop.mjs +389 -51
- package/src/codex-plugins/simy/hooks/purpose-evidence.mjs +6 -3
- package/src/codex-plugins/simy/hooks/update-dispatch-gate.mjs +126 -4
- package/src/codex-plugins/simy/skills/continue/SKILL.md +69 -0
- package/src/codex-plugins/simy/skills/continue/agents/openai.yaml +6 -0
- package/src/delivery-hooks/claude-workflow.md +3 -3
- package/src/delivery-hooks/command.js +8 -0
- package/src/delivery-hooks/desktop.js +31 -9
- package/src/delivery-hooks/supervisor.js +3 -2
- package/src/desktop-access.js +4 -1
- package/src/desktop-host.js +494 -72
- package/src/native-development-report-completion.js +26 -0
- package/src/native-development-reports.js +15 -5
- package/src/orchestrator/completion-contract.js +8 -2
- package/src/orchestrator/contract.js +3 -1
- package/src/orchestrator/instruction.js +1 -1
- package/src/runner.js +2 -1
- package/src/session-supervision/action-deadline.js +18 -1
- package/src/session-supervision/autonomous-upgrade.js +4 -2
- package/src/session-supervision/claude-desktop-archive.js +57 -0
- package/src/session-supervision/claude-desktop-native.js +50 -0
- package/src/session-supervision/claude-desktop-native.jxa.js +195 -0
- package/src/session-supervision/claude-desktop-target.js +87 -0
- package/src/session-supervision/claude-owner-renewal.js +197 -0
- package/src/session-supervision/claude-sessions.js +143 -34
- package/src/session-supervision/codex-app-server.js +20 -2
- package/src/session-supervision/continuation-analysis.js +7 -7
- package/src/session-supervision/continuation-command.js +45 -0
- package/src/session-supervision/controller-store.js +48 -0
- package/src/session-supervision/conversation-presentation.js +241 -0
- package/src/session-supervision/decision-presentation.js +96 -35
- package/src/session-supervision/execution-context.js +39 -0
- package/src/session-supervision/index.js +36 -7
- package/src/session-supervision/manual-acceptance-command.js +30 -0
- package/src/session-supervision/notification-authority.js +9 -0
- package/src/session-supervision/notification-journal.js +40 -0
- package/src/session-supervision/operation-journal.js +42 -0
- package/src/session-supervision/owner-transport.js +146 -0
- package/src/session-supervision/purpose-recovery.js +10 -2
- package/src/session-supervision/remote-control.js +1 -1
- package/src/session-supervision/remote-entry.js +2 -0
- package/src/session-supervision/remote-errors.js +15 -0
- package/src/session-supervision/remote-hosts.js +344 -36
- package/src/session-supervision/remote-metadata.js +103 -0
- package/src/session-supervision/remote-session-list.js +2 -4
- package/src/session-supervision/session-archive-command.js +45 -0
- package/src/session-supervision/session-list.js +40 -4
- package/src/session-supervision/sqm-presentation.js +46 -3
- package/src/session-supervision/stop-notifications.js +42 -11
- package/src/session-supervision/work-state.js +106 -6
- package/src/sqm/agent-skill.js +3 -3
- package/src/sqm/claude-plugin.js +5 -2
- package/src/sqm/history-store.js +6 -0
- package/src/team-threads.js +4 -7
- package/src/update-detachment/coordinator.js +7 -1
- package/src/update-detachment/history-recovery.js +18 -0
- package/src/update-detachment/ledger-adapter.js +1 -0
- package/src/update-detachment/retained-paused.js +290 -0
- package/src/update-detachment/runtime.js +78 -15
- package/src/web-api.js +9 -0
package/README.md
CHANGED
|
@@ -312,7 +312,30 @@ existing enabled plugins. Unrelated plugins and hooks are preserved.
|
|
|
312
312
|
`--no-workflow-prompt` skips initial preparation and background installation of
|
|
313
313
|
missing sources. Provider plugin enablement and hook trust remain provider-owned.
|
|
314
314
|
|
|
315
|
-
|
|
315
|
+
For conversation continuation, select SIMY in the Codex app with `@` and ask
|
|
316
|
+
`continue this task` (Japanese: `この作業を続けて`). The `continue` skill uses the
|
|
317
|
+
running app's existing Auto Continue switch and background coordinator. In
|
|
318
|
+
Codex CLI, use its native `$simy:continue` skill selector; in Claude Code use the
|
|
319
|
+
native `/simy:continue` command. Claude Code does not define `@simy` as a plugin
|
|
320
|
+
command: use the slash command for an explicit invocation. Merely mentioning
|
|
321
|
+
SIMY or seeing it in a menu does not start work.
|
|
322
|
+
|
|
323
|
+
The current plugin and CLI must both be installed, the SIMY app must be running
|
|
324
|
+
and signed in, and the original provider must be connected with its required
|
|
325
|
+
hooks enabled and trusted. A running original turn finishes before SIMY sends
|
|
326
|
+
another one. The chat command uses the exact original conversation; it never
|
|
327
|
+
starts a second Claude process or replaces a task to bypass a stop. Existing
|
|
328
|
+
stops, approval waits, goals, corrections and history retain their meaning.
|
|
329
|
+
|
|
330
|
+
The entry reports the same real work state, reason and next action shown by the
|
|
331
|
+
app. ON or `accepted: true` means delegation was saved; it does not prove a
|
|
332
|
+
provider turn executed. Inspect an exact target again with
|
|
333
|
+
`simy delivery auto-continue status --provider codex|claude --session UUID`.
|
|
334
|
+
`on` and `off` use the same target syntax. After a lost response, read status
|
|
335
|
+
before retrying. An old CLI that lacks this command needs its normal update;
|
|
336
|
+
the retired local delivery agents remain retired.
|
|
337
|
+
|
|
338
|
+
SQM checks apply when you explicitly request a quality check with `@simy`, invoke the SQM skill, or ask to use SQM for the current task. A continuation request selects `continue` instead. Ordinary PR creation and `git push` do not opt in. Upgrading and restarting the daemon migrates the legacy global PR gate and shipped personal skills; unrelated hooks are preserved. Start a new coding session to reload skill instructions.
|
|
316
339
|
|
|
317
340
|
After installation, restart Codex and find and install **SIMY** in **Plugins**
|
|
318
341
|
before using `@simy` in a new task.
|
|
@@ -382,8 +405,8 @@ provider refresh display an unknown execution state.
|
|
|
382
405
|
|
|
383
406
|
List-only hiding supports multiple selection and restoration without changing
|
|
384
407
|
provider archive state or execution consent. Codex archive/restore is a separate
|
|
385
|
-
explicit operation
|
|
386
|
-
|
|
408
|
+
explicit operation. Claude Desktop Code-tab archive/restore is available through
|
|
409
|
+
the terminal commands below on macOS, with native provider state readback. Related GitHub PR summaries are
|
|
387
410
|
read from structured provider metadata and refreshed through an installed,
|
|
388
411
|
authenticated `gh` CLI, with bounded reads, a one-minute cache, timestamps and
|
|
389
412
|
failure indicators. A merge alone never completes a conversation, and known
|
|
@@ -1338,6 +1361,12 @@ Connect an existing NVIDIA/SSH machine from **Remote connections…** in the
|
|
|
1338
1361
|
conversation sidebar. SIMY merges its conversations and sends operations to the
|
|
1339
1362
|
original machine. See [setup, access requirements and recovery](docs/remote-codex-sessions.md).
|
|
1340
1363
|
|
|
1364
|
+
When moving between LAN, Wi-Fi and mobile tethering, keep that same SSH alias
|
|
1365
|
+
and use a reachable VPN address or DNS name for its `HostName`. SIMY creates a
|
|
1366
|
+
fresh SSH connection after disconnection while retaining host and operation
|
|
1367
|
+
identity. A LAN-only address cannot provide access from another network; see
|
|
1368
|
+
[network switching setup](docs/remote-codex-sessions.md#switching-between-lan-wi-fi-and-a-phone-hotspot).
|
|
1369
|
+
|
|
1341
1370
|
### Local conversation list on NVIDIA / Linux
|
|
1342
1371
|
|
|
1343
1372
|
Run `simy sessions` to list local and explicitly registered SSH hosts. It reads
|
|
@@ -1384,6 +1413,62 @@ existing native protocol header. Web/gateway should preserve this marker and
|
|
|
1384
1413
|
Backend should require it at claim/invocation when a destination/Photos profile
|
|
1385
1414
|
is requested, so an old worker cannot silently ignore those required outputs.
|
|
1386
1415
|
|
|
1416
|
+
### Original conversation archive and restore
|
|
1417
|
+
|
|
1418
|
+
Update and start SIMY on the controller and conversation host, and connect Claude
|
|
1419
|
+
in SIMY using the existing provider settings. For Claude, the conversation host
|
|
1420
|
+
must be macOS with Claude Desktop signed in to its Code tab. The graphical SIMY
|
|
1421
|
+
interface is unchanged; these explicit terminal commands operate the original
|
|
1422
|
+
provider conversation, separately from hiding it in SIMY.
|
|
1423
|
+
|
|
1424
|
+
```sh
|
|
1425
|
+
simy sessions --provider claude --include-archived --json
|
|
1426
|
+
simy sessions provider-status --provider claude
|
|
1427
|
+
simy sessions provider-setup --provider claude
|
|
1428
|
+
simy sessions archive --provider claude --session UUID
|
|
1429
|
+
simy sessions restore --provider claude --session UUID
|
|
1430
|
+
```
|
|
1431
|
+
|
|
1432
|
+
Replace `UUID` with the exact session ID from the list. Setup opens macOS
|
|
1433
|
+
Accessibility settings on the conversation host. Enable access for the application
|
|
1434
|
+
running SIMY (SIMY for the installed app, or the terminal application for terminal
|
|
1435
|
+
launches), then run `provider-status` again. On newer macOS versions this pane
|
|
1436
|
+
may be named “Device Control and Data Access” (デバイスの制御とデータへのアクセス).
|
|
1437
|
+
If macOS displays its access-request dialog, choose Open System Settings. If the
|
|
1438
|
+
app is not listed, use the pane's Add (+) button and select the app running SIMY.
|
|
1439
|
+
Complete any Touch ID/password authentication directly on the Mac; never send
|
|
1440
|
+
that password to SIMY or a chat. `available: true` means the installed
|
|
1441
|
+
Claude application and accessibility permission are present; it does not establish
|
|
1442
|
+
that a particular conversation is idle or its window is available. No development
|
|
1443
|
+
SSH key, fixed hostname, compiler, debug port, or transcript edits are required.
|
|
1444
|
+
|
|
1445
|
+
For an already registered SSH host, add `--host SSH_ALIAS --session UUID` to setup
|
|
1446
|
+
and status commands, and `--host SSH_ALIAS` to archive/restore. Settings open on
|
|
1447
|
+
that remote Mac. Normal SSH, SIMY account/provider authorization and macOS
|
|
1448
|
+
permissions still apply. Linux and Windows conversation hosts report an explicit
|
|
1449
|
+
unsupported-platform error for Claude native control.
|
|
1450
|
+
|
|
1451
|
+
Keep Claude available in an unlocked desktop while the operation runs. SIMY
|
|
1452
|
+
opens the exact Code-tab conversation and uses Claude's own archive/restore
|
|
1453
|
+
control. Running conversations and automatic continuation must be stopped first.
|
|
1454
|
+
Before opening that conversation, SIMY checks Claude's visible windows for
|
|
1455
|
+
unsent input, generating responses and dialogs. It leaves the current conversation
|
|
1456
|
+
in place if any are present or the window/input state cannot be inspected. The
|
|
1457
|
+
same work-state checks run again before the native archive/restore action.
|
|
1458
|
+
If a window closes, another dialog covers the action, or the selected identity
|
|
1459
|
+
changes, the command fails instead of selecting another conversation. Claude UI
|
|
1460
|
+
changes or unsupported languages can also make native controls unavailable;
|
|
1461
|
+
Japanese controls were tested on Claude Desktop 3.1623.0.
|
|
1462
|
+
|
|
1463
|
+
The result is JSON. `ok: true` with `data.state: "verified"` means Claude's archive
|
|
1464
|
+
state was read back; `data.archived` is the resulting value. `changed: false`
|
|
1465
|
+
means the conversation already had that state. Setup/status exit with code 2
|
|
1466
|
+
when permission is not ready; failures exit with code 1. After a disconnect or
|
|
1467
|
+
unknown result, refresh the list before retrying. The optional `--request-id ID`
|
|
1468
|
+
correlates remote operations. Commands attach to the existing SIMY owner and do
|
|
1469
|
+
not start a second supervisor. Codex supports the same archive/restore commands
|
|
1470
|
+
with `--provider codex`.
|
|
1471
|
+
|
|
1387
1472
|
### Delivery entry routes
|
|
1388
1473
|
|
|
1389
1474
|
Crew owns `sessionLoopOptions` in the distributed loop kernel. Codex enrollment,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@awak-app/simy-cli",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.32",
|
|
4
4
|
"description": "Local SIMY executor for non-coding Local Tasks and Agentic Loop runs.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
],
|
|
13
13
|
"scripts": {
|
|
14
14
|
"start": "node ./src/index.js",
|
|
15
|
-
"test": "node --import ./test/isolate-simy-home.mjs --test --test-concurrency=
|
|
15
|
+
"test": "node --import ./test/isolate-simy-home.mjs --test --test-concurrency=1",
|
|
16
16
|
"test:e2e:console": "node ./scripts/console-e2e.js",
|
|
17
17
|
"test:e2e:work-activity": "node ./scripts/work-activity-e2e.js",
|
|
18
18
|
"test:e2e:sqm-complete-loop": "node ./scripts/sqm-complete-loop-e2e.js",
|
package/src/agent.js
CHANGED
|
@@ -106,6 +106,7 @@ import {
|
|
|
106
106
|
webApiErrorMessage,
|
|
107
107
|
webApiHeaders,
|
|
108
108
|
webApiUrl,
|
|
109
|
+
publicImageUrl,
|
|
109
110
|
} from "./web-api.js";
|
|
110
111
|
import {
|
|
111
112
|
defaultRepositoryScanRoot,
|
|
@@ -672,9 +673,13 @@ export async function startAgent({
|
|
|
672
673
|
if (!Array.isArray(payload.organizations)) throw new Error("Invalid organization list.");
|
|
673
674
|
if (session !== requestedSession) return;
|
|
674
675
|
organizationItems = payload.organizations.filter(org => typeof org.id === "string" && typeof org.name === "string")
|
|
675
|
-
.slice(0, 100).map(org =>
|
|
676
|
+
.slice(0, 100).map(org => {
|
|
677
|
+
const logoUrl = publicImageUrl(org.logoUrl ?? org.logo_url);
|
|
678
|
+
return { id: org.id, name: org.name.slice(0, 120),
|
|
679
|
+
...(logoUrl ? { logoUrl } : {}),
|
|
676
680
|
...(["ready", "sqm_required", "developer_required", "unavailable"].includes(org.desktopAccess) ? { desktopAccess: org.desktopAccess } : {}),
|
|
677
|
-
...(typeof org.slug === 'string' && org.slug && org.slug.length <= 160 && !/[\/\\?#\x00-\x1f]/.test(org.slug) ? { slug: org.slug } : {}) }
|
|
681
|
+
...(typeof org.slug === 'string' && org.slug && org.slug.length <= 160 && !/[\/\\?#\x00-\x1f]/.test(org.slug) ? { slug: org.slug } : {}) };
|
|
682
|
+
});
|
|
678
683
|
organizationState = "ready";
|
|
679
684
|
} catch {
|
|
680
685
|
if (session === requestedSession) organizationState = "unavailable";
|
|
@@ -3107,6 +3112,7 @@ export async function startAgent({
|
|
|
3107
3112
|
expected_evidence: [],
|
|
3108
3113
|
required_checks: [],
|
|
3109
3114
|
require_human_approval: input.require_human_approval === true,
|
|
3115
|
+
independent_review_required: input.independent_review_required === true,
|
|
3110
3116
|
must_not: [],
|
|
3111
3117
|
attachments: await referenceLocalAttachmentPaths(input.attachmentPaths || []),
|
|
3112
3118
|
};
|
package/src/cli-contract.js
CHANGED
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
} from "./durable-local-task-steps-contract.js";
|
|
15
15
|
import { buildExecutionCapabilityContract } from "./execution-capability-contract.js";
|
|
16
16
|
|
|
17
|
-
export const CLI_VERSION = "0.7.
|
|
17
|
+
export const CLI_VERSION = "0.7.32";
|
|
18
18
|
export const CLI_API_CONTRACT_VERSION = 10;
|
|
19
19
|
|
|
20
20
|
export function narrativeImageCapabilityMetadata() {
|
package/src/cli-observability.js
CHANGED
|
@@ -7,7 +7,7 @@ import { execFile } from 'node:child_process';
|
|
|
7
7
|
import { promisify } from 'node:util';
|
|
8
8
|
import { webApiHeaders, webApiUrl } from './web-api.js';
|
|
9
9
|
// Keep this leaf module package-safe: hooks load it before the full CLI contract.
|
|
10
|
-
const CLI_VERSION = '0.7.
|
|
10
|
+
const CLI_VERSION = '0.7.32';
|
|
11
11
|
|
|
12
12
|
const STORE = 'cli-observability-state.json';
|
|
13
13
|
const LEGACY_CONFIG = 'cli-observability.json';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "simy",
|
|
3
3
|
"version": "0.1.0",
|
|
4
|
-
"description": "SIMY quality and PR review
|
|
4
|
+
"description": "SIMY Auto Continue, quality checks and PR review through the original conversation's existing controls.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Specialist Doctors Inc.",
|
|
7
7
|
"url": "https://github.com/SpecialistDoctors-Inc"
|
|
@@ -16,15 +16,17 @@
|
|
|
16
16
|
"skills": "./skills/",
|
|
17
17
|
"interface": {
|
|
18
18
|
"displayName": "SIMY",
|
|
19
|
-
"shortDescription": "
|
|
20
|
-
"longDescription": "
|
|
19
|
+
"shortDescription": "Continue, check and review.",
|
|
20
|
+
"longDescription": "Ask SIMY to continue unfinished work in the original conversation through the running CLI app's existing Auto Continue controller, or request quality checks and PR reviews. Read the same real work state and next action as the app. Saved delegation is not execution proof. Stops, permission waits and opt-outs are preserved. Retired local delivery agents stay retired.",
|
|
21
21
|
"developerName": "Specialist Doctors Inc.",
|
|
22
22
|
"category": "Developer Tools",
|
|
23
23
|
"capabilities": [
|
|
24
|
+
"Auto Continue",
|
|
24
25
|
"Quality",
|
|
25
26
|
"Review"
|
|
26
27
|
],
|
|
27
28
|
"defaultPrompt": [
|
|
29
|
+
"Enable SIMY Auto Continue for this conversation and show its actual progress.",
|
|
28
30
|
"Run the SIMY SQM Loop for the current thread.",
|
|
29
31
|
"Review the current pull request with SIMY."
|
|
30
32
|
],
|
|
@@ -20,3 +20,10 @@ export function effectiveAcceptanceCriteria(managed) {
|
|
|
20
20
|
return eligible ? { ...criterion, check: { type: 'semantic' }, originalCheck: criterion.check } : criterion;
|
|
21
21
|
});
|
|
22
22
|
}
|
|
23
|
+
|
|
24
|
+
export function onlyManualAcceptancePending(managed) {
|
|
25
|
+
const verified = managed?.verified || {};
|
|
26
|
+
const pending = effectiveAcceptanceCriteria(managed).filter(criterion => criterion.check?.type === 'manual'
|
|
27
|
+
? verified[criterion.id]?.source !== 'user' : !Object.hasOwn(verified, criterion.id));
|
|
28
|
+
return pending.length > 0 && pending.every(criterion => criterion.check?.type === 'manual');
|
|
29
|
+
}
|