@open-agent-toolkit/cli 0.1.43 → 0.1.46

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 (94) hide show
  1. package/assets/agents/oat-reviewer.md +2 -2
  2. package/assets/config/dispatch-matrix-recommendation.json +23 -0
  3. package/assets/docs/cli-utilities/config-and-local-state.md +7 -0
  4. package/assets/docs/cli-utilities/configuration.md +104 -25
  5. package/assets/docs/cli-utilities/workflow-gates.md +79 -16
  6. package/assets/docs/contributing/code.md +10 -4
  7. package/assets/docs/contributing/hooks-and-safety.md +23 -0
  8. package/assets/docs/provider-sync/config.md +5 -1
  9. package/assets/docs/provider-sync/manifest-and-drift.md +6 -1
  10. package/assets/docs/provider-sync/providers.md +6 -3
  11. package/assets/docs/provider-sync/scope-and-surface.md +2 -1
  12. package/assets/docs/reference/oat-directory-structure.md +2 -2
  13. package/assets/docs/workflows/projects/dispatch-ceiling.md +110 -27
  14. package/assets/docs/workflows/projects/implementation-execution.md +20 -13
  15. package/assets/public-package-versions.json +4 -4
  16. package/assets/skills/oat-project-implement/SKILL.md +155 -58
  17. package/assets/skills/oat-project-plan/SKILL.md +22 -3
  18. package/assets/skills/oat-project-quick-start/SKILL.md +54 -23
  19. package/assets/templates/state.md +5 -0
  20. package/dist/commands/config/index.d.ts +6 -0
  21. package/dist/commands/config/index.d.ts.map +1 -1
  22. package/dist/commands/config/index.js +429 -20
  23. package/dist/commands/doctor/index.d.ts +6 -1
  24. package/dist/commands/doctor/index.d.ts.map +1 -1
  25. package/dist/commands/doctor/index.js +209 -19
  26. package/dist/commands/gate/index.d.ts +39 -2
  27. package/dist/commands/gate/index.d.ts.map +1 -1
  28. package/dist/commands/gate/index.js +343 -30
  29. package/dist/commands/internal/cursor-current-target.d.ts +37 -0
  30. package/dist/commands/internal/cursor-current-target.d.ts.map +1 -0
  31. package/dist/commands/internal/cursor-current-target.js +228 -0
  32. package/dist/commands/internal/index.d.ts.map +1 -1
  33. package/dist/commands/internal/index.js +2 -0
  34. package/dist/commands/project/dispatch-ceiling/index.d.ts.map +1 -1
  35. package/dist/commands/project/dispatch-ceiling/index.js +487 -17
  36. package/dist/commands/providers/codex/index.d.ts +4 -0
  37. package/dist/commands/providers/codex/index.d.ts.map +1 -0
  38. package/dist/commands/providers/codex/index.js +7 -0
  39. package/dist/commands/providers/codex/materialize.d.ts +5 -0
  40. package/dist/commands/providers/codex/materialize.d.ts.map +1 -0
  41. package/dist/commands/providers/codex/materialize.js +152 -0
  42. package/dist/commands/providers/index.d.ts +2 -2
  43. package/dist/commands/providers/index.d.ts.map +1 -1
  44. package/dist/commands/providers/index.js +4 -2
  45. package/dist/commands/providers/providers.types.d.ts +23 -0
  46. package/dist/commands/providers/providers.types.d.ts.map +1 -1
  47. package/dist/commands/shared/codex-strays.d.ts.map +1 -1
  48. package/dist/commands/shared/codex-strays.js +11 -1
  49. package/dist/commands/status/index.d.ts +4 -1
  50. package/dist/commands/status/index.d.ts.map +1 -1
  51. package/dist/commands/status/index.js +1 -1
  52. package/dist/commands/sync/index.d.ts.map +1 -1
  53. package/dist/commands/sync/index.js +1 -1
  54. package/dist/commands/sync/sync.types.d.ts +4 -1
  55. package/dist/commands/sync/sync.types.d.ts.map +1 -1
  56. package/dist/config/dispatch-ceiling-preset.d.ts +4 -0
  57. package/dist/config/dispatch-ceiling-preset.d.ts.map +1 -1
  58. package/dist/config/dispatch-ceiling-preset.js +3 -0
  59. package/dist/config/dispatch-policy-options.d.ts +20 -0
  60. package/dist/config/dispatch-policy-options.d.ts.map +1 -0
  61. package/dist/config/dispatch-policy-options.js +96 -0
  62. package/dist/config/oat-config.d.ts +21 -5
  63. package/dist/config/oat-config.d.ts.map +1 -1
  64. package/dist/config/oat-config.js +118 -10
  65. package/dist/config/resolve.js +12 -0
  66. package/dist/manifest/manifest.types.d.ts +12 -12
  67. package/dist/providers/ceiling/registry.d.ts +7 -5
  68. package/dist/providers/ceiling/registry.d.ts.map +1 -1
  69. package/dist/providers/ceiling/registry.js +32 -5
  70. package/dist/providers/codex/codec/config-merge.d.ts +6 -0
  71. package/dist/providers/codex/codec/config-merge.d.ts.map +1 -1
  72. package/dist/providers/codex/codec/config-merge.js +7 -0
  73. package/dist/providers/codex/codec/materialize.d.ts +16 -0
  74. package/dist/providers/codex/codec/materialize.d.ts.map +1 -0
  75. package/dist/providers/codex/codec/materialize.js +57 -0
  76. package/dist/providers/codex/codec/shared.d.ts +1 -0
  77. package/dist/providers/codex/codec/shared.d.ts.map +1 -1
  78. package/dist/providers/codex/codec/shared.js +9 -1
  79. package/dist/providers/codex/codec/sync-extension.d.ts +7 -1
  80. package/dist/providers/codex/codec/sync-extension.d.ts.map +1 -1
  81. package/dist/providers/codex/codec/sync-extension.js +183 -46
  82. package/dist/providers/identity/availability.d.ts +45 -0
  83. package/dist/providers/identity/availability.d.ts.map +1 -0
  84. package/dist/providers/identity/availability.js +353 -0
  85. package/dist/providers/identity/family.d.ts +13 -0
  86. package/dist/providers/identity/family.d.ts.map +1 -0
  87. package/dist/providers/identity/family.js +32 -0
  88. package/dist/providers/identity/provenance.d.ts +21 -0
  89. package/dist/providers/identity/provenance.d.ts.map +1 -0
  90. package/dist/providers/identity/provenance.js +65 -0
  91. package/dist/providers/identity/stamp.d.ts +35 -0
  92. package/dist/providers/identity/stamp.d.ts.map +1 -0
  93. package/dist/providers/identity/stamp.js +171 -0
  94. package/package.json +2 -2
@@ -0,0 +1,13 @@
1
+ export type ModelFamily = 'claude' | 'openai' | 'composer' | 'glm' | 'unknown';
2
+ interface ClassifyModelFamilyInput {
3
+ value: string;
4
+ /**
5
+ * Structured model-provider identifier, when a harness exposes one. This is
6
+ * not the orchestration/runtime harness id; e.g. Cursor can run several model
7
+ * families and must be classified from the concrete model value.
8
+ */
9
+ providerId?: string;
10
+ }
11
+ export declare function classifyModelFamily(input: ClassifyModelFamilyInput): ModelFamily;
12
+ export {};
13
+ //# sourceMappingURL=family.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"family.d.ts","sourceRoot":"","sources":["../../../src/providers/identity/family.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,SAAS,CAAC;AAE/E,UAAU,wBAAwB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAgCD,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,wBAAwB,GAC9B,WAAW,CASb"}
@@ -0,0 +1,32 @@
1
+ const PROVIDER_ID_FAMILIES = [
2
+ [/^(anthropic|claude)$/i, 'claude'],
3
+ [/^(openai|codex)$/i, 'openai'],
4
+ [/^composer$/i, 'composer'],
5
+ [/^(glm|zai|zhipu)$/i, 'glm'],
6
+ ];
7
+ const VALUE_FAMILIES = [
8
+ [/\b(claude|sonnet|opus|haiku|fable)\b/i, 'claude'],
9
+ [/\b(gpt|openai|codex|o[1-9])[-\w.]*\b/i, 'openai'],
10
+ [/\bcomposer\b/i, 'composer'],
11
+ [/\bglm\b/i, 'glm'],
12
+ ];
13
+ function normalize(value) {
14
+ return typeof value === 'string' ? value.trim() : '';
15
+ }
16
+ function firstMatchingFamily(value, patterns) {
17
+ for (const [pattern, family] of patterns) {
18
+ if (pattern.test(value)) {
19
+ return family;
20
+ }
21
+ }
22
+ return undefined;
23
+ }
24
+ export function classifyModelFamily(input) {
25
+ const providerId = normalize(input?.providerId);
26
+ const providerFamily = firstMatchingFamily(providerId, PROVIDER_ID_FAMILIES);
27
+ if (providerFamily) {
28
+ return providerFamily;
29
+ }
30
+ const value = normalize(input?.value);
31
+ return firstMatchingFamily(value, VALUE_FAMILIES) ?? 'unknown';
32
+ }
@@ -0,0 +1,21 @@
1
+ export type IdentityProvenance = 'declared' | 'observed' | 'inferred' | 'unknown';
2
+ export type IdentityConfidence = 'high' | 'medium' | 'low' | 'unknown';
3
+ export interface IdentityRecord {
4
+ value: string;
5
+ provenance: IdentityProvenance;
6
+ /**
7
+ * True when the harness has been proven to reject invalid model selections
8
+ * instead of silently falling back to another model.
9
+ */
10
+ rejectOnInvalid?: boolean;
11
+ }
12
+ export interface ResolvedIdentity {
13
+ value: string;
14
+ provenance: IdentityProvenance;
15
+ confidence: IdentityConfidence;
16
+ mismatch: boolean;
17
+ diversityClaimable: boolean;
18
+ records: IdentityRecord[];
19
+ }
20
+ export declare function resolveIdentityConfidence(records: IdentityRecord[]): ResolvedIdentity;
21
+ //# sourceMappingURL=provenance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provenance.d.ts","sourceRoot":"","sources":["../../../src/providers/identity/provenance.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAC1B,UAAU,GACV,UAAU,GACV,UAAU,GACV,SAAS,CAAC;AAEd,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;AAEvE,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,kBAAkB,CAAC;IAC/B;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,kBAAkB,CAAC;IAC/B,UAAU,EAAE,kBAAkB,CAAC;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAClB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,OAAO,EAAE,cAAc,EAAE,CAAC;CAC3B;AA+DD,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,cAAc,EAAE,GACxB,gBAAgB,CAmClB"}
@@ -0,0 +1,65 @@
1
+ const PROVENANCE_PRIORITY = {
2
+ declared: 4,
3
+ observed: 3,
4
+ inferred: 2,
5
+ unknown: 1,
6
+ };
7
+ function normalizedValue(value) {
8
+ return typeof value === 'string' && value.trim().length > 0
9
+ ? value.trim()
10
+ : 'unknown';
11
+ }
12
+ function normalizeRecord(record) {
13
+ return {
14
+ ...record,
15
+ value: normalizedValue(record.value),
16
+ };
17
+ }
18
+ function strongestRecord(records, provenance) {
19
+ return records.find((record) => record.provenance === provenance && record.value !== 'unknown');
20
+ }
21
+ function strongestKnownRecord(records) {
22
+ return records
23
+ .filter((record) => record.value !== 'unknown')
24
+ .sort((left, right) => PROVENANCE_PRIORITY[right.provenance] -
25
+ PROVENANCE_PRIORITY[left.provenance])[0];
26
+ }
27
+ function resolved(record, confidence, mismatch, records) {
28
+ const value = record.value;
29
+ return {
30
+ value,
31
+ provenance: record.provenance,
32
+ confidence,
33
+ mismatch,
34
+ diversityClaimable: value !== 'unknown' &&
35
+ record.provenance !== 'unknown' &&
36
+ confidence !== 'unknown',
37
+ records,
38
+ };
39
+ }
40
+ export function resolveIdentityConfidence(records) {
41
+ const normalizedRecords = records.map(normalizeRecord);
42
+ const declared = strongestRecord(normalizedRecords, 'declared');
43
+ const observed = strongestRecord(normalizedRecords, 'observed');
44
+ if (declared && observed) {
45
+ if (declared.value === observed.value) {
46
+ return resolved(declared, 'high', false, normalizedRecords);
47
+ }
48
+ return resolved(observed, 'low', true, normalizedRecords);
49
+ }
50
+ if (declared) {
51
+ return resolved(declared, declared.rejectOnInvalid === true ? 'high' : 'medium', false, normalizedRecords);
52
+ }
53
+ if (observed) {
54
+ return resolved(observed, 'low', false, normalizedRecords);
55
+ }
56
+ const inferred = strongestRecord(normalizedRecords, 'inferred');
57
+ if (inferred) {
58
+ return resolved(inferred, 'low', false, normalizedRecords);
59
+ }
60
+ const fallback = strongestKnownRecord(normalizedRecords) ?? {
61
+ value: 'unknown',
62
+ provenance: 'unknown',
63
+ };
64
+ return resolved(fallback, 'unknown', false, normalizedRecords);
65
+ }
@@ -0,0 +1,35 @@
1
+ import type { IdentityProvenance } from './provenance.js';
2
+ export type DispatchAction = 'implementation' | 'fix' | 'review';
3
+ export type DispatchRole = 'implementer' | 'fix' | 'reviewer';
4
+ export interface DispatchStampRecord {
5
+ scope: string;
6
+ action: DispatchAction;
7
+ role: DispatchRole;
8
+ producer: string;
9
+ provenance: IdentityProvenance;
10
+ modelAxis: string;
11
+ effortAxis: string;
12
+ dispatchPolicy: string;
13
+ dispatchCeiling: string;
14
+ target: string;
15
+ }
16
+ export interface DispatchStamp extends DispatchStampRecord {
17
+ line: string;
18
+ lineNumber: number;
19
+ legacy: boolean;
20
+ }
21
+ export interface ProducerIdentity {
22
+ scope: string;
23
+ action: DispatchAction;
24
+ role: DispatchRole;
25
+ producer: string;
26
+ provenance: IdentityProvenance;
27
+ target: string;
28
+ }
29
+ export interface ParseDispatchStampsOptions {
30
+ onWarning?: (warning: string) => void;
31
+ }
32
+ export declare function formatDispatchStamp(record: DispatchStampRecord): string;
33
+ export declare function parseDispatchStamps(markdown: string, options?: ParseDispatchStampsOptions): DispatchStamp[];
34
+ export declare function getProducerIdentitiesByScope(markdown: string, options?: ParseDispatchStampsOptions): Record<string, ProducerIdentity[]>;
35
+ //# sourceMappingURL=stamp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stamp.d.ts","sourceRoot":"","sources":["../../../src/providers/identity/stamp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEvD,MAAM,MAAM,cAAc,GAAG,gBAAgB,GAAG,KAAK,GAAG,QAAQ,CAAC;AACjE,MAAM,MAAM,YAAY,GAAG,aAAa,GAAG,KAAK,GAAG,UAAU,CAAC;AAE9D,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAc,SAAQ,mBAAmB;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,0BAA0B;IACzC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AAyDD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,CAiBvE;AAqGD,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,0BAA+B,GACvC,aAAa,EAAE,CAqBjB;AAED,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,0BAA+B,GACvC,MAAM,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAepC"}
@@ -0,0 +1,171 @@
1
+ const ACTIONS = new Set(['implementation', 'fix', 'review']);
2
+ const ROLES = new Set(['implementer', 'fix', 'reviewer']);
3
+ const PROVENANCES = new Set([
4
+ 'declared',
5
+ 'observed',
6
+ 'inferred',
7
+ 'unknown',
8
+ ]);
9
+ const FIELD_ORDER = [
10
+ ['scope', 'scope'],
11
+ ['action', 'action'],
12
+ ['role', 'role'],
13
+ ['producer', 'producer'],
14
+ ['provenance', 'provenance'],
15
+ ['modelAxis', 'model_axis'],
16
+ ['effortAxis', 'effort_axis'],
17
+ ['dispatchPolicy', 'dispatch_policy'],
18
+ ['dispatchCeiling', 'dispatch_ceiling'],
19
+ ['target', 'target'],
20
+ ];
21
+ function singleToken(value, fallback) {
22
+ const trimmed = value?.trim() ?? '';
23
+ return trimmed.length > 0 && /^\S+$/.test(trimmed) ? trimmed : fallback;
24
+ }
25
+ function normalizeAction(value) {
26
+ return ACTIONS.has(value)
27
+ ? value
28
+ : undefined;
29
+ }
30
+ function normalizeRole(value) {
31
+ return ROLES.has(value) ? value : undefined;
32
+ }
33
+ function normalizeProvenance(value) {
34
+ return PROVENANCES.has(value)
35
+ ? value
36
+ : 'unknown';
37
+ }
38
+ function inferRole(action) {
39
+ if (action === 'review') {
40
+ return 'reviewer';
41
+ }
42
+ if (action === 'fix') {
43
+ return 'fix';
44
+ }
45
+ return 'implementer';
46
+ }
47
+ export function formatDispatchStamp(record) {
48
+ const normalized = {
49
+ scope: singleToken(record.scope, 'unknown'),
50
+ action: record.action,
51
+ role: record.role,
52
+ producer: singleToken(record.producer, 'unknown'),
53
+ provenance: normalizeProvenance(record.provenance),
54
+ modelAxis: singleToken(record.modelAxis, 'unknown'),
55
+ effortAxis: singleToken(record.effortAxis, 'unknown'),
56
+ dispatchPolicy: singleToken(record.dispatchPolicy, 'unknown'),
57
+ dispatchCeiling: singleToken(record.dispatchCeiling, 'none'),
58
+ target: singleToken(record.target, 'unknown'),
59
+ };
60
+ return `Dispatch: ${FIELD_ORDER.map(([property, key]) => `${key}=${normalized[property]}`).join(' ')}`;
61
+ }
62
+ function tokenMap(tokens) {
63
+ const fields = new Map();
64
+ for (const token of tokens) {
65
+ const sanitized = token.replace(/,$/, '');
66
+ const match = sanitized.match(/^([a-z_]+)=(.+)$/);
67
+ const key = match?.[1];
68
+ const value = match?.[2];
69
+ if (key && value) {
70
+ fields.set(key, value);
71
+ }
72
+ }
73
+ return fields;
74
+ }
75
+ function dispatchPayload(line) {
76
+ const match = line.match(/\bDispatch:\s*(.+)$/);
77
+ return match?.[1]?.trim();
78
+ }
79
+ function warn(options, lineNumber, reason) {
80
+ options.onWarning?.(`Skipped malformed Dispatch line ${lineNumber}: ${reason}`);
81
+ }
82
+ function parseModernStamp(line, lineNumber, fields, options) {
83
+ const action = normalizeAction(fields.get('action'));
84
+ if (!action) {
85
+ warn(options, lineNumber, 'missing or invalid action');
86
+ return undefined;
87
+ }
88
+ const role = normalizeRole(fields.get('role'));
89
+ if (!role) {
90
+ warn(options, lineNumber, 'missing or invalid role');
91
+ return undefined;
92
+ }
93
+ const scope = singleToken(fields.get('scope'), '');
94
+ if (!scope) {
95
+ warn(options, lineNumber, 'missing scope');
96
+ return undefined;
97
+ }
98
+ return {
99
+ scope,
100
+ action,
101
+ role,
102
+ producer: singleToken(fields.get('producer'), 'unknown'),
103
+ provenance: normalizeProvenance(fields.get('provenance')),
104
+ modelAxis: singleToken(fields.get('model_axis'), 'unknown'),
105
+ effortAxis: singleToken(fields.get('effort_axis'), 'unknown'),
106
+ dispatchPolicy: singleToken(fields.get('dispatch_policy'), 'unknown'),
107
+ dispatchCeiling: singleToken(fields.get('dispatch_ceiling'), 'none'),
108
+ target: singleToken(fields.get('target'), 'unknown'),
109
+ line,
110
+ lineNumber,
111
+ legacy: false,
112
+ };
113
+ }
114
+ function parseLegacyStamp(line, lineNumber, tokens, fields, options) {
115
+ const scope = singleToken(tokens[0], '');
116
+ const action = normalizeAction(tokens[1]);
117
+ if (!scope || !action) {
118
+ warn(options, lineNumber, 'missing legacy scope/action');
119
+ return undefined;
120
+ }
121
+ return {
122
+ scope,
123
+ action,
124
+ role: inferRole(action),
125
+ producer: 'unknown',
126
+ provenance: 'unknown',
127
+ modelAxis: singleToken(fields.get('model_axis'), 'unknown'),
128
+ effortAxis: singleToken(fields.get('effort_axis'), 'unknown'),
129
+ dispatchPolicy: singleToken(fields.get('dispatch_policy'), 'unknown'),
130
+ dispatchCeiling: singleToken(fields.get('dispatch_ceiling'), 'none'),
131
+ target: singleToken(fields.get('target'), 'unknown'),
132
+ line,
133
+ lineNumber,
134
+ legacy: true,
135
+ };
136
+ }
137
+ export function parseDispatchStamps(markdown, options = {}) {
138
+ const stamps = [];
139
+ const lines = markdown.split(/\r?\n/);
140
+ lines.forEach((line, index) => {
141
+ const payload = dispatchPayload(line);
142
+ if (!payload) {
143
+ return;
144
+ }
145
+ const tokens = payload.split(/\s+/);
146
+ const fields = tokenMap(tokens);
147
+ const stamp = fields.has('scope')
148
+ ? parseModernStamp(line, index + 1, fields, options)
149
+ : parseLegacyStamp(line, index + 1, tokens, fields, options);
150
+ if (stamp) {
151
+ stamps.push(stamp);
152
+ }
153
+ });
154
+ return stamps;
155
+ }
156
+ export function getProducerIdentitiesByScope(markdown, options = {}) {
157
+ const grouped = {};
158
+ for (const stamp of parseDispatchStamps(markdown, options)) {
159
+ const identities = grouped[stamp.scope] ?? [];
160
+ identities.push({
161
+ scope: stamp.scope,
162
+ action: stamp.action,
163
+ role: stamp.role,
164
+ producer: stamp.producer,
165
+ provenance: stamp.provenance,
166
+ target: stamp.target,
167
+ });
168
+ grouped[stamp.scope] = identities;
169
+ }
170
+ return grouped;
171
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-agent-toolkit/cli",
3
- "version": "0.1.43",
3
+ "version": "0.1.46",
4
4
  "private": false,
5
5
  "description": "Open Agent Toolkit CLI",
6
6
  "homepage": "https://github.com/voxmedia/open-agent-toolkit/tree/main/packages/cli",
@@ -34,7 +34,7 @@
34
34
  "ora": "^9.0.0",
35
35
  "yaml": "2.8.2",
36
36
  "zod": "^3.25.76",
37
- "@open-agent-toolkit/control-plane": "0.1.43"
37
+ "@open-agent-toolkit/control-plane": "0.1.46"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@types/node": "^22.10.0",