runline 0.20.0 → 0.21.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/dist/core/engine.d.ts
CHANGED
|
@@ -14,9 +14,11 @@ export interface EngineOptions {
|
|
|
14
14
|
*
|
|
15
15
|
* Fired only around `action.execute()` — an unknown path or a failed
|
|
16
16
|
* input validation throws before plugin code runs and is not an
|
|
17
|
-
* invocation. `error` is
|
|
18
|
-
*
|
|
19
|
-
*
|
|
17
|
+
* invocation. `error` is present exactly when execute rejected: the
|
|
18
|
+
* thrown value as-is, except a nullish throw, which is substituted
|
|
19
|
+
* with an Error so failure is never mistaken for success. The hook
|
|
20
|
+
* sees it in the host process even though the worker only ever
|
|
21
|
+
* receives the message string.
|
|
20
22
|
*/
|
|
21
23
|
export interface ActionInvocation {
|
|
22
24
|
plugin: string;
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
import * as t from "typebox";
|
|
2
|
+
import { ATLAS_BASE, cursorSchema, enumSchema, GRAPH_ACTOR_KIND, GRAPH_ASSIGNMENT_ROLE, GRAPH_BINDING_EXECUTOR, GRAPH_BINDING_STATUS, GRAPH_CHANGE_ENTITY_TYPE, GRAPH_EVIDENCE_KIND, GRAPH_JOURNEY_STATUS, GRAPH_RELATION_KIND, GRAPH_TASK_MODE, idSchema, pathSegment, request, STRICT_OBJECT, STRICT_UPDATE_OBJECT, } from "./shared.js";
|
|
3
|
+
/**
|
|
4
|
+
* The operational graph behind the Atlas view: a business spec of how
|
|
5
|
+
* a company operates, in its own language. Four fixed levels — line →
|
|
6
|
+
* journey → stage → task — plus named actors, RACI assignments,
|
|
7
|
+
* level-typed relations, execution bindings, and evidence. Automation
|
|
8
|
+
* status is always derived from bindings, never declared.
|
|
9
|
+
*/
|
|
10
|
+
const name = (description) => t.String({ minLength: 1, maxLength: 300, pattern: "\\S", description });
|
|
11
|
+
const longText = (description) => t.String({ maxLength: 5_000, description });
|
|
12
|
+
const position = t.Integer({
|
|
13
|
+
minimum: 0,
|
|
14
|
+
maximum: 100_000,
|
|
15
|
+
description: "Sort position within the parent (0-based)",
|
|
16
|
+
});
|
|
17
|
+
const urlField = t.String({
|
|
18
|
+
minLength: 1,
|
|
19
|
+
maxLength: 2_000,
|
|
20
|
+
description: "Link URL",
|
|
21
|
+
});
|
|
22
|
+
const referenceField = t.String({
|
|
23
|
+
minLength: 1,
|
|
24
|
+
maxLength: 1_000,
|
|
25
|
+
pattern: "\\S",
|
|
26
|
+
description: "External reference (system-specific identifier)",
|
|
27
|
+
});
|
|
28
|
+
export function registerGraphActions(rl) {
|
|
29
|
+
/* -------------------------------------------------------------- */
|
|
30
|
+
/* Reads */
|
|
31
|
+
/* -------------------------------------------------------------- */
|
|
32
|
+
rl.registerAction("summary", {
|
|
33
|
+
access: "read",
|
|
34
|
+
description: "The operational graph's structure without task bodies: every " +
|
|
35
|
+
"line, journey, and stage with rollups (total/liveAi/planned/" +
|
|
36
|
+
"human counts), plus actors and level labels. Small at any org " +
|
|
37
|
+
"size; the right default read.",
|
|
38
|
+
inputSchema: t.Object({}, STRICT_OBJECT),
|
|
39
|
+
async execute(_input, ctx) {
|
|
40
|
+
const body = await request(ctx, `${ATLAS_BASE}/summary`);
|
|
41
|
+
return body.summary;
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
rl.registerAction("graph.get", {
|
|
45
|
+
access: "read",
|
|
46
|
+
description: "The entire operational graph including every task body, " +
|
|
47
|
+
"assignment, binding, and evidence. Payload grows with task " +
|
|
48
|
+
"count — prefer summary plus stage.get.",
|
|
49
|
+
inputSchema: t.Object({}, STRICT_OBJECT),
|
|
50
|
+
async execute(_input, ctx) {
|
|
51
|
+
const body = await request(ctx, `${ATLAS_BASE}/graph`);
|
|
52
|
+
return body.graph;
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
rl.registerAction("stage.get", {
|
|
56
|
+
access: "read",
|
|
57
|
+
description: "One stage in full: its ordered tasks with participants, owner, " +
|
|
58
|
+
"bindings, evidence, and derived automation status.",
|
|
59
|
+
inputSchema: t.Object({ id: idSchema("Stage ID") }, STRICT_OBJECT),
|
|
60
|
+
async execute(input, ctx) {
|
|
61
|
+
const { id } = input;
|
|
62
|
+
const body = await request(ctx, `${ATLAS_BASE}/stages/${pathSegment(id)}`);
|
|
63
|
+
return body.stage;
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
rl.registerAction("actor.list", {
|
|
67
|
+
access: "read",
|
|
68
|
+
description: "List the named workers of the graph: agents and human roles.",
|
|
69
|
+
inputSchema: t.Object({}, STRICT_OBJECT),
|
|
70
|
+
async execute(_input, ctx) {
|
|
71
|
+
const body = await request(ctx, `${ATLAS_BASE}/actors`);
|
|
72
|
+
return body.actors;
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
rl.registerAction("line.list", {
|
|
76
|
+
access: "read",
|
|
77
|
+
description: "List business lines. Every organization has one default line; " +
|
|
78
|
+
"journeys created without a lineId land there.",
|
|
79
|
+
inputSchema: t.Object({}, STRICT_OBJECT),
|
|
80
|
+
async execute(_input, ctx) {
|
|
81
|
+
const body = await request(ctx, `${ATLAS_BASE}/lines`);
|
|
82
|
+
return body.lines;
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
rl.registerAction("journey.list", {
|
|
86
|
+
access: "read",
|
|
87
|
+
description: "List journeys (id, name, outcome, status, line).",
|
|
88
|
+
inputSchema: t.Object({}, STRICT_OBJECT),
|
|
89
|
+
async execute(_input, ctx) {
|
|
90
|
+
const body = await request(ctx, `${ATLAS_BASE}/journeys`);
|
|
91
|
+
return body.journeys;
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
rl.registerAction("journey.get", {
|
|
95
|
+
access: "read",
|
|
96
|
+
description: "One journey in full: its stages, their tasks, triggers, and rollups.",
|
|
97
|
+
inputSchema: t.Object({ id: idSchema("Journey ID") }, STRICT_OBJECT),
|
|
98
|
+
async execute(input, ctx) {
|
|
99
|
+
const { id } = input;
|
|
100
|
+
const body = await request(ctx, `${ATLAS_BASE}/journeys/${pathSegment(id)}`);
|
|
101
|
+
return body.journey;
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
rl.registerAction("labels.get", {
|
|
105
|
+
access: "read",
|
|
106
|
+
description: "What this organization calls each level (line/journey/stage/task).",
|
|
107
|
+
inputSchema: t.Object({}, STRICT_OBJECT),
|
|
108
|
+
async execute(_input, ctx) {
|
|
109
|
+
const body = await request(ctx, `${ATLAS_BASE}/labels`);
|
|
110
|
+
return body.labels;
|
|
111
|
+
},
|
|
112
|
+
});
|
|
113
|
+
rl.registerAction("change.list", {
|
|
114
|
+
access: "read",
|
|
115
|
+
description: "Append-only change log of the graph, newest first, cursor-" +
|
|
116
|
+
"paginated. Returns { changes, nextCursor? }.",
|
|
117
|
+
inputSchema: t.Object({
|
|
118
|
+
entityType: t.Optional(enumSchema("Entity type", GRAPH_CHANGE_ENTITY_TYPE)),
|
|
119
|
+
entityId: t.Optional(idSchema("Entity ID")),
|
|
120
|
+
cursor: t.Optional(cursorSchema()),
|
|
121
|
+
limit: t.Optional(t.Integer({ minimum: 1, maximum: 200 })),
|
|
122
|
+
}, STRICT_OBJECT),
|
|
123
|
+
async execute(input, ctx) {
|
|
124
|
+
const params = new URLSearchParams();
|
|
125
|
+
for (const [key, value] of Object.entries(input)) {
|
|
126
|
+
if (value !== undefined)
|
|
127
|
+
params.set(key, String(value));
|
|
128
|
+
}
|
|
129
|
+
return request(ctx, `${ATLAS_BASE}/changes?${params}`);
|
|
130
|
+
},
|
|
131
|
+
});
|
|
132
|
+
/* -------------------------------------------------------------- */
|
|
133
|
+
/* Mutations — each mirrors one service input schema. */
|
|
134
|
+
/* -------------------------------------------------------------- */
|
|
135
|
+
/**
|
|
136
|
+
* Sub-resource creates carry one routing key (journeyId, stageId,
|
|
137
|
+
* taskId) that belongs in the path, not the body. It is named as the
|
|
138
|
+
* key to omit — rather than allowlisting body fields — so a field
|
|
139
|
+
* added to the schema later flows through by default instead of
|
|
140
|
+
* being silently dropped.
|
|
141
|
+
*/
|
|
142
|
+
function create(action, entity, path, description, fields, routingKey) {
|
|
143
|
+
rl.registerAction(action, {
|
|
144
|
+
access: "write",
|
|
145
|
+
description,
|
|
146
|
+
inputSchema: t.Object(fields, STRICT_OBJECT),
|
|
147
|
+
async execute(input, ctx) {
|
|
148
|
+
const all = input;
|
|
149
|
+
const body = { ...all };
|
|
150
|
+
if (routingKey)
|
|
151
|
+
delete body[routingKey];
|
|
152
|
+
const response = await request(ctx, path(all), { method: "POST", body: JSON.stringify(body) });
|
|
153
|
+
return response[entity];
|
|
154
|
+
},
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
function update(action, entity, collection, description, fields) {
|
|
158
|
+
rl.registerAction(action, {
|
|
159
|
+
access: "write",
|
|
160
|
+
description,
|
|
161
|
+
inputSchema: t.Object({ id: idSchema(`${entity} ID`), ...fields }, STRICT_UPDATE_OBJECT),
|
|
162
|
+
async execute(input, ctx) {
|
|
163
|
+
const { id, ...patch } = input;
|
|
164
|
+
const response = await request(ctx, `${ATLAS_BASE}/${collection}/${pathSegment(id)}`, { method: "PATCH", body: JSON.stringify(patch) });
|
|
165
|
+
return response[entity];
|
|
166
|
+
},
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
function remove(action, entity, collection, description) {
|
|
170
|
+
rl.registerAction(action, {
|
|
171
|
+
access: "write",
|
|
172
|
+
description,
|
|
173
|
+
inputSchema: t.Object({ id: idSchema(`${entity} ID`) }, STRICT_OBJECT),
|
|
174
|
+
async execute(input, ctx) {
|
|
175
|
+
const { id } = input;
|
|
176
|
+
await request(ctx, `${ATLAS_BASE}/${collection}/${pathSegment(id)}`, { method: "DELETE" });
|
|
177
|
+
return { deleted: true, id };
|
|
178
|
+
},
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
/* Actors */
|
|
182
|
+
create("actor.create", "actor", () => `${ATLAS_BASE}/actors`, "Create a named worker: an agent (e.g. Jarvis) or a human role (e.g. CFO).", {
|
|
183
|
+
name: name("Actor name"),
|
|
184
|
+
kind: enumSchema("Actor kind", GRAPH_ACTOR_KIND),
|
|
185
|
+
description: t.Optional(longText("What this actor does")),
|
|
186
|
+
});
|
|
187
|
+
update("actor.update", "actor", "actors", "Update an actor.", {
|
|
188
|
+
name: t.Optional(name("Actor name")),
|
|
189
|
+
kind: t.Optional(enumSchema("Actor kind", GRAPH_ACTOR_KIND)),
|
|
190
|
+
description: t.Optional(longText("What this actor does")),
|
|
191
|
+
});
|
|
192
|
+
remove("actor.delete", "actor", "actors", "Delete an actor. Refused (409 actor_in_use) while assignments reference it.");
|
|
193
|
+
/* Lines */
|
|
194
|
+
create("line.create", "line", () => `${ATLAS_BASE}/lines`, "Create a business line — the widest grouping of journeys.", {
|
|
195
|
+
name: name("Line name"),
|
|
196
|
+
blurb: t.Optional(longText("One-sentence description")),
|
|
197
|
+
position: t.Optional(position),
|
|
198
|
+
});
|
|
199
|
+
update("line.update", "line", "lines", "Update a business line.", {
|
|
200
|
+
name: t.Optional(name("Line name")),
|
|
201
|
+
blurb: t.Optional(longText("One-sentence description")),
|
|
202
|
+
position: t.Optional(position),
|
|
203
|
+
});
|
|
204
|
+
remove("line.delete", "line", "lines", "Delete a business line. Refused while journeys reference it (line_in_use) or it is the last line (last_line).");
|
|
205
|
+
/* Journeys */
|
|
206
|
+
create("journey.create", "journey", () => `${ATLAS_BASE}/journeys`, "Create a journey: an end-to-end flow with a business outcome. " +
|
|
207
|
+
"Omitting lineId places it in the organization's default line.", {
|
|
208
|
+
lineId: t.Optional(idSchema("Business line ID")),
|
|
209
|
+
name: name("Journey name"),
|
|
210
|
+
outcome: t.Optional(longText("The business outcome it delivers")),
|
|
211
|
+
position: t.Optional(position),
|
|
212
|
+
status: t.Optional(enumSchema("Journey status", GRAPH_JOURNEY_STATUS)),
|
|
213
|
+
});
|
|
214
|
+
update("journey.update", "journey", "journeys", "Update a journey.", {
|
|
215
|
+
lineId: t.Optional(idSchema("Business line ID")),
|
|
216
|
+
name: t.Optional(name("Journey name")),
|
|
217
|
+
outcome: t.Optional(longText("The business outcome it delivers")),
|
|
218
|
+
position: t.Optional(position),
|
|
219
|
+
status: t.Optional(enumSchema("Journey status", GRAPH_JOURNEY_STATUS)),
|
|
220
|
+
});
|
|
221
|
+
remove("journey.delete", "journey", "journeys", "Delete a journey and, in cascade, its stages and tasks.");
|
|
222
|
+
/* Stages */
|
|
223
|
+
create("stage.create", "stage", (input) => `${ATLAS_BASE}/journeys/${pathSegment(input.journeyId)}/stages`, "Create an ordered stage inside a journey.", {
|
|
224
|
+
journeyId: idSchema("Journey ID"),
|
|
225
|
+
name: name("Stage name"),
|
|
226
|
+
intent: t.Optional(longText("What this stage exists to ensure")),
|
|
227
|
+
position: t.Optional(position),
|
|
228
|
+
}, "journeyId");
|
|
229
|
+
update("stage.update", "stage", "stages", "Update a stage.", {
|
|
230
|
+
name: t.Optional(name("Stage name")),
|
|
231
|
+
intent: t.Optional(longText("What this stage exists to ensure")),
|
|
232
|
+
position: t.Optional(position),
|
|
233
|
+
});
|
|
234
|
+
remove("stage.delete", "stage", "stages", "Delete a stage and, in cascade, its tasks.");
|
|
235
|
+
/* Tasks */
|
|
236
|
+
create("task.create", "task", (input) => `${ATLAS_BASE}/stages/${pathSegment(input.stageId)}/tasks`, "Create a task — the atomic responsibility inside a stage. " +
|
|
237
|
+
"actorId also creates the matching `does` assignment (the owner).", {
|
|
238
|
+
stageId: idSchema("Stage ID"),
|
|
239
|
+
description: t.String({
|
|
240
|
+
minLength: 1,
|
|
241
|
+
maxLength: 2_000,
|
|
242
|
+
pattern: "\\S",
|
|
243
|
+
description: "What the work is, in the business's own words",
|
|
244
|
+
}),
|
|
245
|
+
position: t.Optional(position),
|
|
246
|
+
intendedMode: enumSchema("Intended mode", GRAPH_TASK_MODE),
|
|
247
|
+
actorId: t.Optional(idSchema("Owner actor ID")),
|
|
248
|
+
}, "stageId");
|
|
249
|
+
update("task.update", "task", "tasks", "Update a task. actorId replaces the `does` assignment; null clears the owner.", {
|
|
250
|
+
description: t.Optional(t.String({ minLength: 1, maxLength: 2_000, pattern: "\\S" })),
|
|
251
|
+
position: t.Optional(position),
|
|
252
|
+
intendedMode: t.Optional(enumSchema("Intended mode", GRAPH_TASK_MODE)),
|
|
253
|
+
actorId: t.Optional(t.Union([idSchema("Owner actor ID"), t.Null()])),
|
|
254
|
+
});
|
|
255
|
+
remove("task.delete", "task", "tasks", "Delete a task.");
|
|
256
|
+
/* Assignments */
|
|
257
|
+
create("assignment.create", "assignment", (input) => `${ATLAS_BASE}/tasks/${pathSegment(input.taskId)}/assignments`, "Add an actor to a task in a RACI role. `does` is the owner; a task has at most one.", {
|
|
258
|
+
taskId: idSchema("Task ID"),
|
|
259
|
+
actorId: idSchema("Actor ID"),
|
|
260
|
+
role: t.Optional(enumSchema("Assignment role", GRAPH_ASSIGNMENT_ROLE)),
|
|
261
|
+
}, "taskId");
|
|
262
|
+
remove("assignment.delete", "assignment", "assignments", "Remove an actor's part in a task.");
|
|
263
|
+
/* Relations */
|
|
264
|
+
create("relation.create", "relation", () => `${ATLAS_BASE}/relations`, "Create a level-typed link: `follows` joins two tasks in one stage " +
|
|
265
|
+
"(cycles rejected); `triggers` joins two journeys (cycles allowed).", {
|
|
266
|
+
kind: enumSchema("Relation kind", GRAPH_RELATION_KIND),
|
|
267
|
+
fromId: idSchema("Source task or journey ID"),
|
|
268
|
+
toId: idSchema("Target task or journey ID"),
|
|
269
|
+
});
|
|
270
|
+
remove("relation.delete", "relation", "relations", "Delete a relation.");
|
|
271
|
+
/* Bindings */
|
|
272
|
+
create("binding.create", "binding", (input) => `${ATLAS_BASE}/tasks/${pathSegment(input.taskId)}/bindings`, "Bind a task to how it is executed: a Vex deployment, an external " +
|
|
273
|
+
"system, or manual work. A live non-manual binding is what makes " +
|
|
274
|
+
"a task count as live AI.", {
|
|
275
|
+
taskId: idSchema("Task ID"),
|
|
276
|
+
executor: enumSchema("Executor", GRAPH_BINDING_EXECUTOR),
|
|
277
|
+
label: name("Human-readable binding label"),
|
|
278
|
+
status: t.Optional(enumSchema("Binding status", GRAPH_BINDING_STATUS)),
|
|
279
|
+
deploymentId: t.Optional(idSchema("Vex deployment ID")),
|
|
280
|
+
reference: t.Optional(referenceField),
|
|
281
|
+
url: t.Optional(urlField),
|
|
282
|
+
}, "taskId");
|
|
283
|
+
update("binding.update", "binding", "bindings", "Update a binding; null clears deploymentId, reference, or url.", {
|
|
284
|
+
executor: t.Optional(enumSchema("Executor", GRAPH_BINDING_EXECUTOR)),
|
|
285
|
+
label: t.Optional(name("Human-readable binding label")),
|
|
286
|
+
status: t.Optional(enumSchema("Binding status", GRAPH_BINDING_STATUS)),
|
|
287
|
+
deploymentId: t.Optional(t.Union([idSchema("Vex deployment ID"), t.Null()])),
|
|
288
|
+
reference: t.Optional(t.Union([referenceField, t.Null()])),
|
|
289
|
+
url: t.Optional(t.Union([urlField, t.Null()])),
|
|
290
|
+
});
|
|
291
|
+
remove("binding.delete", "binding", "bindings", "Delete a binding.");
|
|
292
|
+
/* Evidence */
|
|
293
|
+
create("evidence.create", "evidence", (input) => `${ATLAS_BASE}/tasks/${pathSegment(input.taskId)}/evidence`, "Attach proof the work happens: a report, artifact, or dashboard. " +
|
|
294
|
+
"Requires url or artifactRef.", {
|
|
295
|
+
taskId: idSchema("Task ID"),
|
|
296
|
+
title: name("Evidence title"),
|
|
297
|
+
kind: enumSchema("Evidence kind", GRAPH_EVIDENCE_KIND),
|
|
298
|
+
url: t.Optional(urlField),
|
|
299
|
+
artifactRef: t.Optional(referenceField),
|
|
300
|
+
}, "taskId");
|
|
301
|
+
update("evidence.update", "evidence", "evidence", "Update evidence; null clears url or artifactRef.", {
|
|
302
|
+
title: t.Optional(name("Evidence title")),
|
|
303
|
+
kind: t.Optional(enumSchema("Evidence kind", GRAPH_EVIDENCE_KIND)),
|
|
304
|
+
url: t.Optional(t.Union([urlField, t.Null()])),
|
|
305
|
+
artifactRef: t.Optional(t.Union([referenceField, t.Null()])),
|
|
306
|
+
});
|
|
307
|
+
remove("evidence.delete", "evidence", "evidence", "Delete an evidence entry.");
|
|
308
|
+
/* Labels */
|
|
309
|
+
rl.registerAction("labels.update", {
|
|
310
|
+
access: "write",
|
|
311
|
+
description: "Rename what this organization calls each level — display only, " +
|
|
312
|
+
"no structural consequence.",
|
|
313
|
+
inputSchema: t.Object({
|
|
314
|
+
line: t.Optional(name("Label for the line level")),
|
|
315
|
+
journey: t.Optional(name("Label for the journey level")),
|
|
316
|
+
stage: t.Optional(name("Label for the stage level")),
|
|
317
|
+
task: t.Optional(name("Label for the task level")),
|
|
318
|
+
}, { additionalProperties: false, minProperties: 1 }),
|
|
319
|
+
async execute(input, ctx) {
|
|
320
|
+
const body = await request(ctx, `${ATLAS_BASE}/labels`, { method: "PATCH", body: JSON.stringify(input) });
|
|
321
|
+
return body.labels;
|
|
322
|
+
},
|
|
323
|
+
});
|
|
324
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import * as t from "typebox";
|
|
2
|
+
import { registerGraphActions } from "./graph.js";
|
|
3
|
+
/**
|
|
4
|
+
* Shift Atlas — the operational graph of a Shift cloud organization:
|
|
5
|
+
* the map of how the business runs. Independent of the shiftLabs
|
|
6
|
+
* plugin the same way shiftCrm is, but authenticated with the same
|
|
7
|
+
* Shift cloud API key; the cloud derives the organization from the
|
|
8
|
+
* key, so no organization ID is ever sent (SHFT-852).
|
|
9
|
+
*/
|
|
10
|
+
export default function shiftAtlas(rl) {
|
|
11
|
+
rl.setName("shiftAtlas");
|
|
12
|
+
rl.setVersion("0.1.0");
|
|
13
|
+
rl.setConnectionSchema(t.Object({
|
|
14
|
+
// Same Shift Labs API key family as the shiftLabs plugin; needs
|
|
15
|
+
// the service:operational-graph:use scope.
|
|
16
|
+
apiKey: t.String({
|
|
17
|
+
description: "Shift Labs API key",
|
|
18
|
+
env: "SHIFT_LABS_API_KEY",
|
|
19
|
+
}),
|
|
20
|
+
}));
|
|
21
|
+
registerGraphActions(rl);
|
|
22
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export { cursorSchema, enumSchema, idSchema, pathSegment, request, STRICT_OBJECT, STRICT_UPDATE_OBJECT, } from "../../_shared/shiftCloud.js";
|
|
2
|
+
/** Base path of the operational graph service in the Shift cloud API. */
|
|
3
|
+
export const ATLAS_BASE = "/v1/services/operational-graph";
|
|
4
|
+
export const GRAPH_ACTOR_KIND = ["agent", "human_role"];
|
|
5
|
+
export const GRAPH_JOURNEY_STATUS = ["draft", "published", "retired"];
|
|
6
|
+
export const GRAPH_ASSIGNMENT_ROLE = [
|
|
7
|
+
"does",
|
|
8
|
+
"approves",
|
|
9
|
+
"consulted",
|
|
10
|
+
"informed",
|
|
11
|
+
];
|
|
12
|
+
export const GRAPH_RELATION_KIND = ["follows", "triggers"];
|
|
13
|
+
export const GRAPH_TASK_MODE = ["ai", "human", "hybrid"];
|
|
14
|
+
export const GRAPH_BINDING_EXECUTOR = ["vex", "external", "manual"];
|
|
15
|
+
export const GRAPH_BINDING_STATUS = ["planned", "live", "paused"];
|
|
16
|
+
export const GRAPH_EVIDENCE_KIND = ["report", "artifact", "dashboard"];
|
|
17
|
+
export const GRAPH_CHANGE_ENTITY_TYPE = [
|
|
18
|
+
"actor",
|
|
19
|
+
"line",
|
|
20
|
+
"journey",
|
|
21
|
+
"stage",
|
|
22
|
+
"task",
|
|
23
|
+
"assignment",
|
|
24
|
+
"relation",
|
|
25
|
+
"binding",
|
|
26
|
+
"evidence",
|
|
27
|
+
"labels",
|
|
28
|
+
];
|