@vess-id/ai-identity 0.14.0 → 0.15.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 (29) hide show
  1. package/dist/index.d.mts +5640 -53
  2. package/dist/index.js +927 -11
  3. package/dist/index.js.map +1 -1
  4. package/dist/index.mjs +926 -11
  5. package/dist/index.mjs.map +1 -1
  6. package/dist/registry/__tests__/action-input-validator.spec.d.ts +10 -0
  7. package/dist/registry/__tests__/action-input-validator.spec.d.ts.map +1 -0
  8. package/dist/registry/__tests__/action-registry-inbox.spec.d.ts +9 -0
  9. package/dist/registry/__tests__/action-registry-inbox.spec.d.ts.map +1 -0
  10. package/dist/registry/__tests__/action-registry-scheduling.spec.d.ts +13 -0
  11. package/dist/registry/__tests__/action-registry-scheduling.spec.d.ts.map +1 -0
  12. package/dist/registry/__tests__/guidance-examples.spec.d.ts +2 -0
  13. package/dist/registry/__tests__/guidance-examples.spec.d.ts.map +1 -0
  14. package/dist/registry/action-input-validator.d.ts +19 -0
  15. package/dist/registry/action-input-validator.d.ts.map +1 -0
  16. package/dist/registry/action-registry-json.d.ts +5578 -45
  17. package/dist/registry/action-registry-json.d.ts.map +1 -1
  18. package/dist/registry/action-summary.d.ts.map +1 -1
  19. package/dist/registry/index.d.ts +2 -0
  20. package/dist/registry/index.d.ts.map +1 -1
  21. package/dist/registry/providers.d.ts +1 -1
  22. package/dist/registry/providers.d.ts.map +1 -1
  23. package/dist/registry/resource-types.d.ts +7 -0
  24. package/dist/registry/resource-types.d.ts.map +1 -1
  25. package/dist/types/connector-plugin.d.ts +21 -0
  26. package/dist/types/connector-plugin.d.ts.map +1 -1
  27. package/dist/types/grant.d.ts +7 -0
  28. package/dist/types/grant.d.ts.map +1 -1
  29. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -164,6 +164,7 @@ __export(index_exports, {
164
164
  sha256Hex: () => sha256Hex,
165
165
  signJWT: () => signJWT,
166
166
  signRequest: () => signRequest,
167
+ validateActionInput: () => validateActionInput,
167
168
  validateRegistryObject: () => validateRegistryObject,
168
169
  vcStatusToCredentialStatus: () => vcStatusToCredentialStatus,
169
170
  verifyJWT: () => verifyJWT,
@@ -2926,6 +2927,13 @@ var GrantResourceType = /* @__PURE__ */ ((GrantResourceType2) => {
2926
2927
  GrantResourceType2["JIRA_PROJECT"] = "jira:project";
2927
2928
  GrantResourceType2["JIRA_BOARD"] = "jira:board";
2928
2929
  GrantResourceType2["JIRA_ISSUE"] = "jira:issue";
2930
+ GrantResourceType2["HUBSPOT_OBJECT"] = "hubspot:object";
2931
+ GrantResourceType2["HUBSPOT_PROPERTY"] = "hubspot:property";
2932
+ GrantResourceType2["HUBSPOT_SCHEMA"] = "hubspot:schema";
2933
+ GrantResourceType2["HUBSPOT_ASSOCIATION"] = "hubspot:association";
2934
+ GrantResourceType2["HUBSPOT_ENGAGEMENT"] = "hubspot:engagement";
2935
+ GrantResourceType2["HUBSPOT_WORKFLOW"] = "hubspot:workflow";
2936
+ GrantResourceType2["HUBSPOT_ACCOUNT"] = "hubspot:account";
2929
2937
  GrantResourceType2["OS_SECRET"] = "os:secret";
2930
2938
  GrantResourceType2["ANY"] = "*";
2931
2939
  return GrantResourceType2;
@@ -4259,6 +4267,7 @@ var CANONICAL_PROVIDERS = [
4259
4267
  "gmail",
4260
4268
  "calendar",
4261
4269
  "jira",
4270
+ "hubspot",
4262
4271
  "os"
4263
4272
  ];
4264
4273
  var PROVIDER_ALIASES = {};
@@ -4502,6 +4511,15 @@ var DummyVpVerifier = class {
4502
4511
  var ACTION_REGISTRY = {
4503
4512
  registry_version: "2025-09-28",
4504
4513
  actions: [
4514
+ // ─── Resource binding principle (high-risk CREATE actions) ───
4515
+ // A high-risk CREATE action's target_bindings.resource_id MUST bind to the
4516
+ // container/parent that already exists at approval + invoke time — never to
4517
+ // the not-yet-created resource's id (which does not exist until after the
4518
+ // call and is absent from input_schema). Cedar must resolve the resource at
4519
+ // evaluation time, and the server enforces a specific non-wildcard target,
4520
+ // so an unresolvable binding makes the action impossible to approve.
4521
+ // Examples: slack.message.post → channel, jira.issue.create → projectKey,
4522
+ // hubspot objects.batchCreate → objectType, engagements.create → type.
4505
4523
  // ─── Slack Actions ───
4506
4524
  {
4507
4525
  action: "slack.message.post",
@@ -4701,15 +4719,21 @@ var ACTION_REGISTRY = {
4701
4719
  required_relations: ["editor", "act_as"],
4702
4720
  required_scopes: ["repo", "write:issues"],
4703
4721
  capability: "github.issues.triage",
4722
+ // Schema mirrors the server contract (GitHubConnectorAdapter
4723
+ // getSupportedActions inputSchema — packages/api/src/tool/adapters/
4724
+ // github.adapter.ts): owner/repo are required params.
4704
4725
  input_schema: {
4705
4726
  type: "object",
4706
4727
  properties: {
4728
+ owner: { type: "string", minLength: 1, description: "Repository owner (username or organization)" },
4729
+ repo: { type: "string", minLength: 1, description: "Repository name" },
4707
4730
  title: { type: "string", minLength: 1 },
4708
4731
  body: { type: "string" },
4709
4732
  labels: { type: "array", items: { type: "string" } },
4710
- assignees: { type: "array", items: { type: "string" } }
4733
+ assignees: { type: "array", items: { type: "string" } },
4734
+ milestone: { type: "integer", minimum: 1, description: "Milestone number to associate with the issue" }
4711
4735
  },
4712
- required: ["title"],
4736
+ required: ["owner", "repo", "title"],
4713
4737
  additionalProperties: false
4714
4738
  },
4715
4739
  constraints: { rate_bucket: "github.write" },
@@ -4726,9 +4750,13 @@ var ACTION_REGISTRY = {
4726
4750
  required_relations: ["viewer", "editor", "admin", "owner"],
4727
4751
  required_scopes: ["repo", "read:issues"],
4728
4752
  capability: "github.read.basic",
4753
+ // Schema mirrors the server contract (GitHubConnectorAdapter):
4754
+ // owner/repo are required params.
4729
4755
  input_schema: {
4730
4756
  type: "object",
4731
4757
  properties: {
4758
+ owner: { type: "string", minLength: 1, description: "Repository owner (username or organization)" },
4759
+ repo: { type: "string", minLength: 1, description: "Repository name" },
4732
4760
  state: { type: "string", enum: ["open", "closed", "all"] },
4733
4761
  labels: { type: "string" },
4734
4762
  sort: { type: "string", enum: ["created", "updated", "comments"] },
@@ -4736,6 +4764,7 @@ var ACTION_REGISTRY = {
4736
4764
  per_page: { type: "integer", minimum: 1, maximum: 100 },
4737
4765
  page: { type: "integer", minimum: 1 }
4738
4766
  },
4767
+ required: ["owner", "repo"],
4739
4768
  additionalProperties: false
4740
4769
  },
4741
4770
  constraints: { rate_bucket: "github.read" },
@@ -4752,12 +4781,17 @@ var ACTION_REGISTRY = {
4752
4781
  required_relations: ["viewer", "editor", "admin", "owner"],
4753
4782
  required_scopes: ["repo", "read:issues"],
4754
4783
  capability: "github.read.basic",
4784
+ // Schema mirrors the server contract (GitHubConnectorAdapter):
4785
+ // owner/repo required, camelCase issueNumber (the adapter reads
4786
+ // params.issueNumber — snake_case issue_number was a drift).
4755
4787
  input_schema: {
4756
4788
  type: "object",
4757
4789
  properties: {
4758
- issue_number: { type: "integer", minimum: 1 }
4790
+ owner: { type: "string", minLength: 1, description: "Repository owner (username or organization)" },
4791
+ repo: { type: "string", minLength: 1, description: "Repository name" },
4792
+ issueNumber: { type: "integer", minimum: 1, description: "Issue number" }
4759
4793
  },
4760
- required: ["issue_number"],
4794
+ required: ["owner", "repo", "issueNumber"],
4761
4795
  additionalProperties: false
4762
4796
  },
4763
4797
  constraints: { rate_bucket: "github.read" },
@@ -4774,17 +4808,22 @@ var ACTION_REGISTRY = {
4774
4808
  required_relations: ["editor", "act_as"],
4775
4809
  required_scopes: ["repo", "write:issues"],
4776
4810
  capability: "github.issues.triage",
4811
+ // Schema mirrors the server contract (GitHubConnectorAdapter):
4812
+ // owner/repo required, camelCase issueNumber (the adapter reads
4813
+ // params.issueNumber — snake_case issue_number was a drift).
4777
4814
  input_schema: {
4778
4815
  type: "object",
4779
4816
  properties: {
4780
- issue_number: { type: "integer", minimum: 1 },
4817
+ owner: { type: "string", minLength: 1, description: "Repository owner (username or organization)" },
4818
+ repo: { type: "string", minLength: 1, description: "Repository name" },
4819
+ issueNumber: { type: "integer", minimum: 1, description: "Issue number to update" },
4781
4820
  title: { type: "string" },
4782
4821
  body: { type: "string" },
4783
4822
  state: { type: "string", enum: ["open", "closed"] },
4784
4823
  labels: { type: "array", items: { type: "string" } },
4785
4824
  assignees: { type: "array", items: { type: "string" } }
4786
4825
  },
4787
- required: ["issue_number"],
4826
+ required: ["owner", "repo", "issueNumber"],
4788
4827
  additionalProperties: false
4789
4828
  },
4790
4829
  constraints: { rate_bucket: "github.write" },
@@ -5076,7 +5115,9 @@ var ACTION_REGISTRY = {
5076
5115
  }
5077
5116
  },
5078
5117
  attendees: { type: "array", description: "List of attendee objects with email field", items: { type: "object", properties: { email: { type: "string" } } } },
5079
- location: { type: "string", description: "Event location" }
5118
+ location: { type: "string", description: "Event location" },
5119
+ addMeet: { type: "boolean", description: "Opt-in: attach a Google Meet link (default: false)" },
5120
+ meetRequestId: { type: "string", description: "Stable idempotency key for the Meet request (used only when addMeet is true)" }
5080
5121
  },
5081
5122
  required: ["summary", "start", "end"],
5082
5123
  additionalProperties: false
@@ -5124,7 +5165,9 @@ var ACTION_REGISTRY = {
5124
5165
  }
5125
5166
  },
5126
5167
  attendees: { type: "array", description: "List of attendee objects with email field", items: { type: "object", properties: { email: { type: "string" } } } },
5127
- location: { type: "string", description: "Event location" }
5168
+ location: { type: "string", description: "Event location" },
5169
+ addMeet: { type: "boolean", description: "Opt-in: attach a Google Meet link (default: false)" },
5170
+ meetRequestId: { type: "string", description: "Stable idempotency key for the Meet request (used only when addMeet is true)" }
5128
5171
  },
5129
5172
  required: ["eventId"],
5130
5173
  additionalProperties: false
@@ -5332,7 +5375,13 @@ var ACTION_REGISTRY = {
5332
5375
  properties: {
5333
5376
  projectKey: { type: "string", minLength: 1 },
5334
5377
  summary: { type: "string", minLength: 1 },
5335
- description: { type: "string" },
5378
+ description: {
5379
+ oneOf: [
5380
+ { type: "string", description: "Plain text description." },
5381
+ { type: "object", description: 'ADF document object for rich formatting: {type:"doc", version:1, content:[...]}.' }
5382
+ ],
5383
+ description: 'Issue description. Pass a plain string, OR an ADF document object ({type:"doc",version:1,content:[...]}) for rich formatting (headings, lists, code, links).'
5384
+ },
5336
5385
  issueTypeName: { type: "string", minLength: 1, description: "Issue type name (default: Task)" },
5337
5386
  priority: { type: "string" },
5338
5387
  assigneeAccountId: { type: "string" },
@@ -5360,7 +5409,13 @@ var ACTION_REGISTRY = {
5360
5409
  properties: {
5361
5410
  issueIdOrKey: { type: "string", minLength: 1 },
5362
5411
  summary: { type: "string" },
5363
- description: { type: "string" },
5412
+ description: {
5413
+ oneOf: [
5414
+ { type: "string", description: "Plain text description." },
5415
+ { type: "object", description: 'ADF document object for rich formatting: {type:"doc", version:1, content:[...]}.' }
5416
+ ],
5417
+ description: 'Issue description. Pass a plain string, OR an ADF document object ({type:"doc",version:1,content:[...]}) for rich formatting (headings, lists, code, links).'
5418
+ },
5364
5419
  priority: { type: "string" },
5365
5420
  assigneeAccountId: { type: "string" },
5366
5421
  labels: { type: "array", items: { type: "string" } }
@@ -5408,7 +5463,13 @@ var ACTION_REGISTRY = {
5408
5463
  type: "object",
5409
5464
  properties: {
5410
5465
  issueIdOrKey: { type: "string", minLength: 1 },
5411
- body: { type: "string", minLength: 1 }
5466
+ body: {
5467
+ oneOf: [
5468
+ { type: "string", minLength: 1, description: "Plain text comment body." },
5469
+ { type: "object", description: 'ADF document object for rich formatting: {type:"doc", version:1, content:[...]}.' }
5470
+ ],
5471
+ description: 'Comment body. Pass a plain string, OR an ADF document object ({type:"doc",version:1,content:[...]}) for rich formatting (headings, lists, code, links).'
5472
+ }
5412
5473
  },
5413
5474
  required: ["issueIdOrKey", "body"],
5414
5475
  additionalProperties: false
@@ -5664,6 +5725,665 @@ var ACTION_REGISTRY = {
5664
5725
  resource_id: { source: "param", param: "command" }
5665
5726
  },
5666
5727
  version: "1.0.0"
5728
+ },
5729
+ // ─── HubSpot CRM Objects (objectType 汎用) ───
5730
+ // 公式 MCP (@hubspot/mcp-server) のツール集合を写像。object 系は objectType
5731
+ // パラメータ化された汎用エンドポイント。scope は objectType ごとに HubSpot 側で
5732
+ // 実行時強制されるため、required_scopes には代表 scope を宣言する (実際の許可範囲は
5733
+ // DEFAULT_SCOPES の固定 union)。
5734
+ {
5735
+ action: "hubspot.crm.objects.list",
5736
+ resource_type: "hubspot:object",
5737
+ required_relations: ["viewer", "editor", "admin", "owner"],
5738
+ required_scopes: ["crm.objects.contacts.read"],
5739
+ capability: "hubspot.crm.read",
5740
+ input_schema: {
5741
+ type: "object",
5742
+ properties: {
5743
+ objectType: { type: "string", description: "CRM object type (e.g. contacts, companies, deals) or custom object type ID" },
5744
+ limit: { type: "integer", minimum: 1, maximum: 100 },
5745
+ after: { type: "string" },
5746
+ properties: { type: "array", items: { type: "string" } },
5747
+ archived: { type: "boolean" }
5748
+ },
5749
+ required: ["objectType"],
5750
+ additionalProperties: false
5751
+ },
5752
+ constraints: { rate_bucket: "hubspot.read" },
5753
+ effects: ["Read:CrmObject"],
5754
+ risk: "low",
5755
+ target_bindings: {
5756
+ resource_id: { source: "param", param: "objectType" }
5757
+ },
5758
+ version: "1.0.0"
5759
+ },
5760
+ {
5761
+ action: "hubspot.crm.objects.search",
5762
+ resource_type: "hubspot:object",
5763
+ required_relations: ["viewer", "editor", "admin", "owner"],
5764
+ required_scopes: ["crm.objects.contacts.read"],
5765
+ capability: "hubspot.crm.read",
5766
+ input_schema: {
5767
+ type: "object",
5768
+ properties: {
5769
+ objectType: { type: "string", description: "CRM object type or custom object type ID" },
5770
+ query: { type: "string", maxLength: 3e3 },
5771
+ filterGroups: { type: "array" },
5772
+ properties: { type: "array", items: { type: "string" } },
5773
+ sorts: { type: "array", items: { type: "string" } },
5774
+ limit: { type: "integer", minimum: 1, maximum: 100 },
5775
+ after: { type: "string" }
5776
+ },
5777
+ required: ["objectType"],
5778
+ additionalProperties: false
5779
+ },
5780
+ constraints: { rate_bucket: "hubspot.read" },
5781
+ effects: ["Read:CrmObject"],
5782
+ risk: "low",
5783
+ target_bindings: {
5784
+ resource_id: { source: "param", param: "objectType" }
5785
+ },
5786
+ version: "1.0.0"
5787
+ },
5788
+ {
5789
+ action: "hubspot.crm.objects.batchRead",
5790
+ resource_type: "hubspot:object",
5791
+ required_relations: ["viewer", "editor", "admin", "owner"],
5792
+ required_scopes: ["crm.objects.contacts.read"],
5793
+ capability: "hubspot.crm.read",
5794
+ input_schema: {
5795
+ type: "object",
5796
+ properties: {
5797
+ objectType: { type: "string", description: "CRM object type or custom object type ID" },
5798
+ inputs: {
5799
+ type: "array",
5800
+ minItems: 1,
5801
+ items: { type: "object", properties: { id: { type: "string" } }, required: ["id"], additionalProperties: false }
5802
+ },
5803
+ properties: { type: "array", items: { type: "string" } },
5804
+ idProperty: { type: "string" }
5805
+ },
5806
+ required: ["objectType", "inputs"],
5807
+ additionalProperties: false
5808
+ },
5809
+ constraints: { rate_bucket: "hubspot.read" },
5810
+ effects: ["Read:CrmObject"],
5811
+ risk: "low",
5812
+ target_bindings: {
5813
+ resource_id: { source: "param", param: "objectType" }
5814
+ },
5815
+ version: "1.0.0"
5816
+ },
5817
+ {
5818
+ action: "hubspot.crm.objects.batchCreate",
5819
+ resource_type: "hubspot:object",
5820
+ required_relations: ["editor", "act_as"],
5821
+ required_scopes: ["crm.objects.contacts.write"],
5822
+ capability: "hubspot.crm.write",
5823
+ input_schema: {
5824
+ type: "object",
5825
+ properties: {
5826
+ objectType: { type: "string", description: "CRM object type or custom object type ID" },
5827
+ inputs: {
5828
+ type: "array",
5829
+ minItems: 1,
5830
+ items: {
5831
+ type: "object",
5832
+ properties: { properties: { type: "object" }, associations: { type: "array" } },
5833
+ required: ["properties"],
5834
+ additionalProperties: false
5835
+ }
5836
+ }
5837
+ },
5838
+ required: ["objectType", "inputs"],
5839
+ additionalProperties: false
5840
+ },
5841
+ constraints: { rate_bucket: "hubspot.write" },
5842
+ effects: ["Create:CrmObject"],
5843
+ risk: "high",
5844
+ target_bindings: {
5845
+ resource_id: { source: "param", param: "objectType" }
5846
+ },
5847
+ version: "1.0.0"
5848
+ },
5849
+ {
5850
+ action: "hubspot.crm.objects.batchUpdate",
5851
+ resource_type: "hubspot:object",
5852
+ required_relations: ["editor", "act_as"],
5853
+ required_scopes: ["crm.objects.contacts.write"],
5854
+ capability: "hubspot.crm.write",
5855
+ input_schema: {
5856
+ type: "object",
5857
+ properties: {
5858
+ objectType: { type: "string", description: "CRM object type or custom object type ID" },
5859
+ inputs: {
5860
+ type: "array",
5861
+ minItems: 1,
5862
+ items: {
5863
+ type: "object",
5864
+ properties: { id: { type: "string" }, properties: { type: "object" } },
5865
+ required: ["id", "properties"],
5866
+ additionalProperties: false
5867
+ }
5868
+ }
5869
+ },
5870
+ required: ["objectType", "inputs"],
5871
+ additionalProperties: false
5872
+ },
5873
+ constraints: { rate_bucket: "hubspot.write" },
5874
+ effects: ["Update:CrmObject"],
5875
+ risk: "high",
5876
+ target_bindings: {
5877
+ resource_id: { source: "param", param: "objectType" }
5878
+ },
5879
+ version: "1.0.0"
5880
+ },
5881
+ {
5882
+ action: "hubspot.crm.schemas.get",
5883
+ resource_type: "hubspot:schema",
5884
+ required_relations: ["viewer", "editor", "admin", "owner"],
5885
+ required_scopes: ["crm.schemas.custom.read"],
5886
+ capability: "hubspot.crm.read",
5887
+ input_schema: {
5888
+ type: "object",
5889
+ properties: {},
5890
+ additionalProperties: false
5891
+ },
5892
+ constraints: { rate_bucket: "hubspot.read" },
5893
+ effects: ["Read:CrmSchema"],
5894
+ risk: "low",
5895
+ target_bindings: {
5896
+ resource_id: { source: "param", param: "objectType", required: false }
5897
+ },
5898
+ version: "1.0.0"
5899
+ },
5900
+ // ─── HubSpot Properties ───
5901
+ {
5902
+ action: "hubspot.crm.properties.list",
5903
+ resource_type: "hubspot:property",
5904
+ required_relations: ["viewer", "editor", "admin", "owner"],
5905
+ required_scopes: ["crm.schemas.contacts.read"],
5906
+ capability: "hubspot.crm.read",
5907
+ input_schema: {
5908
+ type: "object",
5909
+ properties: {
5910
+ objectType: { type: "string", description: "CRM object type or custom object type ID" },
5911
+ archived: { type: "boolean" }
5912
+ },
5913
+ required: ["objectType"],
5914
+ additionalProperties: false
5915
+ },
5916
+ constraints: { rate_bucket: "hubspot.read" },
5917
+ effects: ["Read:CrmProperty"],
5918
+ risk: "low",
5919
+ target_bindings: { resource_id: { source: "param", param: "objectType" } },
5920
+ version: "1.0.0"
5921
+ },
5922
+ {
5923
+ action: "hubspot.crm.properties.get",
5924
+ resource_type: "hubspot:property",
5925
+ required_relations: ["viewer", "editor", "admin", "owner"],
5926
+ required_scopes: ["crm.schemas.contacts.read"],
5927
+ capability: "hubspot.crm.read",
5928
+ input_schema: {
5929
+ type: "object",
5930
+ properties: {
5931
+ objectType: { type: "string", description: "CRM object type or custom object type ID" },
5932
+ propertyName: { type: "string", description: "Internal property name" }
5933
+ },
5934
+ required: ["objectType", "propertyName"],
5935
+ additionalProperties: false
5936
+ },
5937
+ constraints: { rate_bucket: "hubspot.read" },
5938
+ effects: ["Read:CrmProperty"],
5939
+ risk: "low",
5940
+ target_bindings: { resource_id: { source: "param", param: "objectType" } },
5941
+ version: "1.0.0"
5942
+ },
5943
+ {
5944
+ action: "hubspot.crm.properties.create",
5945
+ resource_type: "hubspot:property",
5946
+ required_relations: ["editor", "act_as"],
5947
+ required_scopes: ["crm.schemas.contacts.write"],
5948
+ capability: "hubspot.crm.write",
5949
+ input_schema: {
5950
+ type: "object",
5951
+ properties: {
5952
+ objectType: { type: "string", description: "CRM object type or custom object type ID" },
5953
+ name: { type: "string" },
5954
+ label: { type: "string" },
5955
+ type: { type: "string" },
5956
+ fieldType: { type: "string" },
5957
+ groupName: { type: "string" },
5958
+ description: { type: "string" },
5959
+ options: { type: "array" }
5960
+ },
5961
+ required: ["objectType", "name", "label", "type", "fieldType", "groupName"],
5962
+ additionalProperties: false
5963
+ },
5964
+ constraints: { rate_bucket: "hubspot.write" },
5965
+ effects: ["Create:CrmProperty"],
5966
+ risk: "high",
5967
+ target_bindings: { resource_id: { source: "param", param: "objectType" } },
5968
+ version: "1.0.0"
5969
+ },
5970
+ {
5971
+ action: "hubspot.crm.properties.update",
5972
+ resource_type: "hubspot:property",
5973
+ required_relations: ["editor", "act_as"],
5974
+ required_scopes: ["crm.schemas.contacts.write"],
5975
+ capability: "hubspot.crm.write",
5976
+ input_schema: {
5977
+ type: "object",
5978
+ properties: {
5979
+ objectType: { type: "string", description: "CRM object type or custom object type ID" },
5980
+ propertyName: { type: "string" },
5981
+ label: { type: "string" },
5982
+ type: { type: "string" },
5983
+ fieldType: { type: "string" },
5984
+ groupName: { type: "string" },
5985
+ description: { type: "string" },
5986
+ options: { type: "array" }
5987
+ },
5988
+ required: ["objectType", "propertyName"],
5989
+ additionalProperties: false
5990
+ },
5991
+ constraints: { rate_bucket: "hubspot.write" },
5992
+ effects: ["Update:CrmProperty"],
5993
+ risk: "high",
5994
+ target_bindings: { resource_id: { source: "param", param: "objectType" } },
5995
+ version: "1.0.0"
5996
+ },
5997
+ // ─── HubSpot Associations (v4) ───
5998
+ {
5999
+ action: "hubspot.crm.associations.list",
6000
+ resource_type: "hubspot:association",
6001
+ required_relations: ["viewer", "editor", "admin", "owner"],
6002
+ required_scopes: ["crm.objects.contacts.read"],
6003
+ capability: "hubspot.crm.read",
6004
+ input_schema: {
6005
+ type: "object",
6006
+ properties: {
6007
+ objectType: { type: "string" },
6008
+ objectId: { type: "string" },
6009
+ toObjectType: { type: "string" },
6010
+ after: { type: "string" },
6011
+ limit: { type: "integer", minimum: 1, maximum: 100 }
6012
+ },
6013
+ required: ["objectType", "objectId", "toObjectType"],
6014
+ additionalProperties: false
6015
+ },
6016
+ constraints: { rate_bucket: "hubspot.read" },
6017
+ effects: ["Read:CrmAssociation"],
6018
+ risk: "low",
6019
+ target_bindings: { resource_id: { source: "param", param: "objectType" } },
6020
+ version: "1.0.0"
6021
+ },
6022
+ {
6023
+ action: "hubspot.crm.associations.getDefinitions",
6024
+ resource_type: "hubspot:association",
6025
+ required_relations: ["viewer", "editor", "admin", "owner"],
6026
+ required_scopes: ["crm.objects.contacts.read"],
6027
+ capability: "hubspot.crm.read",
6028
+ input_schema: {
6029
+ type: "object",
6030
+ properties: {
6031
+ fromObjectType: { type: "string" },
6032
+ toObjectType: { type: "string" }
6033
+ },
6034
+ required: ["fromObjectType", "toObjectType"],
6035
+ additionalProperties: false
6036
+ },
6037
+ constraints: { rate_bucket: "hubspot.read" },
6038
+ effects: ["Read:CrmAssociation"],
6039
+ risk: "low",
6040
+ target_bindings: { resource_id: { source: "param", param: "fromObjectType" } },
6041
+ version: "1.0.0"
6042
+ },
6043
+ {
6044
+ action: "hubspot.crm.associations.batchCreate",
6045
+ resource_type: "hubspot:association",
6046
+ required_relations: ["editor", "act_as"],
6047
+ required_scopes: ["crm.objects.contacts.write"],
6048
+ capability: "hubspot.crm.write",
6049
+ input_schema: {
6050
+ type: "object",
6051
+ properties: {
6052
+ fromObjectType: { type: "string" },
6053
+ toObjectType: { type: "string" },
6054
+ inputs: { type: "array", minItems: 1 }
6055
+ },
6056
+ required: ["fromObjectType", "toObjectType", "inputs"],
6057
+ additionalProperties: false
6058
+ },
6059
+ constraints: { rate_bucket: "hubspot.write" },
6060
+ effects: ["Create:CrmAssociation"],
6061
+ risk: "high",
6062
+ target_bindings: { resource_id: { source: "param", param: "fromObjectType" } },
6063
+ version: "1.0.0"
6064
+ },
6065
+ // ─── HubSpot Engagements (legacy v1: NOTE / TASK) ───
6066
+ {
6067
+ action: "hubspot.crm.engagements.get",
6068
+ resource_type: "hubspot:engagement",
6069
+ required_relations: ["viewer", "editor", "admin", "owner"],
6070
+ required_scopes: ["crm.objects.contacts.read"],
6071
+ capability: "hubspot.crm.read",
6072
+ input_schema: {
6073
+ type: "object",
6074
+ properties: { engagementId: { type: "string" } },
6075
+ required: ["engagementId"],
6076
+ additionalProperties: false
6077
+ },
6078
+ constraints: { rate_bucket: "hubspot.read" },
6079
+ effects: ["Read:CrmEngagement"],
6080
+ risk: "low",
6081
+ target_bindings: { resource_id: { source: "param", param: "engagementId" } },
6082
+ version: "1.0.0"
6083
+ },
6084
+ {
6085
+ action: "hubspot.crm.engagements.create",
6086
+ resource_type: "hubspot:engagement",
6087
+ required_relations: ["editor", "act_as"],
6088
+ required_scopes: ["crm.objects.contacts.write"],
6089
+ capability: "hubspot.crm.write",
6090
+ input_schema: {
6091
+ type: "object",
6092
+ properties: {
6093
+ type: { type: "string", enum: ["NOTE", "TASK"] },
6094
+ ownerId: { type: "number" },
6095
+ timestamp: { type: "number" },
6096
+ associations: { type: "object" },
6097
+ metadata: { type: "object" }
6098
+ },
6099
+ required: ["type", "ownerId", "metadata"],
6100
+ additionalProperties: false
6101
+ },
6102
+ constraints: { rate_bucket: "hubspot.write" },
6103
+ effects: ["Create:CrmEngagement"],
6104
+ risk: "high",
6105
+ // Bind to the engagement type (NOTE/TASK) as the container that exists at
6106
+ // call time, consistent with other create actions (see CREATE-binding note above).
6107
+ target_bindings: { resource_id: { source: "param", param: "type" } },
6108
+ version: "1.0.0"
6109
+ },
6110
+ {
6111
+ action: "hubspot.crm.engagements.update",
6112
+ resource_type: "hubspot:engagement",
6113
+ required_relations: ["editor", "act_as"],
6114
+ required_scopes: ["crm.objects.contacts.write"],
6115
+ capability: "hubspot.crm.write",
6116
+ input_schema: {
6117
+ type: "object",
6118
+ properties: {
6119
+ engagementId: { type: "string" },
6120
+ ownerId: { type: "number" },
6121
+ timestamp: { type: "number" },
6122
+ associations: { type: "object" },
6123
+ metadata: { type: "object" }
6124
+ },
6125
+ required: ["engagementId"],
6126
+ additionalProperties: false
6127
+ },
6128
+ constraints: { rate_bucket: "hubspot.write" },
6129
+ effects: ["Update:CrmEngagement"],
6130
+ risk: "high",
6131
+ target_bindings: { resource_id: { source: "param", param: "engagementId" } },
6132
+ version: "1.0.0"
6133
+ },
6134
+ // ─── HubSpot Workflows (automation v4 flows, read-only) ───
6135
+ {
6136
+ action: "hubspot.automation.workflows.list",
6137
+ resource_type: "hubspot:workflow",
6138
+ required_relations: ["viewer", "editor", "admin", "owner"],
6139
+ required_scopes: ["automation"],
6140
+ capability: "hubspot.automation.read",
6141
+ input_schema: {
6142
+ type: "object",
6143
+ properties: {
6144
+ after: { type: "string" },
6145
+ limit: { type: "integer", minimum: 1, maximum: 100 }
6146
+ },
6147
+ additionalProperties: false
6148
+ },
6149
+ constraints: { rate_bucket: "hubspot.read" },
6150
+ effects: ["Read:Workflow"],
6151
+ risk: "low",
6152
+ target_bindings: { resource_id: { source: "param", param: "flowId", required: false } },
6153
+ version: "1.0.0"
6154
+ },
6155
+ {
6156
+ action: "hubspot.automation.workflows.get",
6157
+ resource_type: "hubspot:workflow",
6158
+ required_relations: ["viewer", "editor", "admin", "owner"],
6159
+ required_scopes: ["automation"],
6160
+ capability: "hubspot.automation.read",
6161
+ input_schema: {
6162
+ type: "object",
6163
+ properties: { flowId: { type: "string" } },
6164
+ required: ["flowId"],
6165
+ additionalProperties: false
6166
+ },
6167
+ constraints: { rate_bucket: "hubspot.read" },
6168
+ effects: ["Read:Workflow"],
6169
+ risk: "low",
6170
+ target_bindings: { resource_id: { source: "param", param: "flowId" } },
6171
+ version: "1.0.0"
6172
+ },
6173
+ // ─── HubSpot Account / utility ───
6174
+ {
6175
+ action: "hubspot.account.userDetails.get",
6176
+ resource_type: "hubspot:account",
6177
+ required_relations: ["viewer", "editor", "admin", "owner"],
6178
+ required_scopes: ["oauth"],
6179
+ capability: "hubspot.account.read",
6180
+ input_schema: {
6181
+ type: "object",
6182
+ properties: {},
6183
+ additionalProperties: false
6184
+ },
6185
+ constraints: { rate_bucket: "hubspot.read" },
6186
+ effects: ["Read:Account"],
6187
+ risk: "low",
6188
+ target_bindings: { resource_id: { source: "param", param: "hubId", required: false } },
6189
+ version: "1.0.0"
6190
+ },
6191
+ {
6192
+ action: "hubspot.account.link.get",
6193
+ resource_type: "hubspot:account",
6194
+ required_relations: ["viewer", "editor", "admin", "owner"],
6195
+ // Pure URL builder; nominal base scope (always granted) keeps it
6196
+ // grantable and satisfies the registry's minItems:1 contract.
6197
+ required_scopes: ["oauth"],
6198
+ capability: "hubspot.account.read",
6199
+ input_schema: {
6200
+ type: "object",
6201
+ properties: {
6202
+ portalId: { type: "string" },
6203
+ uiDomain: { type: "string" },
6204
+ pageRequests: { type: "array", minItems: 1 }
6205
+ },
6206
+ required: ["portalId", "uiDomain", "pageRequests"],
6207
+ additionalProperties: false
6208
+ },
6209
+ constraints: { rate_bucket: "hubspot.read" },
6210
+ effects: ["Read:Account"],
6211
+ risk: "low",
6212
+ target_bindings: { resource_id: { source: "param", param: "portalId" } },
6213
+ version: "1.0.0"
6214
+ },
6215
+ // ─── Agent Inbox Actions (internal) ───
6216
+ // Inbox actions back the Agent Inbox MCP tools (task delegation between
6217
+ // agents/people). They are internal (no external OAuth provider), so they
6218
+ // carry a single nominal base scope `inbox` to satisfy the registry
6219
+ // meta-schema's `minItems: 1` (same pattern as hubspot.account.link.get).
6220
+ {
6221
+ action: "inbox.send",
6222
+ resource_type: "inbox:item",
6223
+ required_relations: ["editor", "act_as"],
6224
+ required_scopes: ["inbox"],
6225
+ capability: "inbox.write",
6226
+ input_schema: {
6227
+ type: "object",
6228
+ properties: {
6229
+ to: { type: "string", minLength: 1, description: "Recipient (user id / handle) the task request is sent to" },
6230
+ taskType: { type: "string", minLength: 1, description: "Type of task being requested" },
6231
+ payload: { type: "object", description: "Task-specific payload data" },
6232
+ message: { type: "string", description: "Optional human-readable message" }
6233
+ },
6234
+ required: ["to", "taskType", "payload"],
6235
+ additionalProperties: false
6236
+ },
6237
+ constraints: { rate_bucket: "inbox.write" },
6238
+ effects: ["Create:InboxItem"],
6239
+ risk: "high",
6240
+ target_bindings: {
6241
+ resource_id: { source: "param", param: "to" }
6242
+ },
6243
+ version: "1.0.0"
6244
+ },
6245
+ {
6246
+ action: "inbox.respond",
6247
+ resource_type: "inbox:item",
6248
+ required_relations: ["editor", "act_as"],
6249
+ required_scopes: ["inbox"],
6250
+ capability: "inbox.write",
6251
+ input_schema: {
6252
+ type: "object",
6253
+ properties: {
6254
+ id: { type: "string", minLength: 1, description: "Inbox item id being responded to" },
6255
+ action: { type: "string", enum: ["accept", "decline", "counter"], description: "Response action" },
6256
+ data: { type: "object", description: "Optional response data (e.g. counter-proposal)" }
6257
+ },
6258
+ required: ["id", "action"],
6259
+ additionalProperties: false
6260
+ },
6261
+ constraints: { rate_bucket: "inbox.write" },
6262
+ effects: ["Update:InboxItem"],
6263
+ // high (not medium): an agent-mediated response (MCP invoke) must always
6264
+ // go through human approval — the Phase 1 "always confirm" guarantee made
6265
+ // enforceable. target_bindings below binds the concrete inbox item id so
6266
+ // the high-risk approval has a specific resource constraint (the public
6267
+ // /scheduling/:token link flow does NOT go through this gate — it calls
6268
+ // InboxService.respond directly, system-key-signed).
6269
+ risk: "high",
6270
+ target_bindings: {
6271
+ resource_id: { source: "param", param: "id" }
6272
+ },
6273
+ version: "1.0.0"
6274
+ },
6275
+ {
6276
+ action: "inbox.check",
6277
+ resource_type: "inbox:item",
6278
+ required_relations: ["viewer", "editor", "admin", "owner"],
6279
+ required_scopes: ["inbox"],
6280
+ capability: "inbox.read",
6281
+ input_schema: {
6282
+ type: "object",
6283
+ properties: {
6284
+ types: { type: "array", items: { type: "string" }, description: "Filter by task types" },
6285
+ status: { type: "string", description: "Filter by item status" }
6286
+ },
6287
+ additionalProperties: false
6288
+ },
6289
+ constraints: { rate_bucket: "inbox.read" },
6290
+ effects: ["Read:InboxItem"],
6291
+ risk: "low",
6292
+ target_bindings: {
6293
+ resource_id: { source: "param", param: "id", required: false }
6294
+ },
6295
+ version: "1.0.0"
6296
+ },
6297
+ {
6298
+ action: "inbox.checkByToken",
6299
+ resource_type: "inbox:item",
6300
+ required_relations: ["viewer", "editor", "admin", "owner"],
6301
+ required_scopes: ["inbox"],
6302
+ capability: "inbox.read",
6303
+ input_schema: {
6304
+ type: "object",
6305
+ properties: {
6306
+ token: { type: "string", minLength: 1, description: "Opaque access token for a single inbox item" }
6307
+ },
6308
+ required: ["token"],
6309
+ additionalProperties: false
6310
+ },
6311
+ constraints: { rate_bucket: "inbox.read" },
6312
+ effects: ["Read:InboxItem"],
6313
+ risk: "low",
6314
+ target_bindings: {
6315
+ resource_id: { source: "param", param: "token" }
6316
+ },
6317
+ version: "1.0.0"
6318
+ },
6319
+ {
6320
+ action: "inbox.complete",
6321
+ resource_type: "inbox:item",
6322
+ required_relations: ["editor", "act_as"],
6323
+ required_scopes: ["inbox"],
6324
+ capability: "inbox.write",
6325
+ input_schema: {
6326
+ type: "object",
6327
+ properties: {
6328
+ id: { type: "string", minLength: 1, description: "Inbox item id being completed" },
6329
+ result: { type: "object", description: "Result payload for the completed task" }
6330
+ },
6331
+ required: ["id", "result"],
6332
+ additionalProperties: false
6333
+ },
6334
+ constraints: { rate_bucket: "inbox.write" },
6335
+ effects: ["Update:InboxItem"],
6336
+ risk: "low",
6337
+ target_bindings: {
6338
+ resource_id: { source: "param", param: "id" }
6339
+ },
6340
+ version: "1.0.0"
6341
+ },
6342
+ // ─── Scheduling Actions (internal) ───
6343
+ // scheduling.request is a meeting-time negotiation façade over inbox.send.
6344
+ // Candidate slots are computed LLM-side from the user calendar; the server
6345
+ // only validates them. Like the inbox actions it is internal (no external
6346
+ // OAuth provider), so it carries the single nominal base scope `inbox`.
6347
+ // Spec: docs/specs/2026-06-10-inbox-intent-routing-design.md §2.1
6348
+ {
6349
+ action: "scheduling.request",
6350
+ resource_type: "inbox:item",
6351
+ required_relations: ["editor", "act_as"],
6352
+ required_scopes: ["inbox"],
6353
+ capability: "inbox.write",
6354
+ input_schema: {
6355
+ type: "object",
6356
+ properties: {
6357
+ to: { type: "string", minLength: 1, description: "Counterpart (user id / email) to negotiate a meeting time with" },
6358
+ topic: { type: "string", minLength: 1, description: "Meeting topic shown to the counterpart" },
6359
+ durationMinutes: { type: "integer", minimum: 5, maximum: 480, description: "Meeting length in minutes" },
6360
+ candidates: {
6361
+ type: "array",
6362
+ minItems: 1,
6363
+ maxItems: 10,
6364
+ description: "Candidate slots computed by the agent from the user calendar (LLM-side computation; the server only validates)",
6365
+ items: {
6366
+ type: "object",
6367
+ properties: {
6368
+ start: { type: "string", description: "ISO 8601 start" },
6369
+ end: { type: "string", description: "ISO 8601 end" }
6370
+ },
6371
+ required: ["start", "end"],
6372
+ additionalProperties: false
6373
+ }
6374
+ },
6375
+ message: { type: "string", description: "Optional human-readable message" }
6376
+ },
6377
+ required: ["to", "topic", "durationMinutes", "candidates"],
6378
+ additionalProperties: false
6379
+ },
6380
+ constraints: { rate_bucket: "inbox.write" },
6381
+ effects: ["Create:InboxItem"],
6382
+ risk: "high",
6383
+ target_bindings: {
6384
+ resource_id: { source: "param", param: "to" }
6385
+ },
6386
+ version: "1.0.0"
5667
6387
  }
5668
6388
  ],
5669
6389
  capabilities: [
@@ -5732,10 +6452,140 @@ var ACTION_REGISTRY = {
5732
6452
  description: "Create, update, delete Jira issues, and manage issue links",
5733
6453
  includes: ["jira.issue.create", "jira.issue.update", "jira.issue.delete", "jira.comment.create", "jira.issue.transition", "jira.issuelink.create", "jira.issuelink.delete"],
5734
6454
  version: "1.0.0"
6455
+ },
6456
+ {
6457
+ capability: "inbox.write",
6458
+ description: "Send and respond to agent inbox tasks",
6459
+ includes: ["inbox.send", "inbox.respond", "inbox.complete", "scheduling.request"],
6460
+ version: "1.0.0"
6461
+ },
6462
+ {
6463
+ capability: "inbox.read",
6464
+ description: "Read agent inbox tasks",
6465
+ includes: ["inbox.check", "inbox.checkByToken"],
6466
+ version: "1.0.0"
5735
6467
  }
5736
6468
  ]
5737
6469
  };
5738
6470
 
6471
+ // src/registry/action-input-validator.ts
6472
+ var SCHEMA_INDEX = (() => {
6473
+ const map = /* @__PURE__ */ new Map();
6474
+ for (const a of ACTION_REGISTRY.actions) {
6475
+ if (a && typeof a.action === "string" && a.input_schema) {
6476
+ map.set(a.action, a.input_schema);
6477
+ }
6478
+ }
6479
+ return map;
6480
+ })();
6481
+ function describeExpectedShape(schema) {
6482
+ const props = schema.properties ?? {};
6483
+ const required = Array.isArray(schema.required) ? schema.required : [];
6484
+ const requiredSet = new Set(required);
6485
+ const parts = [];
6486
+ const orderedKeys = [
6487
+ ...required.filter((k) => k in props),
6488
+ ...Object.keys(props).filter((k) => !requiredSet.has(k))
6489
+ ];
6490
+ for (const key of orderedKeys) {
6491
+ const prop = props[key] || {};
6492
+ const optionalMark = requiredSet.has(key) ? "" : "?";
6493
+ const enumVals = Array.isArray(prop.enum) ? prop.enum : void 0;
6494
+ if (enumVals && enumVals.length > 0) {
6495
+ const rendered = enumVals.map((v) => typeof v === "string" ? `'${v}'` : String(v)).join(" | ");
6496
+ parts.push(`${key}${optionalMark}: ${rendered}`);
6497
+ } else {
6498
+ parts.push(`${key}${optionalMark}`);
6499
+ }
6500
+ }
6501
+ return `{ ${parts.join(", ")} }`;
6502
+ }
6503
+ function matchesType(value, type) {
6504
+ if (!type) return true;
6505
+ switch (type) {
6506
+ case "string":
6507
+ return typeof value === "string";
6508
+ case "integer":
6509
+ return typeof value === "number" && Number.isInteger(value);
6510
+ case "number":
6511
+ return typeof value === "number";
6512
+ case "boolean":
6513
+ return typeof value === "boolean";
6514
+ case "array":
6515
+ return Array.isArray(value);
6516
+ case "object":
6517
+ return typeof value === "object" && value !== null && !Array.isArray(value);
6518
+ default:
6519
+ return true;
6520
+ }
6521
+ }
6522
+ function validateActionInput(action, params) {
6523
+ const schema = SCHEMA_INDEX.get(action);
6524
+ if (!schema) {
6525
+ return { valid: true };
6526
+ }
6527
+ const props = schema.properties ?? {};
6528
+ const required = Array.isArray(schema.required) ? schema.required : [];
6529
+ const additionalProps = schema.additionalProperties;
6530
+ const safeParams = params && typeof params === "object" && !Array.isArray(params) ? params : {};
6531
+ const missing = [];
6532
+ const unknown = [];
6533
+ const enumErrors = [];
6534
+ const typeErrors = [];
6535
+ for (const key of required) {
6536
+ if (!(key in safeParams) || safeParams[key] === void 0 || safeParams[key] === null) {
6537
+ missing.push(key);
6538
+ }
6539
+ }
6540
+ if (additionalProps === false) {
6541
+ for (const key of Object.keys(safeParams)) {
6542
+ if (!(key in props)) {
6543
+ unknown.push(key);
6544
+ }
6545
+ }
6546
+ }
6547
+ for (const key of Object.keys(props)) {
6548
+ if (!(key in safeParams)) continue;
6549
+ const value = safeParams[key];
6550
+ if (value === void 0 || value === null) continue;
6551
+ const prop = props[key] || {};
6552
+ const enumVals = Array.isArray(prop.enum) ? prop.enum : void 0;
6553
+ if (enumVals && enumVals.length > 0) {
6554
+ if (!enumVals.includes(value)) {
6555
+ enumErrors.push(key);
6556
+ continue;
6557
+ }
6558
+ }
6559
+ if (!matchesType(value, prop.type)) {
6560
+ typeErrors.push(key);
6561
+ }
6562
+ }
6563
+ if (missing.length === 0 && unknown.length === 0 && enumErrors.length === 0 && typeErrors.length === 0) {
6564
+ return { valid: true };
6565
+ }
6566
+ const segments = [];
6567
+ if (missing.length > 0) {
6568
+ segments.push(`missing required parameter(s) [${missing.join(", ")}]`);
6569
+ }
6570
+ if (unknown.length > 0) {
6571
+ segments.push(`unknown parameter(s) [${unknown.join(", ")}]`);
6572
+ }
6573
+ if (enumErrors.length > 0) {
6574
+ const details = enumErrors.map((key) => {
6575
+ const enumVals = props[key]?.enum || [];
6576
+ const rendered = enumVals.map((v) => typeof v === "string" ? `'${v}'` : String(v)).join(" | ");
6577
+ return `${key} (allowed: ${rendered})`;
6578
+ }).join(", ");
6579
+ segments.push(`invalid value for enum parameter(s) [${details}]`);
6580
+ }
6581
+ if (typeErrors.length > 0) {
6582
+ const details = typeErrors.map((key) => `${key} (expected ${props[key]?.type})`).join(", ");
6583
+ segments.push(`wrong type for parameter(s) [${details}]`);
6584
+ }
6585
+ const message = `${action}: ${segments.join("; ")}. Expected shape: ${describeExpectedShape(schema)}`;
6586
+ return { valid: false, errors: [message] };
6587
+ }
6588
+
5739
6589
  // src/registry/resource-types.ts
5740
6590
  var RESOURCE_TYPES = {
5741
6591
  // Slack
@@ -5757,6 +6607,14 @@ var RESOURCE_TYPES = {
5757
6607
  JIRA_BOARD: "jira:board",
5758
6608
  JIRA_ISSUE: "jira:issue",
5759
6609
  JIRA_SPRINT: "jira:sprint",
6610
+ // HubSpot
6611
+ HUBSPOT_OBJECT: "hubspot:object",
6612
+ HUBSPOT_PROPERTY: "hubspot:property",
6613
+ HUBSPOT_SCHEMA: "hubspot:schema",
6614
+ HUBSPOT_ASSOCIATION: "hubspot:association",
6615
+ HUBSPOT_ENGAGEMENT: "hubspot:engagement",
6616
+ HUBSPOT_WORKFLOW: "hubspot:workflow",
6617
+ HUBSPOT_ACCOUNT: "hubspot:account",
5760
6618
  // OS (local)
5761
6619
  OS_SECRET: "os:secret",
5762
6620
  OS_PROCESS: "os:process",
@@ -5783,6 +6641,13 @@ var LEGACY_RESOURCE_TYPE_MAP = {
5783
6641
  "jira:board": RESOURCE_TYPES.JIRA_BOARD,
5784
6642
  "jira:issue": RESOURCE_TYPES.JIRA_ISSUE,
5785
6643
  "jira:sprint": RESOURCE_TYPES.JIRA_SPRINT,
6644
+ "hubspot:object": RESOURCE_TYPES.HUBSPOT_OBJECT,
6645
+ "hubspot:property": RESOURCE_TYPES.HUBSPOT_PROPERTY,
6646
+ "hubspot:schema": RESOURCE_TYPES.HUBSPOT_SCHEMA,
6647
+ "hubspot:association": RESOURCE_TYPES.HUBSPOT_ASSOCIATION,
6648
+ "hubspot:engagement": RESOURCE_TYPES.HUBSPOT_ENGAGEMENT,
6649
+ "hubspot:workflow": RESOURCE_TYPES.HUBSPOT_WORKFLOW,
6650
+ "hubspot:account": RESOURCE_TYPES.HUBSPOT_ACCOUNT,
5786
6651
  "os:secret": RESOURCE_TYPES.OS_SECRET,
5787
6652
  "os:process": RESOURCE_TYPES.OS_PROCESS,
5788
6653
  // Legacy formats with old provider prefixes
@@ -6133,6 +6998,56 @@ var ACTION_DISPLAY_CONFIGS = {
6133
6998
  displayFields: [
6134
6999
  { key: "linkId", label: "Link" }
6135
7000
  ]
7001
+ },
7002
+ // ─── Agent Inbox ───
7003
+ "inbox.send": {
7004
+ summaryTemplate: (p) => {
7005
+ const parts = [];
7006
+ if (p.to) parts.push(`To: ${p.to}`);
7007
+ if (p.taskType) parts.push(`Task: ${p.taskType}`);
7008
+ return parts.join(", ");
7009
+ },
7010
+ displayFields: [
7011
+ { key: "to", label: "To" },
7012
+ { key: "taskType", label: "Task" },
7013
+ { key: "message", label: "Message" }
7014
+ ]
7015
+ },
7016
+ "inbox.respond": {
7017
+ summaryTemplate: (p) => {
7018
+ const parts = [];
7019
+ if (p.action) parts.push(String(p.action));
7020
+ if (p.id) parts.push(`#${p.id}`);
7021
+ return parts.join(" ");
7022
+ },
7023
+ displayFields: [
7024
+ { key: "id", label: "Item" },
7025
+ { key: "action", label: "Action" }
7026
+ ]
7027
+ },
7028
+ "inbox.check": {
7029
+ summaryTemplate: (p) => {
7030
+ const parts = [];
7031
+ if (p.status) parts.push(`Status: ${p.status}`);
7032
+ if (Array.isArray(p.types) && p.types.length > 0) parts.push(`Types: ${p.types.join(", ")}`);
7033
+ return parts.join(", ");
7034
+ },
7035
+ displayFields: [
7036
+ { key: "status", label: "Status" },
7037
+ { key: "types", label: "Types" }
7038
+ ]
7039
+ },
7040
+ "inbox.checkByToken": {
7041
+ summaryTemplate: (p) => p.token ? `Token: ${p.token}` : "",
7042
+ displayFields: [
7043
+ { key: "token", label: "Token" }
7044
+ ]
7045
+ },
7046
+ "inbox.complete": {
7047
+ summaryTemplate: (p) => p.id ? `Complete #${p.id}` : "",
7048
+ displayFields: [
7049
+ { key: "id", label: "Item" }
7050
+ ]
6136
7051
  }
6137
7052
  };
6138
7053
  function truncate(text, maxLength) {
@@ -6836,6 +7751,7 @@ var version = "0.0.1";
6836
7751
  sha256Hex,
6837
7752
  signJWT,
6838
7753
  signRequest,
7754
+ validateActionInput,
6839
7755
  validateRegistryObject,
6840
7756
  vcStatusToCredentialStatus,
6841
7757
  verifyJWT,