@passioncode-ai/fabric-agent-adapter 0.45.1 → 0.46.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/CHANGELOG.md +14 -0
- package/README.md +1 -1
- package/package.json +1 -1
- package/plugins/fabric-agent-adapter/.claude-plugin/plugin.json +1 -1
- package/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/SKILL.md +3 -3
- package/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/scripts/adapt_project.py +2 -2
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/SKILL.md +2 -2
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/interop.md +11 -0
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/protocol.md +4 -2
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-interop-rules.mjs +3 -0
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-interop.mjs +7 -2
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-protocols.mjs +3 -3
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_interop.py +3 -0
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_interop_rules.py +4 -0
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_protocols.py +3 -3
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/kit.json +83 -7
- package/plugins/fabric-agent-adapter/skills/creating-fabric-agents/SKILL.md +3 -3
- package/plugins/fabric-agent-adapter/skills/working-with-fabric/SKILL.md +1 -1
- package/plugins/fabric-agent-adapter/skills/working-with-fabric/scripts/fabric_session_env.py +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.46.0 (2026-10-23)
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
|
|
7
|
+
- **Pinned to contract `0a4ce77`** (FAA-102; `e742016` stays supported): DEC-0104, the agent network's call queue,
|
|
8
|
+
directory and load report. Every vendored vector is regenerated from the contract's own functions at the pin.
|
|
9
|
+
- **`job_caller_action` / `jobCallerAction` answer a job that `queue-full` ended `invalid`**, both twins: `queue-full`
|
|
10
|
+
is a refusal at a job's start and never ends a job. `QUEUE_FULL` names the code in the rule layer and both facades.
|
|
11
|
+
The job store refuses to end a job with it (`InteropError`), as the pinned job schema does.
|
|
12
|
+
- **The protocol register gains `agent-directory/1`, `fabric-load/0.1` and `service-load/1`**, both twins.
|
|
13
|
+
- `references/interop.md` says how a node's call queue answers and that the kit does not queue yet (FAA-103);
|
|
14
|
+
`references/protocol.md` names DEC-0098, DEC-0099, DEC-0101, DEC-0102 and DEC-0104 (DEC-0100 and DEC-0103 change no
|
|
15
|
+
service wire). Through Fabric's hub a caller sees `product-error` for a full queue until the hub relays `queue-full`.
|
|
16
|
+
|
|
3
17
|
## 0.45.1 (2026-10-23)
|
|
4
18
|
|
|
5
19
|
### Changed
|
package/README.md
CHANGED
|
@@ -274,7 +274,7 @@ Scaffolding is non-destructive by default. It writes only the paths declared in
|
|
|
274
274
|
The default pin for new bundles is [`fabric-contract.lock.json`](fabric-contract.lock.json):
|
|
275
275
|
|
|
276
276
|
- version: `0.1.0`
|
|
277
|
-
- commit: `
|
|
277
|
+
- commit: `0a4ce773c4b9e6bec40c6387eb3f988af7152c0e`
|
|
278
278
|
|
|
279
279
|
Every other mention of the default contract revision (this section, the skills' metadata, the
|
|
280
280
|
skill card, `adapt_project.py`) must equal it; `python3 test/validate.py` fails a tree
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@passioncode-ai/fabric-agent-adapter",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.46.0",
|
|
4
4
|
"description": "Create Fabric-compatible agents, run them as always-alive local services with dashboards (fabric-service/0.1), and adapt existing projects to the Fabric Agent Contract. This package is the installer CLI.",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"test": "python3 test/validate.py && python3 -m unittest discover -s test -q && node --test 'test/*.test.mjs'"
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"name": "fabric-agent-adapter",
|
|
4
4
|
"displayName": "Fabric Agent Adapter",
|
|
5
5
|
"description": "Create new Fabric-compatible agents, build them as always-alive local services with dashboards (fabric-service/0.1), and adapt existing projects to the Fabric Agent Contract through evidence-backed MCP, A2A, or local-runner provider bundles; and teach a coding agent to work in a project through Fabric (fabric-mcp, fabric_whoami, claim and release), with Claude Code session hooks.",
|
|
6
|
-
"version": "0.
|
|
6
|
+
"version": "0.46.0",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "PassionCode.ai",
|
|
9
9
|
"url": "https://passioncode.ai/"
|
|
@@ -5,9 +5,9 @@ license: AGPL-3.0-only OR LicenseRef-PassionCode-Commercial
|
|
|
5
5
|
compatibility: Requires filesystem access and Python 3.9+. Exact schema checks additionally need git, Node.js, pnpm, and the pinned fabric-agent-contract checkout (a public repository). Works without those tools in an explicitly degraded structural-check mode.
|
|
6
6
|
metadata:
|
|
7
7
|
author: PassionCode.ai
|
|
8
|
-
version: "0.
|
|
8
|
+
version: "0.46.0"
|
|
9
9
|
contract-version: "0.1.0"
|
|
10
|
-
contract-commit: "
|
|
10
|
+
contract-commit: "0a4ce773c4b9e6bec40c6387eb3f988af7152c0e"
|
|
11
11
|
---
|
|
12
12
|
|
|
13
13
|
# Adapting projects to Fabric
|
|
@@ -76,7 +76,7 @@ Use exactly:
|
|
|
76
76
|
|
|
77
77
|
- contract version `0.1.0`;
|
|
78
78
|
- repository `https://github.com/passioncode-ai/fabric-agent-contract`;
|
|
79
|
-
- commit `
|
|
79
|
+
- commit `0a4ce773c4b9e6bec40c6387eb3f988af7152c0e`.
|
|
80
80
|
|
|
81
81
|
This is the default for new bundles. When checking an issued legacy bundle, preserve its
|
|
82
82
|
explicit supported lock and use that exact clean checkout. Never silently upgrade or
|
package/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/scripts/adapt_project.py
CHANGED
|
@@ -22,10 +22,10 @@ import fabric_secrets as _secrets # noqa: E402 - the contract's credential dete
|
|
|
22
22
|
|
|
23
23
|
CONTRACT_VERSION = "0.1.0"
|
|
24
24
|
CONTRACT_REPOSITORY = "https://github.com/passioncode-ai/fabric-agent-contract"
|
|
25
|
-
CONTRACT_COMMIT = "
|
|
25
|
+
CONTRACT_COMMIT = "0a4ce773c4b9e6bec40c6387eb3f988af7152c0e"
|
|
26
26
|
# #region supported-contract-revisions — docs: README.md#contract-pin
|
|
27
27
|
# Only this declaration may name a legacy revision in live files.
|
|
28
|
-
SUPPORTED_CONTRACT_COMMITS = (CONTRACT_COMMIT, "bfa9a67aa3c6cb808c093e7d83cd59799f1ee7d0", "c55f2d5a11c9a0197e958e87212fca7ae1154769", "07042181bfae2a481aa0da1a5651f24c76669c48", "d8146cfb0a1c74fc6432284c4356bb0c864b37b5", "82e163665e156a08aa3b92e4711015582c06162c", "1636fa97262f4a26e2086572d540c2ee701e0010", "f00a7685e3861c27f7899c033fb850a145a1708f", "a046f57cf46ea9e3da57ff8ce6a3ed4d26d8774b", "fe55fc67cba1a9e34a736da7d148d4fe2a8fbfa0", "b291bf09e0a9f9fd3c16cf540832cd021203b7d1", "0cacd08b0e95b6abf131eae1206b60792138bc3c", "2eb91c00e852d9c31d804310d38fad91589fcbac", "8e49fbd5fbbf230e32c1969cd24ac3c22422f0a5", "a83bec6b47776af688402c18efec507143061f68", "52da526d7cc1e063d74c5b520dbc03d0ace15246", "78b2da018d2c4bd9ac1bde1dc3b7f1a110a175f5", "623bf61358c339cb10297807b3f024b5d9f1f327", "23f9fda4c05f8a3852246ee98d4f2adf74ed0875", "9091d3d6606b0c4b5591a38c3674356a01fd7f55", "df55c8c54a23251342a7ee57ba95642b7eb39e61", "2ce392291c6668598d12cd38327e24696b5ca15c")
|
|
28
|
+
SUPPORTED_CONTRACT_COMMITS = (CONTRACT_COMMIT, "e742016dc396aa31e5a13a893489e43f15786c69", "bfa9a67aa3c6cb808c093e7d83cd59799f1ee7d0", "c55f2d5a11c9a0197e958e87212fca7ae1154769", "07042181bfae2a481aa0da1a5651f24c76669c48", "d8146cfb0a1c74fc6432284c4356bb0c864b37b5", "82e163665e156a08aa3b92e4711015582c06162c", "1636fa97262f4a26e2086572d540c2ee701e0010", "f00a7685e3861c27f7899c033fb850a145a1708f", "a046f57cf46ea9e3da57ff8ce6a3ed4d26d8774b", "fe55fc67cba1a9e34a736da7d148d4fe2a8fbfa0", "b291bf09e0a9f9fd3c16cf540832cd021203b7d1", "0cacd08b0e95b6abf131eae1206b60792138bc3c", "2eb91c00e852d9c31d804310d38fad91589fcbac", "8e49fbd5fbbf230e32c1969cd24ac3c22422f0a5", "a83bec6b47776af688402c18efec507143061f68", "52da526d7cc1e063d74c5b520dbc03d0ace15246", "78b2da018d2c4bd9ac1bde1dc3b7f1a110a175f5", "623bf61358c339cb10297807b3f024b5d9f1f327", "23f9fda4c05f8a3852246ee98d4f2adf74ed0875", "9091d3d6606b0c4b5591a38c3674356a01fd7f55", "df55c8c54a23251342a7ee57ba95642b7eb39e61", "2ce392291c6668598d12cd38327e24696b5ca15c")
|
|
29
29
|
# #endregion supported-contract-revisions
|
|
30
30
|
INTEROP_KEY = "https://fabric.passioncode.ai/agent-contract/extensions/interop/0.1"
|
|
31
31
|
MCP_REVISION = "2026-07-28"
|
|
@@ -14,10 +14,10 @@ license: AGPL-3.0-only OR LicenseRef-PassionCode-Commercial
|
|
|
14
14
|
compatibility: Python 3.9+ or Node.js 20+ for the kits (Node.js 22+ for a Linux service's instance lock); the probe needs Python 3.9+. launchd steps are macOS-only; Linux services install a systemd user unit and Windows ones a per-user Scheduled Task with the kits' writers. Dashboard handoff optionally uses Fabric Dashboards MCP link/host_status/open; without it, report unresolved host capability. The contract checkout is optional.
|
|
15
15
|
metadata:
|
|
16
16
|
author: PassionCode.ai
|
|
17
|
-
version: "0.
|
|
17
|
+
version: "0.46.0"
|
|
18
18
|
contract-version: "0.1.0"
|
|
19
19
|
extension: "fabric-service/0.1"
|
|
20
|
-
extension-commit: "
|
|
20
|
+
extension-commit: "0a4ce773c4b9e6bec40c6387eb3f988af7152c0e"
|
|
21
21
|
---
|
|
22
22
|
|
|
23
23
|
# Building Fabric services
|
|
@@ -120,6 +120,17 @@ As a caller: send `request_meta(traceparent)` as your `_meta` (it names `fabric-
|
|
|
120
120
|
(`jobs.quotaExhausted(id, message, {retryable, resetsAt})`, `jobCallerAction`, `intentIdempotencyKey`). The guidance
|
|
121
121
|
for an agent's own design is in `creating-fabric-agents/references/resilience-and-autonomy.md`.
|
|
122
122
|
|
|
123
|
+
**A node's call queue (DEC-0104).** A provider that queues refuses a start past its queue with `queue-full`: an `isError`
|
|
124
|
+
result with one text item whose JSON is `{error: {code: "queue-full", message, data: {retryable, retryAfterSeconds}}}`,
|
|
125
|
+
never `structuredContent`; the caller starts again after `retryAfterSeconds` under the same key. Read that refusal
|
|
126
|
+
from the start's own `isError` result, before any answer reaches `job_caller_action` / `jobCallerAction`: those read a
|
|
127
|
+
job, and `queue-full` never ends one, so they answer a job it ended `invalid` (`QUEUE_FULL` names the code, and the
|
|
128
|
+
kit's job store refuses to end a job with it). The kit has no reader for the refusal yet (FAA-103). Through Fabric's hub
|
|
129
|
+
a caller today sees `product-error` instead, kept under the key for 24 hours, until the hub relays `queue-full`
|
|
130
|
+
(Fabric CO-376). The kit does not queue: it declares no load extension (`extensions/load/0.1`) and serves no
|
|
131
|
+
`fabric.job.list`, so its `unknown-job` and repeated keys keep the rules above. A node that will queue needs
|
|
132
|
+
`jobCallerKey`, the contract's `agent-network.json` vectors and the load report first (FAA-103).
|
|
133
|
+
|
|
123
134
|
## What the probe checks
|
|
124
135
|
|
|
125
136
|
`check_service.py` adds these rules; they read, and never call a capability.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# fabric-service/0.1: wire reference
|
|
2
2
|
|
|
3
|
-
Pinned to `fabric-agent-contract` commit `
|
|
3
|
+
Pinned to `fabric-agent-contract` commit `0a4ce773c4b9e6bec40c6387eb3f988af7152c0e`
|
|
4
4
|
(`docs/specification/service.md`, DEC-0015; the usage report DEC-0021; Windows and Linux supervision
|
|
5
5
|
DEC-0032 and DEC-0033; the operator channel DEC-0034 and DEC-0035; the embedded dashboard DEC-0036;
|
|
6
6
|
delegation and the operator session's lifetime DEC-0039; the meter's call window DEC-0041; session handoff DEC-0042;
|
|
@@ -9,7 +9,9 @@ DEC-0045; runner and model profiles DEC-0046; the estate record DEC-0055; one co
|
|
|
9
9
|
the Windows token-file reader DEC-0057; the hub key the estate certifies DEC-0060; signing credentials DEC-0063; the
|
|
10
10
|
estate record's 60 s skew DEC-0066; an app's own descriptor DEC-0069; the descriptor for listings DEC-0061; identifier equality
|
|
11
11
|
by normal form DEC-0076; the project board's directory page DEC-0077 and a replacement's transferred attempts DEC-0078; an operator's hold DEC-0079, a structured finding DEC-0080 and the owner's settlement DEC-0081; `fabric-connections/0.1` in the protocol register
|
|
12
|
-
DEC-0096; a schema pattern never uses a bare dot DEC-0097
|
|
12
|
+
DEC-0096; a schema pattern never uses a bare dot DEC-0097; the board as Fabric 0.3.9 serves it DEC-0098 and DEC-0102, a
|
|
13
|
+
`processor-hosted` peer DEC-0099, three device protocols in the register DEC-0101; a call queue's `queue-full` and
|
|
14
|
+
the `agent-directory`, `fabric-load` and `service-load` protocols DEC-0104). The contract's schemas are normative;
|
|
13
15
|
this page is the working summary. Extension key:
|
|
14
16
|
`https://fabric.passioncode.ai/agent-contract/extensions/service/0.1`.
|
|
15
17
|
|
|
@@ -77,6 +77,8 @@ export function checkUsage(usage, nulls = false) {
|
|
|
77
77
|
// fabric_interop.py. Every function here answers and never throws on malformed input.
|
|
78
78
|
|
|
79
79
|
export const QUOTA_EXHAUSTED = 'quota-exhausted';
|
|
80
|
+
/** DEC-0104: a refusal at a job's start; a job it ended is malformed, so a caller answers it `invalid`. */
|
|
81
|
+
export const QUEUE_FULL = 'queue-full';
|
|
80
82
|
export const OUTCOME_UNKNOWN = 'outcome-unknown';
|
|
81
83
|
export const LIMIT_REACHED = 'limit-reached';
|
|
82
84
|
export const INTEROP_NULL_USAGE = 'fabric-interop/0.2';
|
|
@@ -151,6 +153,7 @@ export function jobCallerAction(answer, now) {
|
|
|
151
153
|
const codeOk = (isString(code) && ERROR_CODE.test(code)) || Number.isInteger(code);
|
|
152
154
|
const shapeOk = isObject(error) && Object.keys(error).every((name) => name === 'code' || name === 'message' || name === 'data');
|
|
153
155
|
if (!shapeOk || !codeOk || !isString(message) || message.length === 0 || codePoints(message) > MAX_ERROR_MESSAGE) return { action: 'invalid' };
|
|
156
|
+
if (code === QUEUE_FULL) return { action: 'invalid' };
|
|
154
157
|
if (code === OUTCOME_UNKNOWN) return { action: 'reconcile' };
|
|
155
158
|
if (code === LIMIT_REACHED) return { action: 'person' };
|
|
156
159
|
if (code !== QUOTA_EXHAUSTED) return { action: 'failed' };
|
package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-interop.mjs
CHANGED
|
@@ -24,6 +24,7 @@ export {
|
|
|
24
24
|
childTraceparent,
|
|
25
25
|
traceIds,
|
|
26
26
|
QUOTA_EXHAUSTED,
|
|
27
|
+
QUEUE_FULL,
|
|
27
28
|
OUTCOME_UNKNOWN,
|
|
28
29
|
LIMIT_REACHED,
|
|
29
30
|
INTEROP_NULL_USAGE,
|
|
@@ -41,7 +42,7 @@ export {
|
|
|
41
42
|
pauseMessage,
|
|
42
43
|
repeatedKeyDecision,
|
|
43
44
|
} from './fabric-interop-rules.mjs';
|
|
44
|
-
import { PROTOCOL, EXTENSION_KEY, MCP_REVISION, TERMINAL, CONTRACT_VERSION, JOB_HANDLE_SCHEMA, InteropError, UnknownJob, parseTraceparent, childTraceparent, traceIds, QUOTA_EXHAUSTED, OUTCOME_UNKNOWN, LIMIT_REACHED, INTEROP_NULL_USAGE, PROTOCOLS_READ, utcTime, quotaDataOk, readJobPause, jobCallerAction, intentIdempotencyKey, readsNullUsage, requestMeta, usageFindings, usageToward, jobLimitRules, pauseMessage, repeatedKeyDecision, OUTCOMES, ENVELOPE_REQUIRED, JOB_ID, KEY, SECRET_WORDS } from './fabric-interop-rules.mjs'; // the rule layer (FAA-92)
|
|
45
|
+
import { PROTOCOL, EXTENSION_KEY, MCP_REVISION, TERMINAL, CONTRACT_VERSION, JOB_HANDLE_SCHEMA, InteropError, UnknownJob, parseTraceparent, childTraceparent, traceIds, QUOTA_EXHAUSTED, QUEUE_FULL, OUTCOME_UNKNOWN, LIMIT_REACHED, INTEROP_NULL_USAGE, PROTOCOLS_READ, utcTime, quotaDataOk, readJobPause, jobCallerAction, intentIdempotencyKey, readsNullUsage, requestMeta, usageFindings, usageToward, jobLimitRules, pauseMessage, repeatedKeyDecision, OUTCOMES, ENVELOPE_REQUIRED, JOB_ID, KEY, SECRET_WORDS } from './fabric-interop-rules.mjs'; // the rule layer (FAA-92)
|
|
45
46
|
|
|
46
47
|
// --- C3.1 capabilities as tools ----------------------------------------------------------
|
|
47
48
|
export function expectedAnnotations(effect, idempotency) {
|
|
@@ -256,7 +257,11 @@ export class JobStore {
|
|
|
256
257
|
return this.transition(jobId, 'completed', { result });
|
|
257
258
|
}
|
|
258
259
|
|
|
259
|
-
fail(jobId, code, message, data) {
|
|
260
|
+
fail(jobId, code, message, data) {
|
|
261
|
+
// DEC-0104: a refusal at a job's start, never a job's end (the schema refuses one).
|
|
262
|
+
if (code === QUEUE_FULL) throw new InteropError('queue-full refuses a start and never ends a job (DEC-0104)');
|
|
263
|
+
return this.transition(jobId, 'failed', { error: data === undefined || data === null ? { code, message } : { code, message, data } });
|
|
264
|
+
}
|
|
260
265
|
|
|
261
266
|
// A job a limit paused and its provider will resume: working, the pause grammar, pollIntervalMs reaching the reset.
|
|
262
267
|
pause(jobId, { resetsAt, text } = {}) {
|
package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-protocols.mjs
CHANGED
|
@@ -7,13 +7,13 @@ import { credentialName, secretArgument, secretUrl, secretValue } from './fabric
|
|
|
7
7
|
|
|
8
8
|
/** Each contract protocol's published revisions, oldest first (the contract's `PROTOCOL_REVISIONS`); a test holds it equal to the contract's. */
|
|
9
9
|
export const PROTOCOL_REVISIONS = new Map(Object.entries({
|
|
10
|
-
'access-log': ['1'], approval: ['1'], 'activity-summary': ['1'], 'coding-agents': ['1'], 'enroll-token': ['1'], entitlement: ['1'], 'entitlement-key-set': ['1'], 'estate-record': ['1'], 'execution-packet': ['1'],
|
|
11
|
-
'fabric-activity': ['0.1'], 'fabric-connections': ['0.1'], 'fabric-dashboard': ['0.1'], 'fabric-delegation': ['0.1'], 'fabric-device': ['0.1'],
|
|
10
|
+
'access-log': ['1'], approval: ['1'], 'activity-summary': ['1'], 'agent-directory': ['1'], 'coding-agents': ['1'], 'enroll-token': ['1'], entitlement: ['1'], 'entitlement-key-set': ['1'], 'estate-record': ['1'], 'execution-packet': ['1'],
|
|
11
|
+
'fabric-activity': ['0.1'], 'fabric-connections': ['0.1'], 'fabric-load': ['0.1'], 'fabric-dashboard': ['0.1'], 'fabric-delegation': ['0.1'], 'fabric-device': ['0.1'],
|
|
12
12
|
'fabric-interop': ['0.1', '0.2'], 'fabric-local-channel': ['0.1'], 'fabric-local-runner': ['0.1'], 'fabric-operator-channel': ['0.1'],
|
|
13
13
|
'fabric-package': ['1'], 'fabric-project-comms': ['0.1'], 'fabric-proposal': ['1'], 'fabric-provider': ['0.1'], 'fabric-relay': ['0.1'],
|
|
14
14
|
'fabric-secret-envelope': ['1'], 'fabric-service': ['0.1'], 'fabric-settings-backup': ['1'], heartbeat: ['1'], 'learning-note': ['1'],
|
|
15
15
|
memory: ['0.1'], 'node-summary': ['1'], 'pairing-message': ['1'], pipeline: ['0.1'], 'repair-request': ['1'], 'repair-result': ['1'],
|
|
16
|
-
'revocation-delta': ['1'], 'session-handoff': ['1'],
|
|
16
|
+
'revocation-delta': ['1'], 'session-handoff': ['1'], 'service-load': ['1'],
|
|
17
17
|
'share-registration': ['1'], 'share-registration-receipt': ['1'], 'support-quality-daily': ['1'], 'window-lease': ['1'],
|
|
18
18
|
}));
|
|
19
19
|
|
package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_interop.py
CHANGED
|
@@ -54,6 +54,7 @@ from fabric_interop_rules import ( # noqa: E402,F401 - the rule layer (FAA-92)
|
|
|
54
54
|
trace_ids,
|
|
55
55
|
_usage,
|
|
56
56
|
QUOTA_EXHAUSTED,
|
|
57
|
+
QUEUE_FULL,
|
|
57
58
|
OUTCOME_UNKNOWN,
|
|
58
59
|
LIMIT_REACHED,
|
|
59
60
|
INTEROP_NULL_USAGE,
|
|
@@ -392,6 +393,8 @@ class JobStore:
|
|
|
392
393
|
return self._transition(job_id, "completed", result=envelope)
|
|
393
394
|
|
|
394
395
|
def fail(self, job_id: str, code: Any, message: str, data: Any = None) -> Dict[str, Any]:
|
|
396
|
+
if code == QUEUE_FULL: # DEC-0104: a refusal at a job's start, never a job's end (the schema refuses one)
|
|
397
|
+
raise InteropError("queue-full refuses a start and never ends a job (DEC-0104)")
|
|
395
398
|
error: Dict[str, Any] = {"code": code, "message": message}
|
|
396
399
|
if data is not None:
|
|
397
400
|
error["data"] = data
|
package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_interop_rules.py
CHANGED
|
@@ -121,6 +121,8 @@ def _usage(usage: Any, nulls: bool = False) -> Dict[str, Any]:
|
|
|
121
121
|
# here answers and never raises on malformed input.
|
|
122
122
|
|
|
123
123
|
QUOTA_EXHAUSTED = "quota-exhausted"
|
|
124
|
+
#: DEC-0104: a refusal at a job's start; a job it ended is malformed, so a caller answers it `invalid`.
|
|
125
|
+
QUEUE_FULL = "queue-full"
|
|
124
126
|
OUTCOME_UNKNOWN = "outcome-unknown"
|
|
125
127
|
LIMIT_REACHED = "limit-reached"
|
|
126
128
|
INTEROP_NULL_USAGE = "fabric-interop/0.2"
|
|
@@ -225,6 +227,8 @@ def job_caller_action(answer: Any, now: Any = _ABSENT) -> Dict[str, Any]:
|
|
|
225
227
|
shape_ok = isinstance(error, dict) and all(name in ("code", "message", "data") for name in error)
|
|
226
228
|
if not shape_ok or not code_ok or not isinstance(message, str) or not message or _code_points(message) > _MAX_ERROR_MESSAGE:
|
|
227
229
|
return {"action": "invalid"}
|
|
230
|
+
if code == QUEUE_FULL:
|
|
231
|
+
return {"action": "invalid"}
|
|
228
232
|
if code == OUTCOME_UNKNOWN:
|
|
229
233
|
return {"action": "reconcile"}
|
|
230
234
|
if code == LIMIT_REACHED:
|
package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_protocols.py
CHANGED
|
@@ -13,14 +13,14 @@ if str(_Path(__file__).resolve().parent) not in _sys.path: # the kit loads from
|
|
|
13
13
|
#: Each contract protocol's published revisions, oldest first (the contract's `PROTOCOL_REVISIONS`, DEC-0067); a test
|
|
14
14
|
#: holds it equal to the contract's register at the pin.
|
|
15
15
|
PROTOCOL_REVISIONS: Dict[str, Tuple[str, ...]] = {
|
|
16
|
-
"access-log": ("1",), "approval": ("1",), "activity-summary": ("1",), "coding-agents": ("1",), "enroll-token": ("1",), "entitlement": ("1",),
|
|
16
|
+
"access-log": ("1",), "approval": ("1",), "activity-summary": ("1",), "agent-directory": ("1",), "coding-agents": ("1",), "enroll-token": ("1",), "entitlement": ("1",),
|
|
17
17
|
"entitlement-key-set": ("1",), "estate-record": ("1",), "execution-packet": ("1",),
|
|
18
|
-
"fabric-activity": ("0.1",), "fabric-connections": ("0.1",), "fabric-dashboard": ("0.1",), "fabric-delegation": ("0.1",), "fabric-device": ("0.1",),
|
|
18
|
+
"fabric-activity": ("0.1",), "fabric-connections": ("0.1",), "fabric-load": ("0.1",), "fabric-dashboard": ("0.1",), "fabric-delegation": ("0.1",), "fabric-device": ("0.1",),
|
|
19
19
|
"fabric-interop": ("0.1", "0.2"), "fabric-local-channel": ("0.1",), "fabric-local-runner": ("0.1",),
|
|
20
20
|
"fabric-operator-channel": ("0.1",), "fabric-package": ("1",), "fabric-project-comms": ("0.1",), "fabric-proposal": ("1",),
|
|
21
21
|
"fabric-provider": ("0.1",), "fabric-relay": ("0.1",), "fabric-secret-envelope": ("1",), "fabric-service": ("0.1",),
|
|
22
22
|
"fabric-settings-backup": ("1",), "heartbeat": ("1",), "learning-note": ("1",), "memory": ("0.1",), "node-summary": ("1",), "pairing-message": ("1",),
|
|
23
|
-
"pipeline": ("0.1",), "repair-request": ("1",), "repair-result": ("1",), "revocation-delta": ("1",), "session-handoff": ("1",), "share-registration": ("1",),
|
|
23
|
+
"pipeline": ("0.1",), "repair-request": ("1",), "repair-result": ("1",), "revocation-delta": ("1",), "session-handoff": ("1",), "service-load": ("1",), "share-registration": ("1",),
|
|
24
24
|
"share-registration-receipt": ("1",), "support-quality-daily": ("1",), "window-lease": ("1",),
|
|
25
25
|
}
|
|
26
26
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fabric-service-kit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.46.0",
|
|
4
4
|
"about": "The service kit's modules in dependency order: a module imports only modules listed before it. Written by fabric_kit.py build; edit the order and layers by hand, never the digests.",
|
|
5
5
|
"python": [
|
|
6
6
|
{
|
|
@@ -150,7 +150,7 @@
|
|
|
150
150
|
"imports": [
|
|
151
151
|
"fabric_secrets"
|
|
152
152
|
],
|
|
153
|
-
"sha256": "
|
|
153
|
+
"sha256": "420e83dedeccfc93306870b2776908336c81cb349abb188d4cd7be9c8cef9802"
|
|
154
154
|
},
|
|
155
155
|
{
|
|
156
156
|
"module": "fabric_connections",
|
|
@@ -301,7 +301,7 @@
|
|
|
301
301
|
"fabric_delegation",
|
|
302
302
|
"fabric_time"
|
|
303
303
|
],
|
|
304
|
-
"sha256": "
|
|
304
|
+
"sha256": "b5f0ecb1791b4c50c5ac151f987f692ed7001bc74841a8a161125ec775145e09"
|
|
305
305
|
},
|
|
306
306
|
{
|
|
307
307
|
"module": "fabric_interop",
|
|
@@ -313,7 +313,7 @@
|
|
|
313
313
|
"fabric_interop_rules",
|
|
314
314
|
"fabric_service"
|
|
315
315
|
],
|
|
316
|
-
"sha256": "
|
|
316
|
+
"sha256": "f92fa111328fe3811438f733d8f0eb5295e6941c774123a78e26318bdcb35fc3"
|
|
317
317
|
},
|
|
318
318
|
{
|
|
319
319
|
"module": "fabric_hub",
|
|
@@ -544,7 +544,7 @@
|
|
|
544
544
|
"imports": [
|
|
545
545
|
"fabric-secrets"
|
|
546
546
|
],
|
|
547
|
-
"sha256": "
|
|
547
|
+
"sha256": "91a98de17b29e1d100b2e8b965f3310f57b24b65ad6b4596e7a90b26b9069d4d"
|
|
548
548
|
},
|
|
549
549
|
{
|
|
550
550
|
"module": "fabric-connections",
|
|
@@ -694,7 +694,7 @@
|
|
|
694
694
|
"fabric-delegation",
|
|
695
695
|
"fabric-jsvalue"
|
|
696
696
|
],
|
|
697
|
-
"sha256": "
|
|
697
|
+
"sha256": "57a8081307956e8c381119b361fa5232a7bf791815be8e3541eb5492820e2ea5"
|
|
698
698
|
},
|
|
699
699
|
{
|
|
700
700
|
"module": "fabric-interop",
|
|
@@ -705,7 +705,7 @@
|
|
|
705
705
|
"fabric-interop-rules",
|
|
706
706
|
"fabric-service"
|
|
707
707
|
],
|
|
708
|
-
"sha256": "
|
|
708
|
+
"sha256": "581983ec3e197e5c2340ad25e8468320c69a2459c90097c7fcf2699766b4fb26"
|
|
709
709
|
},
|
|
710
710
|
{
|
|
711
711
|
"module": "fabric-hub",
|
|
@@ -2267,6 +2267,82 @@
|
|
|
2267
2267
|
"fabric-openrouter.mjs": "f8f0168691f968b7cd85f36aa98e2167e88cc44f1104ff514fd0c7699b339253",
|
|
2268
2268
|
"fabric-package.schema.json": "2ba799f576fad0f608029223c4ccccd122152f1c5dbfa8ce8b31cd63ac92ad44",
|
|
2269
2269
|
"share-registration.schema.json": "34b3997eeaf936ebc861342a23045634a7c18c19f01d7ed4198310d81989f5b0"
|
|
2270
|
+
},
|
|
2271
|
+
"0.46.0": {
|
|
2272
|
+
"fabric_jsvalue.py": "0cd4eab0a5d6ae35d097f7c59a08dc29173cb61c561c49e5291a8dad15d36779",
|
|
2273
|
+
"fabric_time.py": "588f383da4ac6a243ea95b6ffc3a0aa99ca94245732dc4937734f190b7af4ae9",
|
|
2274
|
+
"fabric_identifiers.py": "0fd814d521ac3aa39907458265870753046a73f48af3d8581ab864b93b211607",
|
|
2275
|
+
"fabric_secrets.py": "68a0b5e9e90c468ec9ac67b2f0fd1848e08813d6ec1ec14a2a47337eb1a98911",
|
|
2276
|
+
"fabric_crypto.py": "9c34aee20dbe4d6742e4fdbaab68ceb934bbe7dbd3a904c0010824ace16cdeaa",
|
|
2277
|
+
"fabric_base.py": "f62bcc2ed9912660fa875d27a09f60867260cc4925f79873501fd9620be59611",
|
|
2278
|
+
"fabric_platform.py": "a9350dff55ef0fb3a23cdb4d0320a15868b15a8deb10d2eb74d72c58740c284b",
|
|
2279
|
+
"fabric_paths.py": "6c92af34292baddf7e10d3134d0a5b0bb23387741812a9f79c409cf1628bad23",
|
|
2280
|
+
"fabric_estate.py": "50cc12166a00b680ba5b2e458200912d7bcfbef70bd73ec4edf57c7fcfa9b687",
|
|
2281
|
+
"fabric_delegation.py": "4eb5004188fdc6f5c0fd21fb0f9f1f538899a0383bcde0365dea080ef8347182",
|
|
2282
|
+
"fabric_share.py": "78506fe1a60829c525dbf6266a0aa0749a2164290ed94da8249a20b4e9be5605",
|
|
2283
|
+
"fabric_ceremonies.py": "a59e83cf4adb2669a9b98008e3d3a0cba991a35cbff97bc604fc82fe81cfd49f",
|
|
2284
|
+
"fabric_package_schema.py": "e623f0408d38e3343ed66222fb812907c6c52e1a286eb1c1176ab2e64640c9ad",
|
|
2285
|
+
"fabric_package.py": "ff533f1b3f92b4ea0f532fcec50b68c610d47549930eef8ad5247692a64dfb3c",
|
|
2286
|
+
"fabric_protocols.py": "420e83dedeccfc93306870b2776908336c81cb349abb188d4cd7be9c8cef9802",
|
|
2287
|
+
"fabric_connections.py": "77d3ccf863c70e9209d21ef45c46a6db9c06237019bc20d54f8d3946873f3f11",
|
|
2288
|
+
"fabric_lock.py": "ba2399d2137c7a7791b7133b9db9cca36693f4eb7e30955b25a75ade814e95ba",
|
|
2289
|
+
"fabric_usage.py": "ce685cb9fdfd62ea75fff8b1b2be12a2ba758da783e4bfb4dcebe47bcbeb832b",
|
|
2290
|
+
"fabric_backups.py": "02dc5eb66ec956723d3ddba07b6dd15f6a9726d901f4d60edfd02eee57880ceb",
|
|
2291
|
+
"fabric_descriptor.py": "64acadc3bbf6e1f95ff275344a7a1fa8b53809e725cd3305a0832a968e7403e9",
|
|
2292
|
+
"fabric_auth.py": "55794587750f6c9f40935b74295d83d7096cb4b26a0b36ac292334cd87d8f853",
|
|
2293
|
+
"fabric_events.py": "0086886c2c29dbd5c9d152be9d375c5bdf4a29f89b8095baff8490c2bcd64e47",
|
|
2294
|
+
"fabric_logs.py": "86dc55bfafa2a57264722e2403510a249b95de0e4a722b2e4bc3948e3bd93da9",
|
|
2295
|
+
"fabric_supervisors.py": "a2dbf15aa1c4eb9de42996b413103fa4814afd2e4e66d1ab7315f30e06ab6841",
|
|
2296
|
+
"fabric_service.py": "d411433ce6ff3e81189b10b2c1a8462335a97cd99574ab0ee7d1c28cf48e1694",
|
|
2297
|
+
"fabric_profiles.py": "26e21ec29c016000f8ca8053b7b489184854a73be1b7fdc0a18d12990203db9b",
|
|
2298
|
+
"fabric_interop_rules.py": "b5f0ecb1791b4c50c5ac151f987f692ed7001bc74841a8a161125ec775145e09",
|
|
2299
|
+
"fabric_interop.py": "f92fa111328fe3811438f733d8f0eb5295e6941c774123a78e26318bdcb35fc3",
|
|
2300
|
+
"fabric_hub.py": "b9ac852e601b1d54cf61351677a628afc69faeed7d1fc74ebe541c1cf38e0c2a",
|
|
2301
|
+
"fabric_board_shapes.py": "0a0e8d3d40e33dfd8c457aedb85330b2ff25f8c49a33eb6cbd5a5cc8a5007f7e",
|
|
2302
|
+
"fabric_board_link.py": "b5bff994cb615c6a4bb0d88d020e3a59504166180e1fa1aea3be93224f2aeccb",
|
|
2303
|
+
"fabric_board_session.py": "2271834c36c23f6bfa50395cd147e6af99f294ef09325fd15f0759ca8e18d941",
|
|
2304
|
+
"fabric_board_fixture.py": "69761ce205ec640762ec9b591c6903e5a87f844e8d423b041681924027e39d1e",
|
|
2305
|
+
"fabric_board.py": "0f075894b3e352194fcaf3fc7d08dee4e9f1c215e859769ed85fa5010e4a1599",
|
|
2306
|
+
"fabric_http.py": "5d7f72af3a73fdbe8c1f487ecf60cef23a7c46289eba542b03aff4706b8218d4",
|
|
2307
|
+
"fabric_openrouter.py": "2017d898c17001d7275f58267de653be7ecf6acd17ad8d9b24ecb7a43e5617d4",
|
|
2308
|
+
"fabric-jsvalue.mjs": "dfbdb8c41584972c9389750a41719374a1cfc5652ed438dd1623025190b0106e",
|
|
2309
|
+
"fabric-time.mjs": "3ff932069038a720df1c68c6492976906737b2e67e5c12d9c81c418597f661de",
|
|
2310
|
+
"fabric-identifiers.mjs": "a18c2a501a4aa170bfd3d99e571ad6b7662649b4d3b9d2a540c002ea42811bbf",
|
|
2311
|
+
"fabric-secrets.mjs": "6ad8ab18ac899ecc2384e8ec6a3fb689b92be3b9a5ce3a59b92a37d52da5d766",
|
|
2312
|
+
"fabric-crypto.mjs": "038e03689701e3c9721a1e7f8e0a4d02a52d6a5d1661b0dc84035edc3ebbfcf6",
|
|
2313
|
+
"fabric-base.mjs": "7804b2df7715dbbf9702a9b61b6b8cef2110f9a52b04cabd8fb0a66458d87512",
|
|
2314
|
+
"fabric-platform.mjs": "a8119d95ebba4d589a9e401f5d6fc8dda62d59d44e4c1ff811d97fac3771ac0c",
|
|
2315
|
+
"fabric-paths.mjs": "2201b4ed7126f260931b63e8386377b4317d8dcad419d109bf22c683e44b7f29",
|
|
2316
|
+
"fabric-estate.mjs": "912b1ceab57ed20f946986bf14ae2faf41fb8ea539e818164496874f3749ef65",
|
|
2317
|
+
"fabric-delegation.mjs": "85a7e00e606244e7e02f9cbecc3e421bfcb9c1e12cd2a91daadf8a9c2403104d",
|
|
2318
|
+
"fabric-share.mjs": "d40a7405d7bd4c3213ed691330b7549afe8e023db0753b582e249714e672010d",
|
|
2319
|
+
"fabric-ceremonies.mjs": "117d4374c9e95c930a38de7adbd4323774798f4fe6ec6f24afcd6f2c7298ca44",
|
|
2320
|
+
"fabric-package-schema.mjs": "cd28092375db0fc21ffab1f0bb7794f7f8979ee08c64d3b9faf4b3845357caa6",
|
|
2321
|
+
"fabric-package.mjs": "49b757eefcc50e4c91585d5a5694bf3c83d0b03d112c1837f1c9f01466797ab5",
|
|
2322
|
+
"fabric-protocols.mjs": "91a98de17b29e1d100b2e8b965f3310f57b24b65ad6b4596e7a90b26b9069d4d",
|
|
2323
|
+
"fabric-connections.mjs": "303432e547ce563e90ca9ffcd827f5612f51d3582929834e1add0fdaf6485dcc",
|
|
2324
|
+
"fabric-lock.mjs": "ac219ab0a326d5c43c7c4c255e0c3843d4794de795a60e3af661e7d5350ea052",
|
|
2325
|
+
"fabric-usage.mjs": "e413569620bbc8221bc59e24b27e22d1483825ed18457801ed58d54a57de8114",
|
|
2326
|
+
"fabric-backups.mjs": "849acdc6eba0fff648c8158e61f6b68cccd7bedf0880f7d5ec03a6a20f1e7005",
|
|
2327
|
+
"fabric-descriptor.mjs": "82ab706b9f2322544bb565c78e2077a5503556614161a2a3083d2200bc9e6d69",
|
|
2328
|
+
"fabric-auth.mjs": "3ea6796470fcd829bc72a772fb7e4c37532a09d1e37ff41592dcf1a1a3074ca2",
|
|
2329
|
+
"fabric-events.mjs": "c463d6ffcae24229a5c608d8fcea4268d2ccc5024b19fa10e5a452284068fa71",
|
|
2330
|
+
"fabric-logs.mjs": "58467e5719c16e099d05bbedec47a95712506ab03c33f3cd4be1252e8498a946",
|
|
2331
|
+
"fabric-supervisors.mjs": "9d61c1a17538a5e2453e33e5ae347337336748041bc054478a96dd51f3d4fc51",
|
|
2332
|
+
"fabric-service.mjs": "bc67550e52aa6aa9c6d2ed6cbae52418a3e836623e17164166699f953d8aafa8",
|
|
2333
|
+
"fabric-profiles.mjs": "314376cf2deb87f235fb18b11d3b532e211f585b9af0a9302b5f4cc39971b532",
|
|
2334
|
+
"fabric-interop-rules.mjs": "57a8081307956e8c381119b361fa5232a7bf791815be8e3541eb5492820e2ea5",
|
|
2335
|
+
"fabric-interop.mjs": "581983ec3e197e5c2340ad25e8468320c69a2459c90097c7fcf2699766b4fb26",
|
|
2336
|
+
"fabric-hub.mjs": "c005115a864cfd67daa4862097bb14acfe5a60bf653897e5bf8a570dd80f1070",
|
|
2337
|
+
"fabric-board-shapes.mjs": "c1db7b7bd0d58d82bb6d8dfbc3cd1547a256a333052d367e82ff1b3edf2804d7",
|
|
2338
|
+
"fabric-board-link.mjs": "4cd6d4e21713a38c8e56f7d59db3148638b8c27c08e774d96a0f6283c6049e0a",
|
|
2339
|
+
"fabric-board-session.mjs": "e9eefb5d34dc66f6d6b528a9c9e85960fd884e6ea5e179c26cbfe3c054ccf7bc",
|
|
2340
|
+
"fabric-board-fixture.mjs": "83c4b7e33ee47b68385faf2569d38d5c8a0c5cb0f8656090f41e1b0eed2f436e",
|
|
2341
|
+
"fabric-board.mjs": "9e7bfe4d412521982224ef12bebfc2ff255eeeaf8d96cf40234ac18de68e7a59",
|
|
2342
|
+
"fabric-http.mjs": "f886bcb49c4353d039387ac9568738dda26697a94dd07fc6a6204500f0bc27bf",
|
|
2343
|
+
"fabric-openrouter.mjs": "f8f0168691f968b7cd85f36aa98e2167e88cc44f1104ff514fd0c7699b339253",
|
|
2344
|
+
"fabric-package.schema.json": "2ba799f576fad0f608029223c4ccccd122152f1c5dbfa8ce8b31cd63ac92ad44",
|
|
2345
|
+
"share-registration.schema.json": "34b3997eeaf936ebc861342a23045634a7c18c19f01d7ed4198310d81989f5b0"
|
|
2270
2346
|
}
|
|
2271
2347
|
},
|
|
2272
2348
|
"data": {
|
|
@@ -5,9 +5,9 @@ license: AGPL-3.0-only OR LicenseRef-PassionCode-Commercial
|
|
|
5
5
|
compatibility: Requires filesystem access and Python 3.9+. Exact schema checks additionally need git, Node.js, pnpm, and the pinned fabric-agent-contract checkout (a public repository). Works without those tools in an explicitly degraded structural-check mode. Ships in one plugin with adapting-projects-to-fabric, whose scripts it reuses.
|
|
6
6
|
metadata:
|
|
7
7
|
author: PassionCode.ai
|
|
8
|
-
version: "0.
|
|
8
|
+
version: "0.46.0"
|
|
9
9
|
contract-version: "0.1.0"
|
|
10
|
-
contract-commit: "
|
|
10
|
+
contract-commit: "0a4ce773c4b9e6bec40c6387eb3f988af7152c0e"
|
|
11
11
|
---
|
|
12
12
|
|
|
13
13
|
# Creating Fabric-compatible agents
|
|
@@ -136,7 +136,7 @@ python3 <plugin-dir>/skills/adapting-projects-to-fabric/scripts/adapt_project.py
|
|
|
136
136
|
The effect class is declared, never defaulted: ask the author what the agent does outside itself when the request
|
|
137
137
|
does not say. Cost presets are only for a run whose cost varies; their amounts come from the author or measured runs.
|
|
138
138
|
|
|
139
|
-
Pin exactly contract `0.1.0` at commit `
|
|
139
|
+
Pin exactly contract `0.1.0` at commit `0a4ce773c4b9e6bec40c6387eb3f988af7152c0e` and
|
|
140
140
|
read the pinned guide before implementing protocol details. If this skill is installed
|
|
141
141
|
without its sibling, the scaffolder is absent: create the bundle by hand from the pinned
|
|
142
142
|
contract's `docs/guides/connecting-compatible-agents.md` and mark the structural check
|