aacp-ts 1.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/README.md +122 -0
  2. package/Src/decoder.ts +131 -0
  3. package/Src/encoders/ruleBasedEncoder.ts +140 -0
  4. package/Src/encoders/workflows/contractEncoder.ts +68 -0
  5. package/Src/encoders/workflows/invoiceEncoder.ts +71 -0
  6. package/Src/encoders/workflows/itEncoder.ts +95 -0
  7. package/Src/encoders/workflows/payrollEncoder.ts +110 -0
  8. package/Src/index.ts +27 -0
  9. package/Src/schema.ts +107 -0
  10. package/Src/validator.ts +127 -0
  11. package/dist/decoder.d.ts +12 -0
  12. package/dist/decoder.d.ts.map +1 -0
  13. package/dist/decoder.js +124 -0
  14. package/dist/decoder.js.map +1 -0
  15. package/dist/encoders/ruleBasedEncoder.d.ts +12 -0
  16. package/dist/encoders/ruleBasedEncoder.d.ts.map +1 -0
  17. package/dist/encoders/ruleBasedEncoder.js +113 -0
  18. package/dist/encoders/ruleBasedEncoder.js.map +1 -0
  19. package/dist/encoders/workflows/contractEncoder.d.ts +13 -0
  20. package/dist/encoders/workflows/contractEncoder.d.ts.map +1 -0
  21. package/dist/encoders/workflows/contractEncoder.js +43 -0
  22. package/dist/encoders/workflows/contractEncoder.js.map +1 -0
  23. package/dist/encoders/workflows/invoiceEncoder.d.ts +13 -0
  24. package/dist/encoders/workflows/invoiceEncoder.d.ts.map +1 -0
  25. package/dist/encoders/workflows/invoiceEncoder.js +49 -0
  26. package/dist/encoders/workflows/invoiceEncoder.js.map +1 -0
  27. package/dist/encoders/workflows/itEncoder.d.ts +15 -0
  28. package/dist/encoders/workflows/itEncoder.d.ts.map +1 -0
  29. package/dist/encoders/workflows/itEncoder.js +69 -0
  30. package/dist/encoders/workflows/itEncoder.js.map +1 -0
  31. package/dist/encoders/workflows/payrollEncoder.d.ts +17 -0
  32. package/dist/encoders/workflows/payrollEncoder.d.ts.map +1 -0
  33. package/dist/encoders/workflows/payrollEncoder.js +76 -0
  34. package/dist/encoders/workflows/payrollEncoder.js.map +1 -0
  35. package/dist/index.d.ts +22 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +35 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/schema.d.ts +86 -0
  40. package/dist/schema.d.ts.map +1 -0
  41. package/dist/schema.js +25 -0
  42. package/dist/schema.js.map +1 -0
  43. package/dist/validator.d.ts +10 -0
  44. package/dist/validator.d.ts.map +1 -0
  45. package/dist/validator.js +112 -0
  46. package/dist/validator.js.map +1 -0
  47. package/package.json +47 -0
  48. package/tests/smoke.test.ts +162 -0
  49. package/tsconfig.json +29 -0
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ /**
3
+ * AACP v1.1 Validator
4
+ * Validates pipe-delimited AACP packets against the v1.1 schema.
5
+ * Pure logic. No LLM calls. Fast and free.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.AACPValidator = void 0;
9
+ const schema_1 = require("./schema");
10
+ class ValidationResultImpl {
11
+ constructor(valid, errors = [], warnings = []) {
12
+ this.valid = valid;
13
+ this.errors = errors;
14
+ this.warnings = warnings;
15
+ }
16
+ summary() {
17
+ const lines = [
18
+ "VALIDATION RESULT",
19
+ ` Status: ${this.valid ? "VALID" : "INVALID"}`,
20
+ ];
21
+ for (const e of this.errors)
22
+ lines.push(` ERROR: ${e}`);
23
+ for (const w of this.warnings)
24
+ lines.push(` WARN: ${w}`);
25
+ if (!this.errors.length && !this.warnings.length) {
26
+ lines.push(" No issues.");
27
+ }
28
+ return lines.join("\n");
29
+ }
30
+ }
31
+ class AACPValidator {
32
+ validate(packet) {
33
+ const errors = [];
34
+ const warnings = [];
35
+ if (!packet || !packet.trim()) {
36
+ return new ValidationResultImpl(false, ["Empty packet."]);
37
+ }
38
+ const fields = packet.trim().split("|");
39
+ if (fields.length < 3) {
40
+ return new ValidationResultImpl(false, [
41
+ `Packet has ${fields.length} fields. Minimum required: TASK|DOM|return:AGENT|aacp:VERSION`,
42
+ ]);
43
+ }
44
+ const task = fields[0].trim();
45
+ const dom = fields[1].trim();
46
+ // Named fields from position 2 onwards
47
+ const named = {};
48
+ for (const f of fields.slice(2)) {
49
+ const trimmed = f.trim();
50
+ if (!trimmed)
51
+ continue;
52
+ const colonIdx = trimmed.indexOf(":");
53
+ if (colonIdx === -1) {
54
+ warnings.push(`Field "${trimmed}" has no colon separator — expected key:value.`);
55
+ continue;
56
+ }
57
+ const key = trimmed.slice(0, colonIdx).toLowerCase();
58
+ const val = trimmed.slice(colonIdx + 1);
59
+ named[key] = val;
60
+ }
61
+ // Required: TASK
62
+ if (!task) {
63
+ errors.push(`Field 0 (TASK) is empty. Valid: ${[...schema_1.VALID_TASKS].sort().join(", ")}`);
64
+ }
65
+ else if (!schema_1.VALID_TASKS.has(task)) {
66
+ errors.push(`Unknown TASK "${task}". Valid: ${[...schema_1.VALID_TASKS].sort().join(", ")}`);
67
+ }
68
+ // Required: DOM
69
+ if (!dom) {
70
+ errors.push(`Field 1 (DOM) is empty. Valid: ${[...schema_1.VALID_DOMAINS].sort().join(", ")}`);
71
+ }
72
+ else if (!schema_1.VALID_DOMAINS.has(dom)) {
73
+ errors.push(`Unknown DOM "${dom}". Valid: ${[...schema_1.VALID_DOMAINS].sort().join(", ")}`);
74
+ }
75
+ // Required: return:
76
+ if (!named["return"]) {
77
+ errors.push("Missing required field: return: (receiving agent identifier)");
78
+ }
79
+ // Required: aacp:
80
+ if (!named["aacp"]) {
81
+ warnings.push(`Missing aacp: version field. Expected aacp:${schema_1.AACP_VERSION}`);
82
+ }
83
+ else if (named["aacp"] !== schema_1.AACP_VERSION) {
84
+ warnings.push(`AACP version "${named["aacp"]}" — current is ${schema_1.AACP_VERSION}`);
85
+ }
86
+ // Optional: priority
87
+ if (named["p"] && !schema_1.VALID_PRIORITIES.has(named["p"])) {
88
+ warnings.push(`Priority "${named["p"]}" non-standard. Expected 1, 2, or 3.`);
89
+ }
90
+ // Extended field validation
91
+ for (const key of Object.keys(named)) {
92
+ if (["return", "aacp", "p", "res", "period", "filter", "fields", "fmt"].includes(key)) {
93
+ continue;
94
+ }
95
+ if (!schema_1.EXTENDED_FIELDS.has(key)) {
96
+ warnings.push(`Unknown extended field "${key}". ` +
97
+ `May be a valid extension — ensure receiving agent supports it.`);
98
+ }
99
+ }
100
+ // Companion rules
101
+ if (named["sentiment"] && !named["tone"]) {
102
+ warnings.push("sentiment field present without tone. " +
103
+ "Add tone:empathetic|formal|terse for human-facing tasks.");
104
+ }
105
+ if (named["ltv"] && !named["ccy"]) {
106
+ warnings.push("ltv field present without ccy — add currency context.");
107
+ }
108
+ return new ValidationResultImpl(errors.length === 0, errors, warnings);
109
+ }
110
+ }
111
+ exports.AACPValidator = AACPValidator;
112
+ //# sourceMappingURL=validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../Src/validator.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "aacp-ts",
3
+ "version": "1.1.0",
4
+ "description": "Agent Action Compression Protocol \u2014 TypeScript SDK for multi-agent LLM coordination",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "import": "./dist/index.js",
10
+ "types": "./dist/index.d.ts"
11
+ }
12
+ },
13
+ "scripts": {
14
+ "build": "tsc",
15
+ "test": "npx ts-node --compiler-options '{\"module\":\"CommonJS\"}' tests/smoke.test.ts",
16
+ "dev": "npx tsx src/index.ts",
17
+ "prepublishOnly": "npm run build && npm test"
18
+ },
19
+ "keywords": [
20
+ "aacp",
21
+ "agents",
22
+ "multi-agent",
23
+ "llm",
24
+ "protocol",
25
+ "coordination",
26
+ "ai",
27
+ "typescript"
28
+ ],
29
+ "author": "Andrew Mackay <mackayandrewr@gmail.com>",
30
+ "license": "MIT",
31
+ "homepage": "https://aacp.dev",
32
+ "repository": {
33
+ "type": "git",
34
+ "url": "https://github.com/MackayAndrew/aacp-ts"
35
+ },
36
+ "bugs": {
37
+ "url": "https://github.com/MackayAndrew/aacp-ts/issues"
38
+ },
39
+ "devDependencies": {
40
+ "typescript": "^5.4.0",
41
+ "@types/node": "^20.0.0",
42
+ "ts-node": "^10.9.2"
43
+ },
44
+ "engines": {
45
+ "node": ">=18.0.0"
46
+ }
47
+ }
@@ -0,0 +1,162 @@
1
+ /**
2
+ * AACP TypeScript SDK — Smoke Tests
3
+ * Run: npx tsx tests/smoke.test.ts
4
+ * No test framework needed — pure assertions.
5
+ */
6
+
7
+ import {
8
+ PayrollEncoder, ITEncoder, InvoiceEncoder, ContractEncoder,
9
+ AACPValidator, AACPDecoder, AACP_VERSION,
10
+ } from "../src/index";
11
+
12
+ let passed = 0;
13
+ let failed = 0;
14
+
15
+ function assert(condition: boolean, label: string) {
16
+ if (condition) {
17
+ console.log(` ✓ ${label}`);
18
+ passed++;
19
+ } else {
20
+ console.error(` ✗ FAIL: ${label}`);
21
+ failed++;
22
+ }
23
+ }
24
+
25
+ function section(label: string) {
26
+ console.log(`\n${"=".repeat(50)}`);
27
+ console.log(` ${label}`);
28
+ console.log("=".repeat(50));
29
+ }
30
+
31
+ // ── Payroll encoder ────────────────────────────────────────
32
+ section("PayrollEncoder");
33
+ const payroll = new PayrollEncoder();
34
+
35
+ const p1 = payroll.fetchEmployees("2026-03");
36
+ console.log(` ${p1.packet}`);
37
+ assert(p1.packet.startsWith("FETCH|HR|"), "FETCH|HR packet");
38
+ assert(p1.packet.includes("res:emp_salary"), "res:emp_salary");
39
+ assert(p1.packet.includes("period:2026-03"), "period:2026-03");
40
+ assert(p1.packet.includes("filter:status=active"), "filter:status=active");
41
+ assert(p1.packet.includes(`aacp:${AACP_VERSION}`), "correct version");
42
+ assert(p1.apiCostUsd === 0.0, "zero cost");
43
+ assert(p1.encoderType === "rule_based", "rule_based encoder");
44
+
45
+ const p2 = payroll.fetchBudgets("2026-03");
46
+ console.log(` ${p2.packet}`);
47
+ assert(p2.packet.startsWith("FETCH|FIN|"), "FETCH|FIN packet");
48
+
49
+ const p3 = payroll.mergeAndCalculate("2026-03");
50
+ console.log(` ${p3.packet}`);
51
+ assert(p3.packet.startsWith("MERGE|HR|"), "MERGE|HR packet");
52
+ assert(p3.packet.includes("rules:payroll_v2"), "rules:payroll_v2");
53
+
54
+ const p4 = payroll.generateReport("2026-03", "2026-02");
55
+ console.log(` ${p4.packet}`);
56
+ assert(p4.packet.startsWith("REPORT|HR|"), "REPORT|HR packet");
57
+
58
+ const fullRun = payroll.fullRun("2026-03", "2026-02");
59
+ assert(fullRun.length === 6, "full run returns 6 packets");
60
+ assert(fullRun.every(p => p.apiCostUsd === 0.0), "all packets zero cost");
61
+
62
+ // ── IT encoder ────────────────────────────────────────────
63
+ section("ITEncoder");
64
+ const it = new ITEncoder();
65
+
66
+ const it1 = it.createAccount("j.smith", "Engineering");
67
+ console.log(` ${it1.packet}`);
68
+ assert(it1.packet.startsWith("BUILD|IT|"), "BUILD|IT packet");
69
+ assert(it1.packet.includes("usr=j.smith"), "username in filter");
70
+
71
+ const itRun = it.fullProvision("j.smith", "Engineering", ["M365", "Slack"]);
72
+ assert(itRun.length === 5, "IT full provision returns 5 packets");
73
+
74
+ // ── Invoice encoder ───────────────────────────────────────
75
+ section("InvoiceEncoder");
76
+ const inv = new InvoiceEncoder();
77
+
78
+ const inv1 = inv.processInvoice("Acme-Ltd", 4200, "GBP", "PO-441");
79
+ console.log(` ${inv1.packet}`);
80
+ assert(inv1.packet.startsWith("PROC|FIN|"), "PROC|FIN packet");
81
+ assert(inv1.packet.includes("amt:4200"), "amount present");
82
+ assert(inv1.packet.includes("ccy:GBP"), "currency present");
83
+ assert(inv1.packet.includes("match:PO-441"), "PO number present");
84
+
85
+ const invRun = inv.fullProcess("Acme-Ltd", 4200, "GBP", "PO-441");
86
+ assert(invRun.length === 3, "invoice full process returns 3 packets");
87
+
88
+ // ── Contract encoder ──────────────────────────────────────
89
+ section("ContractEncoder");
90
+ const contract = new ContractEncoder();
91
+
92
+ const c1 = contract.flagClause(
93
+ "NDA", "Acme-Ltd", "s7", "ip_rights_restriction", "high", "signature"
94
+ );
95
+ console.log(` ${c1.packet}`);
96
+ assert(c1.packet.startsWith("FLAG|LEGAL|"), "FLAG|LEGAL packet");
97
+ assert(c1.packet.includes("risk:high"), "risk level present");
98
+ assert(c1.packet.includes("block:signature"), "block action present");
99
+
100
+ // ── Validator ────────────────────────────────────────────
101
+ section("AACPValidator");
102
+ const v = new AACPValidator();
103
+
104
+ const goodPacket = "FETCH|HR|return:HR-Agent|p:1|aacp:1.1|res:emp_salary|period:2026-03";
105
+ const r1 = v.validate(goodPacket);
106
+ assert(r1.valid, "valid packet passes");
107
+ assert(r1.errors.length === 0, "no errors on valid packet");
108
+
109
+ const badPacket = "INVALID|NODOMAIN|return:agent|aacp:1.1";
110
+ const r2 = v.validate(badPacket);
111
+ assert(!r2.valid, "invalid TASK fails validation");
112
+ assert(r2.errors.length > 0, "errors returned on invalid packet");
113
+
114
+ const emptyPacket = "";
115
+ const r3 = v.validate(emptyPacket);
116
+ assert(!r3.valid, "empty packet fails validation");
117
+
118
+ // ── Decoder ──────────────────────────────────────────────
119
+ section("AACPDecoder");
120
+ const dec = new AACPDecoder();
121
+
122
+ const decoded = dec.decode(
123
+ "FETCH|HR|return:HR-Agent|p:1|aacp:1.1|res:emp_salary|period:2026-03|filter:status=active|fmt:json"
124
+ );
125
+ console.log(` ${decoded.english}`);
126
+ assert(decoded.isComplete, "decode returns complete result");
127
+ assert(decoded.english.length > 0, "decoded English is non-empty");
128
+ assert(decoded.parsed["task"] === "FETCH", "task parsed correctly");
129
+ assert(decoded.parsed["domain"] === "HR", "domain parsed correctly");
130
+ assert(decoded.parsed["res"] === "emp_salary", "res parsed correctly");
131
+ assert(decoded.caveat.length > 0, "caveat present");
132
+
133
+ // ── All packets validate ──────────────────────────────────
134
+ section("All generated packets validate");
135
+ const allPackets = [
136
+ ...payroll.fullRun("2026-03", "2026-02"),
137
+ ...it.fullProvision("j.smith", "Engineering", ["M365"]),
138
+ ...inv.fullProcess("Acme-Ltd", 4200, "GBP", "PO-441"),
139
+ ...contract.fullReview("NDA", "Acme-Ltd", "tpl_nda_v2"),
140
+ ];
141
+
142
+ let allValid = true;
143
+ for (const pkt of allPackets) {
144
+ const result = v.validate(pkt.packet);
145
+ if (!result.valid) {
146
+ console.error(` ✗ Invalid: ${pkt.packet}`);
147
+ console.error(` Errors: ${result.errors.join(", ")}`);
148
+ allValid = false;
149
+ }
150
+ }
151
+ assert(allValid, `all ${allPackets.length} generated packets validate`);
152
+
153
+ // ── Summary ───────────────────────────────────────────────
154
+ console.log(`\n${"=".repeat(50)}`);
155
+ console.log(` RESULTS: ${passed} passed, ${failed} failed`);
156
+ console.log("=".repeat(50));
157
+
158
+ if (failed > 0) {
159
+ process.exit(1);
160
+ } else {
161
+ console.log("\n TypeScript SDK v1.1 — all tests passed\n");
162
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2020",
4
+ "module": "CommonJS",
5
+ "moduleResolution": "node",
6
+ "outDir": "./dist",
7
+ "rootDir": "./src",
8
+ "declaration": true,
9
+ "declarationMap": true,
10
+ "sourceMap": true,
11
+ "strict": true,
12
+ "esModuleInterop": true,
13
+ "skipLibCheck": true,
14
+ "forceConsistentCasingInFileNames": true,
15
+ "resolveJsonModule": true
16
+ },
17
+ "include": [
18
+ "src/**/*"
19
+ ],
20
+ "exclude": [
21
+ "node_modules",
22
+ "dist",
23
+ "tests"
24
+ ],
25
+ "ts-node": {
26
+ "esm": false,
27
+ "experimentalSpecifierResolution": "node"
28
+ }
29
+ }