@granular-software/sdk 0.4.12 → 0.4.13

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/cli/index.js CHANGED
@@ -10,6 +10,7 @@ var crypto = require('crypto');
10
10
  var process6 = require('process');
11
11
  var os = require('os');
12
12
  var tty = require('tty');
13
+ var metamodelPresetDefault = require('@granular-software/metamodel-preset-default');
13
14
 
14
15
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
15
16
 
@@ -8833,10 +8834,29 @@ function sandboxDocScopeSection(projectName) {
8833
8834
 
8834
8835
  If **syntax** or **Granular behavior** is unclear, use the manifest guide; use **this** file for **ontology facts** for **${projectName}**.`;
8835
8836
  }
8837
+ function getFieldMetamodelDocRows() {
8838
+ return metamodelPresetDefault.collectMetamodelDocRows("fieldRows");
8839
+ }
8840
+ function getModelMetamodelDocRows() {
8841
+ return metamodelPresetDefault.collectMetamodelDocRows("modelRows");
8842
+ }
8843
+ function getEffectMetamodelDocRows() {
8844
+ return metamodelPresetDefault.collectMetamodelDocRows("effectRows");
8845
+ }
8846
+ function renderMetamodelDocTable(rows) {
8847
+ return [
8848
+ "| Key | Meaning |",
8849
+ "|-----|---------|",
8850
+ ...rows.map((row) => `| \`${row.key}\` | ${row.description} |`)
8851
+ ].join("\n");
8852
+ }
8836
8853
 
8837
8854
  // src/cli/agent-docs/manifest-guide.ts
8838
8855
  function generateManifestAgentGuide(options) {
8839
8856
  const { projectName } = options;
8857
+ const fieldMetamodelTable = renderMetamodelDocTable(getFieldMetamodelDocRows());
8858
+ const modelMetamodelTable = renderMetamodelDocTable(getModelMetamodelDocRows());
8859
+ const effectMetamodelTable = renderMetamodelDocTable(getEffectMetamodelDocRows());
8840
8860
  return `# Granular manifest guide (for coding agents)
8841
8861
 
8842
8862
  This guide is for **coding agents** who may have **no prior context on Granular**. It explains the product, core terms, how to **author** \`granular.json\`, **build** the domain, and use the SDK (\`connect\` \u2192 **environment**, \`recordObject\`, \`submitJob\`, **effects**). For **this repository\u2019s** exact class names, relationship keys, and effect payloads only, see [GRANULAR_SANDBOX.md](../GRANULAR_SANDBOX.md).
@@ -8942,6 +8962,66 @@ Each key under \`has\` is a **field name** on the class. Each value is a **field
8942
8962
  - Every scalar field should have \`"type": "..."\`.
8943
8963
  - Do **not** store links to other entities as opaque strings when you can use **relationships** (next section).
8944
8964
 
8965
+ ### Field metamodels
8966
+
8967
+ Scalar fields can carry lightweight metamodels directly in their field spec:
8968
+
8969
+ \`\`\`json
8970
+ {
8971
+ "create": "ticket",
8972
+ "extends": "@std/class",
8973
+ "note": "Ticket workflow object",
8974
+ "stateMachines": [
8975
+ {
8976
+ "name": "lifecycle",
8977
+ "entryState": "draft",
8978
+ "states": ["draft", "active", { "name": "done", "isFinal": true }],
8979
+ "finalStates": ["canceled"],
8980
+ "transitions": [
8981
+ { "name": "activate", "from": "draft", "to": "active" },
8982
+ { "name": "complete", "from": "active", "to": "done" },
8983
+ { "name": "cancel", "from": "draft", "to": "canceled" }
8984
+ ]
8985
+ }
8986
+ ],
8987
+ "has": {
8988
+ "title": {
8989
+ "type": "string",
8990
+ "required": true,
8991
+ "note": "Must use the canonical prefix",
8992
+ "filterBy": true,
8993
+ "validate": [
8994
+ { "operator": "regex", "stringValue": "^TKT-[A-Z0-9-]+$" }
8995
+ ]
8996
+ },
8997
+ "status": {
8998
+ "type": "string",
8999
+ "enum": {
9000
+ "values": ["draft", "active", "done", "canceled"],
9001
+ "message": "Invalid ticket status"
9002
+ },
9003
+ "filterBy": ["equal_to", "contains"]
9004
+ },
9005
+ "estimate": {
9006
+ "type": "number",
9007
+ "filterBy": true,
9008
+ "validate": [
9009
+ { "operator": "gt", "numberValue": 0 },
9010
+ { "operator": "lt", "numberValue": 100 }
9011
+ ]
9012
+ }
9013
+ }
9014
+ }
9015
+ \`\`\`
9016
+
9017
+ Supported field metamodel keys:
9018
+
9019
+ ${fieldMetamodelTable}
9020
+
9021
+ Supported model-level metamodel keys:
9022
+
9023
+ ${modelMetamodelTable}
9024
+
8945
9025
  ---
8946
9026
 
8947
9027
  ## Operations: \`defineRelationship\` (model links precisely)
@@ -9027,6 +9107,50 @@ Example:
9027
9107
 
9028
9108
  **Permissions:** \`connect({ permissions: [...] })\` assigns profiles (e.g. \`default\`) that can allow or deny which effects a user may call.
9029
9109
 
9110
+ ### Effect metamodels
9111
+
9112
+ Effects can declare runtime behaviors under \`withEffect.metamodels\`:
9113
+
9114
+ \`\`\`json
9115
+ {
9116
+ "withEffect": {
9117
+ "name": "publish_ticket",
9118
+ "attachedClass": "ticket",
9119
+ "inputSchema": {
9120
+ "type": "object",
9121
+ "properties": { "audience": { "type": "string" } }
9122
+ },
9123
+ "outputSchema": {
9124
+ "type": "object",
9125
+ "properties": { "ok": { "type": "boolean" } }
9126
+ },
9127
+ "metamodels": {
9128
+ "postCondition": {
9129
+ "condition": "result.ok == true",
9130
+ "description": "Publishing must report success"
9131
+ },
9132
+ "dryRun": {
9133
+ "enabled": true,
9134
+ "description": "Preview publishing before sending"
9135
+ },
9136
+ "reverse": {
9137
+ "handler": "unpublish_ticket",
9138
+ "description": "Undo a publication"
9139
+ },
9140
+ "approvalRequired": {
9141
+ "required": true,
9142
+ "reason": "Publishing is user-visible",
9143
+ "mode": "confirm"
9144
+ }
9145
+ }
9146
+ }
9147
+ }
9148
+ \`\`\`
9149
+
9150
+ Supported effect metamodel keys:
9151
+
9152
+ ${effectMetamodelTable}
9153
+
9030
9154
  ---
9031
9155
 
9032
9156
  ## IDs and labels
package/dist/index.d.mts CHANGED
@@ -304,6 +304,38 @@ interface EffectHandlerContext {
304
304
  identityId?: string;
305
305
  principalId?: string;
306
306
  };
307
+ behaviors?: ResolvedEffectBehaviors;
308
+ invocation?: EffectInvocationMetadata;
309
+ }
310
+ interface ResolvedEffectPostCondition {
311
+ condition: string;
312
+ description?: string;
313
+ }
314
+ interface ResolvedEffectDryRun {
315
+ enabled: boolean;
316
+ description?: string;
317
+ }
318
+ interface ResolvedEffectReverse {
319
+ handler?: string;
320
+ description?: string;
321
+ }
322
+ interface ResolvedEffectApprovalRequired {
323
+ required: boolean;
324
+ reason?: string;
325
+ mode?: string;
326
+ }
327
+ interface ResolvedEffectBehaviors {
328
+ postCondition?: ResolvedEffectPostCondition;
329
+ dryRun?: ResolvedEffectDryRun;
330
+ reverse?: ResolvedEffectReverse;
331
+ approvalRequired?: ResolvedEffectApprovalRequired;
332
+ }
333
+ type EffectInvocationMode = 'execute' | 'dryRun' | 'reverse';
334
+ interface EffectInvocationMetadata {
335
+ mode?: EffectInvocationMode;
336
+ reverseHandler?: string;
337
+ sourceEffectKey?: string;
338
+ sourceEffectName?: string;
307
339
  }
308
340
  type ToolHandler = (input: any, context: EffectHandlerContext) => Promise<unknown>;
309
341
  /**
@@ -373,6 +405,8 @@ interface ToolSchema {
373
405
  * passed as the first argument to the handler).
374
406
  */
375
407
  static?: boolean;
408
+ /** Declarative runtime behaviors attached to the effect. */
409
+ metamodels?: ManifestEffectMetamodelSpec;
376
410
  }
377
411
  type EffectSchema = ToolSchema;
378
412
  /**
@@ -387,6 +421,8 @@ type EffectSchema = ToolSchema;
387
421
  */
388
422
  interface ToolWithHandler extends ToolSchema {
389
423
  handler: ToolHandler | InstanceToolHandler;
424
+ dryRunHandler?: ToolHandler | InstanceToolHandler;
425
+ reverseHandler?: ToolHandler | InstanceToolHandler;
390
426
  }
391
427
  type EffectWithHandler = ToolWithHandler;
392
428
  /**
@@ -411,6 +447,7 @@ interface DomainState {
411
447
  description?: string;
412
448
  inputSchema?: Record<string, unknown>;
413
449
  outputSchema?: Record<string, unknown>;
450
+ metamodels?: ManifestEffectMetamodelSpec;
414
451
  }>;
415
452
  [key: string]: unknown;
416
453
  }
@@ -437,6 +474,8 @@ interface ToolInfo {
437
474
  className?: string;
438
475
  /** Whether this is a static method */
439
476
  static?: boolean;
477
+ /** Declarative runtime behaviors attached to the effect. */
478
+ metamodels?: ManifestEffectMetamodelSpec;
440
479
  }
441
480
  interface EffectInfo extends ToolInfo {
442
481
  }
@@ -795,6 +834,65 @@ interface ManifestPropertySpec {
795
834
  type?: string;
796
835
  description?: string;
797
836
  required?: boolean;
837
+ note?: string | string[];
838
+ enum?: string[] | ManifestEnumRuleSpec;
839
+ filterBy?: boolean | string[] | ManifestFilterBySpec;
840
+ validate?: ManifestValidationRuleSpec[];
841
+ }
842
+ type ManifestValidationOperator = 'eq' | 'neq' | 'gt' | 'gte' | 'lt' | 'lte' | 'true' | 'false' | 'regex' | 'contains' | 'not_contains' | 'starts_with' | 'ends_with';
843
+ interface ManifestEnumRuleSpec {
844
+ values: string[];
845
+ message?: string;
846
+ }
847
+ interface ManifestFilterBySpec {
848
+ operators: string[];
849
+ scalarType?: string;
850
+ }
851
+ interface ManifestValidationRuleSpec {
852
+ operator: ManifestValidationOperator;
853
+ stringValue?: string;
854
+ numberValue?: number;
855
+ booleanValue?: boolean;
856
+ message?: string;
857
+ }
858
+ interface ManifestStateMachineStateSpec {
859
+ name: string;
860
+ isFinal?: boolean;
861
+ }
862
+ interface ManifestStateMachineTransitionSpec {
863
+ name: string;
864
+ from: string;
865
+ to: string;
866
+ }
867
+ interface ManifestStateMachineSpec {
868
+ name: string;
869
+ entryState: string;
870
+ states: Array<string | ManifestStateMachineStateSpec>;
871
+ transitions: ManifestStateMachineTransitionSpec[];
872
+ finalStates?: string[];
873
+ }
874
+ interface ManifestPostConditionSpec {
875
+ condition: string;
876
+ description?: string;
877
+ }
878
+ interface ManifestDryRunSpec {
879
+ enabled?: boolean;
880
+ description?: string;
881
+ }
882
+ interface ManifestReverseSpec {
883
+ handler?: string;
884
+ description?: string;
885
+ }
886
+ interface ManifestApprovalRequiredSpec {
887
+ required?: boolean;
888
+ reason?: string;
889
+ mode?: string;
890
+ }
891
+ interface ManifestEffectMetamodelSpec {
892
+ postCondition?: string | ManifestPostConditionSpec;
893
+ dryRun?: boolean | ManifestDryRunSpec;
894
+ reverse?: string | ManifestReverseSpec;
895
+ approvalRequired?: boolean | ManifestApprovalRequiredSpec;
798
896
  }
799
897
  /**
800
898
  * Relationship definition between two classes
@@ -832,6 +930,7 @@ interface ManifestEffectDeclaration {
832
930
  outputSchema?: ManifestEffectSchema;
833
931
  stability?: 'stable' | 'experimental' | 'deprecated';
834
932
  tags?: string[];
933
+ metamodels?: ManifestEffectMetamodelSpec;
835
934
  }
836
935
  /**
837
936
  * A single operation in a manifest volume
@@ -847,6 +946,10 @@ interface ManifestOperation {
847
946
  instanceOf?: string;
848
947
  /** Define submodels/fields */
849
948
  has?: Record<string, ManifestPropertySpec>;
949
+ /** Advisory notes attached to the model/class itself */
950
+ note?: string | string[];
951
+ /** State machines attached to the created or targeted class */
952
+ stateMachines?: ManifestStateMachineSpec[];
850
953
  /** Define a relationship between two classes */
851
954
  defineRelationship?: ManifestRelationshipDef;
852
955
  /** Declare a build-owned effect */
@@ -1384,6 +1487,13 @@ declare class Environment extends Session {
1384
1487
  * Strips the alias prefix, returning the bare model path.
1385
1488
  */
1386
1489
  private _resolveAlias;
1490
+ private _runGraphql;
1491
+ private _applyFieldMetamodels;
1492
+ private _applyModelMetamodels;
1493
+ private _ensureWorkspaceToolsRoot;
1494
+ private _storeEffectSchemas;
1495
+ private _applyEffectMetamodels;
1496
+ private _applyEffectDeclaration;
1387
1497
  /**
1388
1498
  * Apply a single manifest operation via GraphQL
1389
1499
  */
@@ -1554,6 +1664,7 @@ declare class Granular {
1554
1664
  private serializeEffect;
1555
1665
  private publishSandboxEffectCatalog;
1556
1666
  private syncSandboxEffectCatalog;
1667
+ private recoverEffectHost;
1557
1668
  private startEffectHostHeartbeat;
1558
1669
  private stopEffectHostHeartbeat;
1559
1670
  private synchronizeEffectHost;
@@ -1656,4 +1767,13 @@ declare class Granular {
1656
1767
  private request;
1657
1768
  }
1658
1769
 
1659
- export { type APIError, type AccessTokenProvider, type Assignment, type AssignmentListResponse, type Build, type BuildListResponse, type BuildPolicy, type BuildStatus, type ConnectOptions, type CreateEnvironmentData, type CreatePermissionProfileData, type CreateSandboxData, type DefineRelationshipOptions, type DeleteResponse, type DomainState, type EffectHandler, type EffectHandlerContext, type EffectInfo, type EffectSchema, type EffectWithHandler, type EffectsChangedEvent, type EndpointMode, Environment, type EnvironmentData, type EnvironmentListResponse, type EnvironmentRecordImportSummary, Granular, type GranularAuth, type GranularOptions, type GraphQLResult, type InstanceEffectHandler, type InstanceToolHandler, type Job, type JobFeedbackInput, type JobFeedbackMetadata, type JobFeedbackRecord, type JobFeedbackSentiment, type JobFeedbackToolCall, type JobStatus, type JobSubmitResult, type Manifest, type ManifestContent, type ManifestEffectDeclaration, type ManifestEffectSchema, type ManifestImport, type ManifestListResponse, type ManifestOperation, type ManifestPropertySpec, type ManifestRelationshipDef, type ManifestVolume, type ModelRef, type PermissionProfile, type PermissionProfileListResponse, type PermissionRules, type Prompt, type PublishEffectsResult, type PublishToolsResult, type RPCRequest, type RPCRequestFromServer, type RPCResponse, type RecordImport, type RecordImportItem, type RecordImportItemStatus, type RecordImportStats, type RecordImportStatus, type RecordObjectOptions, type RecordObjectResult, type RecordUserOptions, type RelationshipInfo, type Sandbox, type SandboxListResponse, Session, type SessionHeapEntry, type SessionHeapFieldType, type SessionHeapFieldValue, type SessionHeapList, type SessionHeapSnapshot, type SessionHeapVariable, type Subject, type SyncMessage, type ToolHandler, type ToolInfo, type ToolInvokeParams, type ToolResultParams, type ToolSchema, type ToolWithHandler, type ToolsChangedEvent, type User, WSClient, type WSClientOptions, type WSDisconnectInfo, type WSReconnectErrorInfo };
1770
+ type EffectRuntimeRequest = {
1771
+ effectKey: string;
1772
+ effectName: string;
1773
+ input: unknown;
1774
+ context?: EffectHandlerContext;
1775
+ };
1776
+ declare function normalizeEffectBehaviors(value?: ManifestEffectMetamodelSpec | ResolvedEffectBehaviors | null): ResolvedEffectBehaviors;
1777
+ declare function invokeRegisteredEffect(effectMap: Map<string, ToolWithHandler>, request: EffectRuntimeRequest): Promise<unknown>;
1778
+
1779
+ export { type APIError, type AccessTokenProvider, type Assignment, type AssignmentListResponse, type Build, type BuildListResponse, type BuildPolicy, type BuildStatus, type ConnectOptions, type CreateEnvironmentData, type CreatePermissionProfileData, type CreateSandboxData, type DefineRelationshipOptions, type DeleteResponse, type DomainState, type EffectHandler, type EffectHandlerContext, type EffectInfo, type EffectInvocationMetadata, type EffectInvocationMode, type EffectSchema, type EffectWithHandler, type EffectsChangedEvent, type EndpointMode, Environment, type EnvironmentData, type EnvironmentListResponse, type EnvironmentRecordImportSummary, Granular, type GranularAuth, type GranularOptions, type GraphQLResult, type InstanceEffectHandler, type InstanceToolHandler, type Job, type JobFeedbackInput, type JobFeedbackMetadata, type JobFeedbackRecord, type JobFeedbackSentiment, type JobFeedbackToolCall, type JobStatus, type JobSubmitResult, type Manifest, type ManifestApprovalRequiredSpec, type ManifestContent, type ManifestDryRunSpec, type ManifestEffectDeclaration, type ManifestEffectMetamodelSpec, type ManifestEffectSchema, type ManifestEnumRuleSpec, type ManifestFilterBySpec, type ManifestImport, type ManifestListResponse, type ManifestOperation, type ManifestPostConditionSpec, type ManifestPropertySpec, type ManifestRelationshipDef, type ManifestReverseSpec, type ManifestStateMachineSpec, type ManifestStateMachineStateSpec, type ManifestStateMachineTransitionSpec, type ManifestValidationOperator, type ManifestValidationRuleSpec, type ManifestVolume, type ModelRef, type PermissionProfile, type PermissionProfileListResponse, type PermissionRules, type Prompt, type PublishEffectsResult, type PublishToolsResult, type RPCRequest, type RPCRequestFromServer, type RPCResponse, type RecordImport, type RecordImportItem, type RecordImportItemStatus, type RecordImportStats, type RecordImportStatus, type RecordObjectOptions, type RecordObjectResult, type RecordUserOptions, type RelationshipInfo, type ResolvedEffectApprovalRequired, type ResolvedEffectBehaviors, type ResolvedEffectDryRun, type ResolvedEffectPostCondition, type ResolvedEffectReverse, type Sandbox, type SandboxListResponse, Session, type SessionHeapEntry, type SessionHeapFieldType, type SessionHeapFieldValue, type SessionHeapList, type SessionHeapSnapshot, type SessionHeapVariable, type Subject, type SyncMessage, type ToolHandler, type ToolInfo, type ToolInvokeParams, type ToolResultParams, type ToolSchema, type ToolWithHandler, type ToolsChangedEvent, type User, WSClient, type WSClientOptions, type WSDisconnectInfo, type WSReconnectErrorInfo, invokeRegisteredEffect, normalizeEffectBehaviors };
package/dist/index.d.ts CHANGED
@@ -304,6 +304,38 @@ interface EffectHandlerContext {
304
304
  identityId?: string;
305
305
  principalId?: string;
306
306
  };
307
+ behaviors?: ResolvedEffectBehaviors;
308
+ invocation?: EffectInvocationMetadata;
309
+ }
310
+ interface ResolvedEffectPostCondition {
311
+ condition: string;
312
+ description?: string;
313
+ }
314
+ interface ResolvedEffectDryRun {
315
+ enabled: boolean;
316
+ description?: string;
317
+ }
318
+ interface ResolvedEffectReverse {
319
+ handler?: string;
320
+ description?: string;
321
+ }
322
+ interface ResolvedEffectApprovalRequired {
323
+ required: boolean;
324
+ reason?: string;
325
+ mode?: string;
326
+ }
327
+ interface ResolvedEffectBehaviors {
328
+ postCondition?: ResolvedEffectPostCondition;
329
+ dryRun?: ResolvedEffectDryRun;
330
+ reverse?: ResolvedEffectReverse;
331
+ approvalRequired?: ResolvedEffectApprovalRequired;
332
+ }
333
+ type EffectInvocationMode = 'execute' | 'dryRun' | 'reverse';
334
+ interface EffectInvocationMetadata {
335
+ mode?: EffectInvocationMode;
336
+ reverseHandler?: string;
337
+ sourceEffectKey?: string;
338
+ sourceEffectName?: string;
307
339
  }
308
340
  type ToolHandler = (input: any, context: EffectHandlerContext) => Promise<unknown>;
309
341
  /**
@@ -373,6 +405,8 @@ interface ToolSchema {
373
405
  * passed as the first argument to the handler).
374
406
  */
375
407
  static?: boolean;
408
+ /** Declarative runtime behaviors attached to the effect. */
409
+ metamodels?: ManifestEffectMetamodelSpec;
376
410
  }
377
411
  type EffectSchema = ToolSchema;
378
412
  /**
@@ -387,6 +421,8 @@ type EffectSchema = ToolSchema;
387
421
  */
388
422
  interface ToolWithHandler extends ToolSchema {
389
423
  handler: ToolHandler | InstanceToolHandler;
424
+ dryRunHandler?: ToolHandler | InstanceToolHandler;
425
+ reverseHandler?: ToolHandler | InstanceToolHandler;
390
426
  }
391
427
  type EffectWithHandler = ToolWithHandler;
392
428
  /**
@@ -411,6 +447,7 @@ interface DomainState {
411
447
  description?: string;
412
448
  inputSchema?: Record<string, unknown>;
413
449
  outputSchema?: Record<string, unknown>;
450
+ metamodels?: ManifestEffectMetamodelSpec;
414
451
  }>;
415
452
  [key: string]: unknown;
416
453
  }
@@ -437,6 +474,8 @@ interface ToolInfo {
437
474
  className?: string;
438
475
  /** Whether this is a static method */
439
476
  static?: boolean;
477
+ /** Declarative runtime behaviors attached to the effect. */
478
+ metamodels?: ManifestEffectMetamodelSpec;
440
479
  }
441
480
  interface EffectInfo extends ToolInfo {
442
481
  }
@@ -795,6 +834,65 @@ interface ManifestPropertySpec {
795
834
  type?: string;
796
835
  description?: string;
797
836
  required?: boolean;
837
+ note?: string | string[];
838
+ enum?: string[] | ManifestEnumRuleSpec;
839
+ filterBy?: boolean | string[] | ManifestFilterBySpec;
840
+ validate?: ManifestValidationRuleSpec[];
841
+ }
842
+ type ManifestValidationOperator = 'eq' | 'neq' | 'gt' | 'gte' | 'lt' | 'lte' | 'true' | 'false' | 'regex' | 'contains' | 'not_contains' | 'starts_with' | 'ends_with';
843
+ interface ManifestEnumRuleSpec {
844
+ values: string[];
845
+ message?: string;
846
+ }
847
+ interface ManifestFilterBySpec {
848
+ operators: string[];
849
+ scalarType?: string;
850
+ }
851
+ interface ManifestValidationRuleSpec {
852
+ operator: ManifestValidationOperator;
853
+ stringValue?: string;
854
+ numberValue?: number;
855
+ booleanValue?: boolean;
856
+ message?: string;
857
+ }
858
+ interface ManifestStateMachineStateSpec {
859
+ name: string;
860
+ isFinal?: boolean;
861
+ }
862
+ interface ManifestStateMachineTransitionSpec {
863
+ name: string;
864
+ from: string;
865
+ to: string;
866
+ }
867
+ interface ManifestStateMachineSpec {
868
+ name: string;
869
+ entryState: string;
870
+ states: Array<string | ManifestStateMachineStateSpec>;
871
+ transitions: ManifestStateMachineTransitionSpec[];
872
+ finalStates?: string[];
873
+ }
874
+ interface ManifestPostConditionSpec {
875
+ condition: string;
876
+ description?: string;
877
+ }
878
+ interface ManifestDryRunSpec {
879
+ enabled?: boolean;
880
+ description?: string;
881
+ }
882
+ interface ManifestReverseSpec {
883
+ handler?: string;
884
+ description?: string;
885
+ }
886
+ interface ManifestApprovalRequiredSpec {
887
+ required?: boolean;
888
+ reason?: string;
889
+ mode?: string;
890
+ }
891
+ interface ManifestEffectMetamodelSpec {
892
+ postCondition?: string | ManifestPostConditionSpec;
893
+ dryRun?: boolean | ManifestDryRunSpec;
894
+ reverse?: string | ManifestReverseSpec;
895
+ approvalRequired?: boolean | ManifestApprovalRequiredSpec;
798
896
  }
799
897
  /**
800
898
  * Relationship definition between two classes
@@ -832,6 +930,7 @@ interface ManifestEffectDeclaration {
832
930
  outputSchema?: ManifestEffectSchema;
833
931
  stability?: 'stable' | 'experimental' | 'deprecated';
834
932
  tags?: string[];
933
+ metamodels?: ManifestEffectMetamodelSpec;
835
934
  }
836
935
  /**
837
936
  * A single operation in a manifest volume
@@ -847,6 +946,10 @@ interface ManifestOperation {
847
946
  instanceOf?: string;
848
947
  /** Define submodels/fields */
849
948
  has?: Record<string, ManifestPropertySpec>;
949
+ /** Advisory notes attached to the model/class itself */
950
+ note?: string | string[];
951
+ /** State machines attached to the created or targeted class */
952
+ stateMachines?: ManifestStateMachineSpec[];
850
953
  /** Define a relationship between two classes */
851
954
  defineRelationship?: ManifestRelationshipDef;
852
955
  /** Declare a build-owned effect */
@@ -1384,6 +1487,13 @@ declare class Environment extends Session {
1384
1487
  * Strips the alias prefix, returning the bare model path.
1385
1488
  */
1386
1489
  private _resolveAlias;
1490
+ private _runGraphql;
1491
+ private _applyFieldMetamodels;
1492
+ private _applyModelMetamodels;
1493
+ private _ensureWorkspaceToolsRoot;
1494
+ private _storeEffectSchemas;
1495
+ private _applyEffectMetamodels;
1496
+ private _applyEffectDeclaration;
1387
1497
  /**
1388
1498
  * Apply a single manifest operation via GraphQL
1389
1499
  */
@@ -1554,6 +1664,7 @@ declare class Granular {
1554
1664
  private serializeEffect;
1555
1665
  private publishSandboxEffectCatalog;
1556
1666
  private syncSandboxEffectCatalog;
1667
+ private recoverEffectHost;
1557
1668
  private startEffectHostHeartbeat;
1558
1669
  private stopEffectHostHeartbeat;
1559
1670
  private synchronizeEffectHost;
@@ -1656,4 +1767,13 @@ declare class Granular {
1656
1767
  private request;
1657
1768
  }
1658
1769
 
1659
- export { type APIError, type AccessTokenProvider, type Assignment, type AssignmentListResponse, type Build, type BuildListResponse, type BuildPolicy, type BuildStatus, type ConnectOptions, type CreateEnvironmentData, type CreatePermissionProfileData, type CreateSandboxData, type DefineRelationshipOptions, type DeleteResponse, type DomainState, type EffectHandler, type EffectHandlerContext, type EffectInfo, type EffectSchema, type EffectWithHandler, type EffectsChangedEvent, type EndpointMode, Environment, type EnvironmentData, type EnvironmentListResponse, type EnvironmentRecordImportSummary, Granular, type GranularAuth, type GranularOptions, type GraphQLResult, type InstanceEffectHandler, type InstanceToolHandler, type Job, type JobFeedbackInput, type JobFeedbackMetadata, type JobFeedbackRecord, type JobFeedbackSentiment, type JobFeedbackToolCall, type JobStatus, type JobSubmitResult, type Manifest, type ManifestContent, type ManifestEffectDeclaration, type ManifestEffectSchema, type ManifestImport, type ManifestListResponse, type ManifestOperation, type ManifestPropertySpec, type ManifestRelationshipDef, type ManifestVolume, type ModelRef, type PermissionProfile, type PermissionProfileListResponse, type PermissionRules, type Prompt, type PublishEffectsResult, type PublishToolsResult, type RPCRequest, type RPCRequestFromServer, type RPCResponse, type RecordImport, type RecordImportItem, type RecordImportItemStatus, type RecordImportStats, type RecordImportStatus, type RecordObjectOptions, type RecordObjectResult, type RecordUserOptions, type RelationshipInfo, type Sandbox, type SandboxListResponse, Session, type SessionHeapEntry, type SessionHeapFieldType, type SessionHeapFieldValue, type SessionHeapList, type SessionHeapSnapshot, type SessionHeapVariable, type Subject, type SyncMessage, type ToolHandler, type ToolInfo, type ToolInvokeParams, type ToolResultParams, type ToolSchema, type ToolWithHandler, type ToolsChangedEvent, type User, WSClient, type WSClientOptions, type WSDisconnectInfo, type WSReconnectErrorInfo };
1770
+ type EffectRuntimeRequest = {
1771
+ effectKey: string;
1772
+ effectName: string;
1773
+ input: unknown;
1774
+ context?: EffectHandlerContext;
1775
+ };
1776
+ declare function normalizeEffectBehaviors(value?: ManifestEffectMetamodelSpec | ResolvedEffectBehaviors | null): ResolvedEffectBehaviors;
1777
+ declare function invokeRegisteredEffect(effectMap: Map<string, ToolWithHandler>, request: EffectRuntimeRequest): Promise<unknown>;
1778
+
1779
+ export { type APIError, type AccessTokenProvider, type Assignment, type AssignmentListResponse, type Build, type BuildListResponse, type BuildPolicy, type BuildStatus, type ConnectOptions, type CreateEnvironmentData, type CreatePermissionProfileData, type CreateSandboxData, type DefineRelationshipOptions, type DeleteResponse, type DomainState, type EffectHandler, type EffectHandlerContext, type EffectInfo, type EffectInvocationMetadata, type EffectInvocationMode, type EffectSchema, type EffectWithHandler, type EffectsChangedEvent, type EndpointMode, Environment, type EnvironmentData, type EnvironmentListResponse, type EnvironmentRecordImportSummary, Granular, type GranularAuth, type GranularOptions, type GraphQLResult, type InstanceEffectHandler, type InstanceToolHandler, type Job, type JobFeedbackInput, type JobFeedbackMetadata, type JobFeedbackRecord, type JobFeedbackSentiment, type JobFeedbackToolCall, type JobStatus, type JobSubmitResult, type Manifest, type ManifestApprovalRequiredSpec, type ManifestContent, type ManifestDryRunSpec, type ManifestEffectDeclaration, type ManifestEffectMetamodelSpec, type ManifestEffectSchema, type ManifestEnumRuleSpec, type ManifestFilterBySpec, type ManifestImport, type ManifestListResponse, type ManifestOperation, type ManifestPostConditionSpec, type ManifestPropertySpec, type ManifestRelationshipDef, type ManifestReverseSpec, type ManifestStateMachineSpec, type ManifestStateMachineStateSpec, type ManifestStateMachineTransitionSpec, type ManifestValidationOperator, type ManifestValidationRuleSpec, type ManifestVolume, type ModelRef, type PermissionProfile, type PermissionProfileListResponse, type PermissionRules, type Prompt, type PublishEffectsResult, type PublishToolsResult, type RPCRequest, type RPCRequestFromServer, type RPCResponse, type RecordImport, type RecordImportItem, type RecordImportItemStatus, type RecordImportStats, type RecordImportStatus, type RecordObjectOptions, type RecordObjectResult, type RecordUserOptions, type RelationshipInfo, type ResolvedEffectApprovalRequired, type ResolvedEffectBehaviors, type ResolvedEffectDryRun, type ResolvedEffectPostCondition, type ResolvedEffectReverse, type Sandbox, type SandboxListResponse, Session, type SessionHeapEntry, type SessionHeapFieldType, type SessionHeapFieldValue, type SessionHeapList, type SessionHeapSnapshot, type SessionHeapVariable, type Subject, type SyncMessage, type ToolHandler, type ToolInfo, type ToolInvokeParams, type ToolResultParams, type ToolSchema, type ToolWithHandler, type ToolsChangedEvent, type User, WSClient, type WSClientOptions, type WSDisconnectInfo, type WSReconnectErrorInfo, invokeRegisteredEffect, normalizeEffectBehaviors };