@harness-control/protocol 0.1.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 (49) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +16 -0
  3. package/dist/bin/conformance.d.ts +3 -0
  4. package/dist/bin/conformance.js +11 -0
  5. package/dist/bin/generate-json-schema.d.ts +3 -0
  6. package/dist/bin/generate-json-schema.js +12 -0
  7. package/dist/conformance.d.ts +42 -0
  8. package/dist/conformance.js +217 -0
  9. package/dist/index.d.ts +6761 -0
  10. package/dist/index.js +1931 -0
  11. package/dist/json-schema.d.ts +19 -0
  12. package/dist/json-schema.js +128 -0
  13. package/dist/pairing.d.ts +59 -0
  14. package/dist/pairing.js +42 -0
  15. package/dist/session-reducer.d.ts +36 -0
  16. package/dist/session-reducer.js +96 -0
  17. package/fixtures/conformance/invalid/arbitrary-event-family.json +13 -0
  18. package/fixtures/conformance/invalid/local-action-lease-binding-mismatch.json +51 -0
  19. package/fixtures/conformance/invalid/local-action-missing-turn-id.json +21 -0
  20. package/fixtures/conformance/invalid/local-action-patch-missing-base-hash.json +53 -0
  21. package/fixtures/conformance/invalid/local-action-shell-missing-approval.json +56 -0
  22. package/fixtures/conformance/invalid/mcp-stdio-attachment.json +27 -0
  23. package/fixtures/conformance/invalid/session-snapshot-unsafe-omission.json +26 -0
  24. package/fixtures/conformance/invalid/terminal-turn-missing-final-output.json +16 -0
  25. package/fixtures/conformance/invalid/unknown-payload-field.json +14 -0
  26. package/fixtures/conformance/invalid/unknown-top-level-field.json +14 -0
  27. package/fixtures/conformance/valid/command-ack.json +11 -0
  28. package/fixtures/conformance/valid/extension-event.json +18 -0
  29. package/fixtures/conformance/valid/host-hello.json +22 -0
  30. package/fixtures/conformance/valid/host-replay-unavailable.json +15 -0
  31. package/fixtures/conformance/valid/local-action-dev-server-start.json +67 -0
  32. package/fixtures/conformance/valid/local-action-dev-server-stop.json +54 -0
  33. package/fixtures/conformance/valid/local-action-error.json +40 -0
  34. package/fixtures/conformance/valid/local-action-filesystem-list.json +54 -0
  35. package/fixtures/conformance/valid/local-action-filesystem-patch.json +55 -0
  36. package/fixtures/conformance/valid/local-action-filesystem-read.json +53 -0
  37. package/fixtures/conformance/valid/local-action-filesystem-write.json +55 -0
  38. package/fixtures/conformance/valid/local-action-git-diff.json +53 -0
  39. package/fixtures/conformance/valid/local-action-git-status.json +53 -0
  40. package/fixtures/conformance/valid/local-action-response.json +49 -0
  41. package/fixtures/conformance/valid/local-action-shell-exec.json +63 -0
  42. package/fixtures/conformance/valid/provider-event.json +18 -0
  43. package/fixtures/conformance/valid/session-snapshot-request.json +9 -0
  44. package/fixtures/conformance/valid/session-snapshot.json +28 -0
  45. package/fixtures/conformance/valid/session-start-with-leases.json +80 -0
  46. package/fixtures/conformance/valid/session-start-with-runner-stdio-profile.json +27 -0
  47. package/fixtures/conformance/valid/turn-completed.json +30 -0
  48. package/package.json +61 -0
  49. package/schemas/hcp-message.schema.json +18667 -0
@@ -0,0 +1,14 @@
1
+ {
2
+ "id": "message-unknown-top-level-field",
3
+ "type": "host.hello",
4
+ "version": "hcp.v0",
5
+ "sent_at": "2026-01-01T00:00:00.000Z",
6
+ "payload": {
7
+ "runner_id": "runner-local",
8
+ "host_id": "host-local",
9
+ "runner_version": "0.0.0",
10
+ "supported_protocol_versions": ["hcp.v0"],
11
+ "capabilities": []
12
+ },
13
+ "unexpected": true
14
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "id": "message-command-ack",
3
+ "type": "hcp.command.ack",
4
+ "version": "hcp.v0",
5
+ "sent_at": "2026-01-01T00:00:00.000Z",
6
+ "payload": {
7
+ "command_id": "command-1",
8
+ "accepted_at": "2026-01-01T00:00:01.000Z",
9
+ "duplicate": false
10
+ }
11
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "id": "message-extension-event",
3
+ "type": "harness.event",
4
+ "version": "hcp.v0",
5
+ "sent_at": "2026-01-01T00:00:00.000Z",
6
+ "payload": {
7
+ "session_id": "session-1",
8
+ "sequence": 3,
9
+ "event_type": "extension.timeline.marker",
10
+ "created_at": "2026-01-01T00:00:03.000Z",
11
+ "data": {
12
+ "summary": "Timeline marker",
13
+ "fields": {
14
+ "marker_id": "marker-1"
15
+ }
16
+ }
17
+ }
18
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "id": "message-host-hello",
3
+ "type": "host.hello",
4
+ "version": "hcp.v0",
5
+ "sent_at": "2026-01-01T00:00:00.000Z",
6
+ "payload": {
7
+ "runner_id": "runner-local",
8
+ "host_id": "host-local",
9
+ "runner_version": "0.0.0",
10
+ "supported_protocol_versions": ["hcp.v0"],
11
+ "capabilities": ["providers", "mcp_streamable_http"],
12
+ "retained_events": {
13
+ "sessions": [
14
+ {
15
+ "session_id": "session-1",
16
+ "first_event_sequence": 1,
17
+ "last_event_sequence": 12
18
+ }
19
+ ]
20
+ }
21
+ }
22
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "id": "message-host-replay-unavailable",
3
+ "type": "host.replay.unavailable",
4
+ "version": "hcp.v0",
5
+ "sent_at": "2026-01-01T00:00:01.000Z",
6
+ "payload": {
7
+ "session_id": "session-1",
8
+ "requested_after_sequence": 12,
9
+ "reason": "cursor_outside_retention",
10
+ "retained_range": {
11
+ "first_event_sequence": 20,
12
+ "last_event_sequence": 40
13
+ }
14
+ }
15
+ }
@@ -0,0 +1,67 @@
1
+ {
2
+ "id": "message-local-dev-server-start",
3
+ "type": "local.action.request",
4
+ "version": "hcp.v0",
5
+ "sent_at": "2026-01-01T00:00:00.000Z",
6
+ "payload": {
7
+ "request_id": "local-action-dev-start-1",
8
+ "action": "local.dev_server.start",
9
+ "issued_at": "2026-01-01T00:00:01.000Z",
10
+ "attribution": {
11
+ "session_id": "session-1",
12
+ "turn_id": "turn-1",
13
+ "workspace_id": "workspace-1",
14
+ "provider_instance_id": "provider-1",
15
+ "run_id": "run-1"
16
+ },
17
+ "lease": {
18
+ "lease_id": "local-lease-dev-server",
19
+ "capability_id": "dev_server",
20
+ "scope": "workspace",
21
+ "run_id": "run-1",
22
+ "hcp_session_id": "session-1",
23
+ "execution_host_id": "host-1",
24
+ "provider_instance_id": "provider-1",
25
+ "workspace_id": "workspace-1",
26
+ "expires_at": "2026-01-01T01:00:00.000Z"
27
+ },
28
+ "sandbox": {
29
+ "mode": "workspace_write",
30
+ "workspace_root": "/tmp/workspace",
31
+ "cwd": "/tmp/workspace",
32
+ "requires_workspace_containment": true
33
+ },
34
+ "approval": {
35
+ "status": "approved",
36
+ "request_id": "approval-2",
37
+ "action_hash": "sha256:dev-server",
38
+ "decision": "accept_for_session",
39
+ "actor_id": "user-1",
40
+ "approved_at": "2026-01-01T00:00:02.000Z"
41
+ },
42
+ "output_limits": {},
43
+ "cancellation": {
44
+ "cancellable": true,
45
+ "timeout_ms": 60000,
46
+ "token": "cancel-dev-start-1"
47
+ },
48
+ "audit": {
49
+ "started_event_type": "local_capability.action.started",
50
+ "completed_event_type": "local_capability.action.completed",
51
+ "failed_event_type": "local_capability.action.failed"
52
+ },
53
+ "input": {
54
+ "server_id": "web",
55
+ "executable": "npm",
56
+ "argv": ["run", "dev"],
57
+ "cwd": "/tmp/workspace",
58
+ "host": "127.0.0.1",
59
+ "port": 3000,
60
+ "use_shell": false,
61
+ "readiness": {
62
+ "url": "http://127.0.0.1:3000",
63
+ "timeout_ms": 30000
64
+ }
65
+ }
66
+ }
67
+ }
@@ -0,0 +1,54 @@
1
+ {
2
+ "id": "message-local-dev-server-stop",
3
+ "type": "local.action.request",
4
+ "version": "hcp.v0",
5
+ "sent_at": "2026-01-01T00:00:00.000Z",
6
+ "payload": {
7
+ "request_id": "local-action-dev-stop-1",
8
+ "action": "local.dev_server.stop",
9
+ "issued_at": "2026-01-01T00:00:01.000Z",
10
+ "attribution": {
11
+ "session_id": "session-1",
12
+ "turn_id": "turn-1",
13
+ "workspace_id": "workspace-1",
14
+ "provider_instance_id": "provider-1",
15
+ "run_id": "run-1"
16
+ },
17
+ "lease": {
18
+ "lease_id": "local-lease-dev-server",
19
+ "capability_id": "dev_server",
20
+ "scope": "workspace",
21
+ "run_id": "run-1",
22
+ "hcp_session_id": "session-1",
23
+ "execution_host_id": "host-1",
24
+ "provider_instance_id": "provider-1",
25
+ "workspace_id": "workspace-1",
26
+ "expires_at": "2026-01-01T01:00:00.000Z"
27
+ },
28
+ "sandbox": {
29
+ "mode": "workspace_write",
30
+ "workspace_root": "/tmp/workspace",
31
+ "cwd": "/tmp/workspace",
32
+ "requires_workspace_containment": true
33
+ },
34
+ "approval": {
35
+ "status": "not_required"
36
+ },
37
+ "output_limits": {},
38
+ "cancellation": {
39
+ "cancellable": true,
40
+ "timeout_ms": 30000,
41
+ "token": "cancel-dev-stop-1"
42
+ },
43
+ "audit": {
44
+ "started_event_type": "local_capability.action.started",
45
+ "completed_event_type": "local_capability.action.completed",
46
+ "failed_event_type": "local_capability.action.failed"
47
+ },
48
+ "input": {
49
+ "server_id": "web",
50
+ "signal": "SIGTERM",
51
+ "timeout_ms": 30000
52
+ }
53
+ }
54
+ }
@@ -0,0 +1,40 @@
1
+ {
2
+ "id": "message-local-action-error",
3
+ "type": "local.action.error",
4
+ "version": "hcp.v0",
5
+ "sent_at": "2026-01-01T00:00:00.000Z",
6
+ "payload": {
7
+ "request_id": "local-action-patch-1",
8
+ "action": "local.filesystem.patch",
9
+ "status": "failed",
10
+ "failed_at": "2026-01-01T00:00:03.000Z",
11
+ "attribution": {
12
+ "session_id": "session-1",
13
+ "turn_id": "turn-1",
14
+ "workspace_id": "workspace-1",
15
+ "provider_instance_id": "provider-1",
16
+ "run_id": "run-1"
17
+ },
18
+ "lease": {
19
+ "lease_id": "local-lease-patch",
20
+ "capability_id": "filesystem",
21
+ "scope": "workspace_write",
22
+ "run_id": "run-1",
23
+ "hcp_session_id": "session-1",
24
+ "execution_host_id": "host-1",
25
+ "provider_instance_id": "provider-1",
26
+ "workspace_id": "workspace-1"
27
+ },
28
+ "error": {
29
+ "code": "local_capability_expected_hash_mismatch",
30
+ "message": "The expected base hash did not match.",
31
+ "retryable": false
32
+ },
33
+ "audit_events": {
34
+ "failed": {
35
+ "event_type": "local_capability.action.failed",
36
+ "sequence": 12
37
+ }
38
+ }
39
+ }
40
+ }
@@ -0,0 +1,54 @@
1
+ {
2
+ "id": "message-local-filesystem-list",
3
+ "type": "local.action.request",
4
+ "version": "hcp.v0",
5
+ "sent_at": "2026-01-01T00:00:00.000Z",
6
+ "payload": {
7
+ "request_id": "local-action-list-1",
8
+ "action": "local.filesystem.list",
9
+ "issued_at": "2026-01-01T00:00:01.000Z",
10
+ "attribution": {
11
+ "session_id": "session-1",
12
+ "turn_id": "turn-1",
13
+ "workspace_id": "workspace-1",
14
+ "provider_instance_id": "provider-1",
15
+ "run_id": "run-1"
16
+ },
17
+ "lease": {
18
+ "lease_id": "local-lease-list",
19
+ "capability_id": "filesystem",
20
+ "scope": "workspace_read",
21
+ "run_id": "run-1",
22
+ "hcp_session_id": "session-1",
23
+ "execution_host_id": "host-1",
24
+ "provider_instance_id": "provider-1",
25
+ "workspace_id": "workspace-1",
26
+ "expires_at": "2026-01-01T01:00:00.000Z"
27
+ },
28
+ "sandbox": {
29
+ "mode": "workspace_write",
30
+ "workspace_root": "/tmp/workspace",
31
+ "cwd": "/tmp/workspace",
32
+ "requires_workspace_containment": true
33
+ },
34
+ "approval": {
35
+ "status": "not_required"
36
+ },
37
+ "output_limits": {
38
+ "entries": 200
39
+ },
40
+ "cancellation": {
41
+ "cancellable": false
42
+ },
43
+ "audit": {
44
+ "started_event_type": "local_capability.action.started",
45
+ "completed_event_type": "local_capability.action.completed",
46
+ "failed_event_type": "local_capability.action.failed"
47
+ },
48
+ "input": {
49
+ "path": ".",
50
+ "recursive": false,
51
+ "include_hidden": false
52
+ }
53
+ }
54
+ }
@@ -0,0 +1,55 @@
1
+ {
2
+ "id": "message-local-filesystem-patch",
3
+ "type": "local.action.request",
4
+ "version": "hcp.v0",
5
+ "sent_at": "2026-01-01T00:00:00.000Z",
6
+ "payload": {
7
+ "request_id": "local-action-patch-1",
8
+ "action": "local.filesystem.patch",
9
+ "issued_at": "2026-01-01T00:00:01.000Z",
10
+ "attribution": {
11
+ "session_id": "session-1",
12
+ "turn_id": "turn-1",
13
+ "workspace_id": "workspace-1",
14
+ "provider_instance_id": "provider-1",
15
+ "run_id": "run-1"
16
+ },
17
+ "lease": {
18
+ "lease_id": "local-lease-patch",
19
+ "capability_id": "filesystem",
20
+ "scope": "workspace_write",
21
+ "run_id": "run-1",
22
+ "hcp_session_id": "session-1",
23
+ "execution_host_id": "host-1",
24
+ "provider_instance_id": "provider-1",
25
+ "workspace_id": "workspace-1",
26
+ "expires_at": "2026-01-01T01:00:00.000Z"
27
+ },
28
+ "sandbox": {
29
+ "mode": "workspace_write",
30
+ "workspace_root": "/tmp/workspace",
31
+ "cwd": "/tmp/workspace",
32
+ "requires_workspace_containment": true
33
+ },
34
+ "approval": {
35
+ "status": "not_required"
36
+ },
37
+ "output_limits": {},
38
+ "cancellation": {
39
+ "cancellable": false
40
+ },
41
+ "audit": {
42
+ "started_event_type": "local_capability.action.started",
43
+ "completed_event_type": "local_capability.action.completed",
44
+ "failed_event_type": "local_capability.action.failed"
45
+ },
46
+ "input": {
47
+ "path": "README.md",
48
+ "expected_base_hash": "sha256:old",
49
+ "patch": {
50
+ "format": "unified_diff",
51
+ "content": "--- a/README.md\n+++ b/README.md\n@@\n-old\n+new\n"
52
+ }
53
+ }
54
+ }
55
+ }
@@ -0,0 +1,53 @@
1
+ {
2
+ "id": "message-local-filesystem-read",
3
+ "type": "local.action.request",
4
+ "version": "hcp.v0",
5
+ "sent_at": "2026-01-01T00:00:00.000Z",
6
+ "payload": {
7
+ "request_id": "local-action-read-1",
8
+ "action": "local.filesystem.read",
9
+ "issued_at": "2026-01-01T00:00:01.000Z",
10
+ "attribution": {
11
+ "session_id": "session-1",
12
+ "turn_id": "turn-1",
13
+ "workspace_id": "workspace-1",
14
+ "provider_instance_id": "provider-1",
15
+ "run_id": "run-1"
16
+ },
17
+ "lease": {
18
+ "lease_id": "local-lease-read",
19
+ "capability_id": "filesystem",
20
+ "scope": "workspace_read",
21
+ "run_id": "run-1",
22
+ "hcp_session_id": "session-1",
23
+ "execution_host_id": "host-1",
24
+ "provider_instance_id": "provider-1",
25
+ "workspace_id": "workspace-1",
26
+ "expires_at": "2026-01-01T01:00:00.000Z"
27
+ },
28
+ "sandbox": {
29
+ "mode": "workspace_write",
30
+ "workspace_root": "/tmp/workspace",
31
+ "cwd": "/tmp/workspace",
32
+ "requires_workspace_containment": true
33
+ },
34
+ "approval": {
35
+ "status": "not_required"
36
+ },
37
+ "output_limits": {
38
+ "content_bytes": 65536
39
+ },
40
+ "cancellation": {
41
+ "cancellable": false
42
+ },
43
+ "audit": {
44
+ "started_event_type": "local_capability.action.started",
45
+ "completed_event_type": "local_capability.action.completed",
46
+ "failed_event_type": "local_capability.action.failed"
47
+ },
48
+ "input": {
49
+ "path": "README.md",
50
+ "encoding": "utf8"
51
+ }
52
+ }
53
+ }
@@ -0,0 +1,55 @@
1
+ {
2
+ "id": "message-local-filesystem-write",
3
+ "type": "local.action.request",
4
+ "version": "hcp.v0",
5
+ "sent_at": "2026-01-01T00:00:00.000Z",
6
+ "payload": {
7
+ "request_id": "local-action-write-1",
8
+ "action": "local.filesystem.write",
9
+ "issued_at": "2026-01-01T00:00:01.000Z",
10
+ "attribution": {
11
+ "session_id": "session-1",
12
+ "turn_id": "turn-1",
13
+ "workspace_id": "workspace-1",
14
+ "provider_instance_id": "provider-1",
15
+ "run_id": "run-1"
16
+ },
17
+ "lease": {
18
+ "lease_id": "local-lease-write",
19
+ "capability_id": "filesystem",
20
+ "scope": "workspace_write",
21
+ "run_id": "run-1",
22
+ "hcp_session_id": "session-1",
23
+ "execution_host_id": "host-1",
24
+ "provider_instance_id": "provider-1",
25
+ "workspace_id": "workspace-1",
26
+ "expires_at": "2026-01-01T01:00:00.000Z"
27
+ },
28
+ "sandbox": {
29
+ "mode": "workspace_write",
30
+ "workspace_root": "/tmp/workspace",
31
+ "cwd": "/tmp/workspace",
32
+ "requires_workspace_containment": true
33
+ },
34
+ "approval": {
35
+ "status": "not_required"
36
+ },
37
+ "output_limits": {},
38
+ "cancellation": {
39
+ "cancellable": false
40
+ },
41
+ "audit": {
42
+ "started_event_type": "local_capability.action.started",
43
+ "completed_event_type": "local_capability.action.completed",
44
+ "failed_event_type": "local_capability.action.failed"
45
+ },
46
+ "input": {
47
+ "path": "README.md",
48
+ "content": "updated",
49
+ "encoding": "utf8",
50
+ "mode": "overwrite",
51
+ "create_parents": false,
52
+ "expected_base_hash": "sha256:old"
53
+ }
54
+ }
55
+ }
@@ -0,0 +1,53 @@
1
+ {
2
+ "id": "message-local-git-diff",
3
+ "type": "local.action.request",
4
+ "version": "hcp.v0",
5
+ "sent_at": "2026-01-01T00:00:00.000Z",
6
+ "payload": {
7
+ "request_id": "local-action-git-diff-1",
8
+ "action": "local.git.diff",
9
+ "issued_at": "2026-01-01T00:00:01.000Z",
10
+ "attribution": {
11
+ "session_id": "session-1",
12
+ "turn_id": "turn-1",
13
+ "workspace_id": "workspace-1",
14
+ "provider_instance_id": "provider-1",
15
+ "run_id": "run-1"
16
+ },
17
+ "lease": {
18
+ "lease_id": "local-lease-git-diff",
19
+ "capability_id": "git",
20
+ "scope": "workspace_read",
21
+ "run_id": "run-1",
22
+ "hcp_session_id": "session-1",
23
+ "execution_host_id": "host-1",
24
+ "provider_instance_id": "provider-1",
25
+ "workspace_id": "workspace-1",
26
+ "expires_at": "2026-01-01T01:00:00.000Z"
27
+ },
28
+ "sandbox": {
29
+ "mode": "workspace_write",
30
+ "workspace_root": "/tmp/workspace",
31
+ "cwd": "/tmp/workspace",
32
+ "requires_workspace_containment": true
33
+ },
34
+ "approval": {
35
+ "status": "not_required"
36
+ },
37
+ "output_limits": {
38
+ "diff_bytes": 65536
39
+ },
40
+ "cancellation": {
41
+ "cancellable": false
42
+ },
43
+ "audit": {
44
+ "started_event_type": "local_capability.action.started",
45
+ "completed_event_type": "local_capability.action.completed",
46
+ "failed_event_type": "local_capability.action.failed"
47
+ },
48
+ "input": {
49
+ "paths": ["README.md"],
50
+ "staged": false
51
+ }
52
+ }
53
+ }
@@ -0,0 +1,53 @@
1
+ {
2
+ "id": "message-local-git-status",
3
+ "type": "local.action.request",
4
+ "version": "hcp.v0",
5
+ "sent_at": "2026-01-01T00:00:00.000Z",
6
+ "payload": {
7
+ "request_id": "local-action-git-status-1",
8
+ "action": "local.git.status",
9
+ "issued_at": "2026-01-01T00:00:01.000Z",
10
+ "attribution": {
11
+ "session_id": "session-1",
12
+ "turn_id": "turn-1",
13
+ "workspace_id": "workspace-1",
14
+ "provider_instance_id": "provider-1",
15
+ "run_id": "run-1"
16
+ },
17
+ "lease": {
18
+ "lease_id": "local-lease-git-status",
19
+ "capability_id": "git",
20
+ "scope": "workspace_read",
21
+ "run_id": "run-1",
22
+ "hcp_session_id": "session-1",
23
+ "execution_host_id": "host-1",
24
+ "provider_instance_id": "provider-1",
25
+ "workspace_id": "workspace-1",
26
+ "expires_at": "2026-01-01T01:00:00.000Z"
27
+ },
28
+ "sandbox": {
29
+ "mode": "workspace_write",
30
+ "workspace_root": "/tmp/workspace",
31
+ "cwd": "/tmp/workspace",
32
+ "requires_workspace_containment": true
33
+ },
34
+ "approval": {
35
+ "status": "not_required"
36
+ },
37
+ "output_limits": {
38
+ "status_bytes": 65536
39
+ },
40
+ "cancellation": {
41
+ "cancellable": false
42
+ },
43
+ "audit": {
44
+ "started_event_type": "local_capability.action.started",
45
+ "completed_event_type": "local_capability.action.completed",
46
+ "failed_event_type": "local_capability.action.failed"
47
+ },
48
+ "input": {
49
+ "porcelain_version": "v1",
50
+ "include_branch": true
51
+ }
52
+ }
53
+ }
@@ -0,0 +1,49 @@
1
+ {
2
+ "id": "message-local-action-response",
3
+ "type": "local.action.response",
4
+ "version": "hcp.v0",
5
+ "sent_at": "2026-01-01T00:00:00.000Z",
6
+ "payload": {
7
+ "request_id": "local-action-shell-1",
8
+ "action": "local.shell.exec",
9
+ "status": "completed",
10
+ "completed_at": "2026-01-01T00:00:03.000Z",
11
+ "attribution": {
12
+ "session_id": "session-1",
13
+ "turn_id": "turn-1",
14
+ "workspace_id": "workspace-1",
15
+ "provider_instance_id": "provider-1",
16
+ "run_id": "run-1"
17
+ },
18
+ "lease": {
19
+ "lease_id": "local-lease-shell",
20
+ "capability_id": "shell",
21
+ "scope": "workspace",
22
+ "run_id": "run-1",
23
+ "hcp_session_id": "session-1",
24
+ "execution_host_id": "host-1",
25
+ "provider_instance_id": "provider-1",
26
+ "workspace_id": "workspace-1"
27
+ },
28
+ "output": {
29
+ "executable": "npm",
30
+ "argv": ["test"],
31
+ "cwd": "/tmp/workspace",
32
+ "exit_code": 0,
33
+ "signal": null,
34
+ "stdout": "ok\n",
35
+ "stderr": "",
36
+ "timed_out": false
37
+ },
38
+ "audit_events": {
39
+ "started": {
40
+ "event_type": "local_capability.action.started",
41
+ "sequence": 10
42
+ },
43
+ "completed": {
44
+ "event_type": "local_capability.action.completed",
45
+ "sequence": 11
46
+ }
47
+ }
48
+ }
49
+ }